From 75fed799526185214f57ea38aa63d04f6dcc5be1 Mon Sep 17 00:00:00 2001 From: Mike Pastore Date: Wed, 14 Oct 2015 15:20:55 -0500 Subject: [PATCH 1/3] Lazily evaluate relationship objects only when included --- lib/jsonapi-serializers/serializer.rb | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/jsonapi-serializers/serializer.rb b/lib/jsonapi-serializers/serializer.rb index 98091e8..f7117f0 100644 --- a/lib/jsonapi-serializers/serializer.rb +++ b/lib/jsonapi-serializers/serializer.rb @@ -91,7 +91,7 @@ def links def relationships data = {} # Merge in data for has_one relationships. - has_one_relationships.each do |attribute_name, object| + has_one_relationships.each do |attribute_name, attr_data| formatted_attribute_name = format_name(attribute_name) data[formatted_attribute_name] = {} @@ -102,6 +102,7 @@ def relationships data[formatted_attribute_name]['links']['related'] = links_related if links_related if @_include_linkages.include?(formatted_attribute_name) + object = has_one_relationship(attribute_name, attr_data) if object.nil? # Spec: Resource linkage MUST be represented as one of the following: # - null for empty to-one relationships. @@ -120,7 +121,7 @@ def relationships end # Merge in data for has_many relationships. - has_many_relationships.each do |attribute_name, objects| + has_many_relationships.each do |attribute_name, attr_data| formatted_attribute_name = format_name(attribute_name) data[formatted_attribute_name] = {} @@ -136,7 +137,7 @@ def relationships # http://jsonapi.org/format/#document-structure-resource-relationships if @_include_linkages.include?(formatted_attribute_name) data[formatted_attribute_name].merge!({'data' => []}) - objects = objects || [] + objects = has_many_relationship(attribute_name, attr_data) || [] objects.each do |obj| related_object_serializer = JSONAPI::Serializer.find_serializer(obj) data[formatted_attribute_name]['data'] << { @@ -165,21 +166,29 @@ def has_one_relationships data = {} self.class.to_one_associations.each do |attribute_name, attr_data| next if !should_include_attr?(attr_data[:options][:if], attr_data[:options][:unless]) - data[attribute_name] = evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block]) + data[attribute_name] = attr_data end data end + def has_one_relationship(attribute_name, attr_data) + evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block]) + end + def has_many_relationships return {} if self.class.to_many_associations.nil? data = {} self.class.to_many_associations.each do |attribute_name, attr_data| next if !should_include_attr?(attr_data[:options][:if], attr_data[:options][:unless]) - data[attribute_name] = evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block]) + data[attribute_name] = attr_data end data end + def has_many_relationship(attribute_name, attr_data) + evaluate_attr_or_block(attribute_name, attr_data[:attr_or_block]) + end + def should_include_attr?(if_method_name, unless_method_name) # Allow "if: :show_title?" and "unless: :hide_title?" attribute options. show_attr = true @@ -358,11 +367,13 @@ def self.find_recursive_relationships(root_object, root_inclusion_tree, results) is_valid_attr = false if serializer.has_one_relationships.has_key?(unformatted_attr_name) is_valid_attr = true - object = serializer.has_one_relationships[unformatted_attr_name] + attr_data = serializer.has_one_relationships[unformatted_attr_name] + object = serializer.has_one_relationship(unformatted_attr_name, attr_data) elsif serializer.has_many_relationships.has_key?(unformatted_attr_name) is_valid_attr = true is_collection = true - object = serializer.has_many_relationships[unformatted_attr_name] + attr_data = serializer.has_many_relationships[unformatted_attr_name] + object = serializer.has_many_relationship(unformatted_attr_name, attr_data) end if !is_valid_attr raise JSONAPI::Serializer::InvalidIncludeError.new( From 7d575cc066877669e6de9109509605a7f5253632 Mon Sep 17 00:00:00 2001 From: Mike Pastore Date: Fri, 13 Nov 2015 13:19:05 -0600 Subject: [PATCH 2/3] Narrow scope of ActiveSupport inclusion --- lib/jsonapi-serializers/serializer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsonapi-serializers/serializer.rb b/lib/jsonapi-serializers/serializer.rb index f7117f0..d23ad6e 100644 --- a/lib/jsonapi-serializers/serializer.rb +++ b/lib/jsonapi-serializers/serializer.rb @@ -1,5 +1,5 @@ require 'set' -require 'active_support/inflector' +require 'active_support/inflector/methods' module JSONAPI module Serializer From 45bc1a4bef5456ba558952f85af8482a4d76821d Mon Sep 17 00:00:00 2001 From: Mike Pastore Date: Fri, 13 Nov 2015 13:21:36 -0600 Subject: [PATCH 3/3] Revert "Narrow scope of ActiveSupport inclusion" This reverts commit 7d575cc066877669e6de9109509605a7f5253632. --- lib/jsonapi-serializers/serializer.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/jsonapi-serializers/serializer.rb b/lib/jsonapi-serializers/serializer.rb index d23ad6e..f7117f0 100644 --- a/lib/jsonapi-serializers/serializer.rb +++ b/lib/jsonapi-serializers/serializer.rb @@ -1,5 +1,5 @@ require 'set' -require 'active_support/inflector/methods' +require 'active_support/inflector' module JSONAPI module Serializer