From 7ab98a92e31b8b6cc6bca072950bc4659d318293 Mon Sep 17 00:00:00 2001 From: abcang Date: Mon, 6 Jan 2020 13:36:38 +0900 Subject: [PATCH] Prevent creation of unnecessary fieldset --- lib/active_model_serializers/adapter/attributes.rb | 4 ++-- lib/active_model_serializers/adapter/json_api.rb | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/active_model_serializers/adapter/attributes.rb b/lib/active_model_serializers/adapter/attributes.rb index 3372e2be8..8964f0bc8 100644 --- a/lib/active_model_serializers/adapter/attributes.rb +++ b/lib/active_model_serializers/adapter/attributes.rb @@ -5,7 +5,7 @@ module Adapter class Attributes < Base def initialize(*) super - instance_options[:fieldset] ||= ActiveModel::Serializer::Fieldset.new(fields_to_fieldset(instance_options.delete(:fields))) + instance_options[:fieldset] ||= fields_to_fieldset(instance_options.delete(:fields)) end def serializable_hash(options = nil) @@ -29,7 +29,7 @@ def fields_to_fieldset(fields) else fail ArgumentError, "Unknown conversion of fields to fieldset: '#{field.inspect}' in '#{fields.inspect}'" end end - relationship_fields.merge!(serializer.json_key.to_sym => resource_fields) + ActiveModel::Serializer::Fieldset.new(relationship_fields.merge!(serializer.json_key.to_sym => resource_fields)) end end end diff --git a/lib/active_model_serializers/adapter/json_api.rb b/lib/active_model_serializers/adapter/json_api.rb index 83c75ea82..9570483ef 100644 --- a/lib/active_model_serializers/adapter/json_api.rb +++ b/lib/active_model_serializers/adapter/json_api.rb @@ -53,7 +53,7 @@ def self.fragment_cache(cached_hash, non_cached_hash, root = true) def initialize(serializer, options = {}) super @include_directive = JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true) - @fieldset = options[:fieldset] || ActiveModel::Serializer::Fieldset.new(options.delete(:fields)) + @fieldset = options[:fieldset] || fields_to_fieldset(options.delete(:fields)) end # {http://jsonapi.org/format/#crud Requests are transactional, i.e. success or failure} @@ -335,6 +335,7 @@ def resource_object_for(serializer, include_slice = {}) resource_object end + # rubocop:disable Metrics/CyclomaticComplexity def data_for(serializer, include_slice) data = serializer.fetch(self) do resource_object = ResourceIdentifier.new(serializer, instance_options).as_json @@ -348,11 +349,12 @@ def data_for(serializer, include_slice) data.tap do |resource_object| next if resource_object.nil? # NOTE(BF): the attributes are cached above, separately from the relationships, below. - requested_associations = fieldset.fields_for(resource_object[:type]) || '*' + requested_associations = (fieldset && fieldset.fields_for(resource_object[:type])) || '*' relationships = relationships_for(serializer, requested_associations, include_slice) resource_object[:relationships] = relationships if relationships.any? end end + # rubocop:enable Metrics/CyclomaticComplexity # {http://jsonapi.org/format/#document-resource-object-relationships Document Resource Object Relationship} # relationships @@ -529,6 +531,12 @@ def pagination_links_for(serializer) def meta_for(serializer) Meta.new(serializer).as_json end + + def fields_to_fieldset(fields) + return fields if fields.nil? + + ActiveModel::Serializer::Fieldset.new(fields) + end end end end