Skip to content

Commit e7437d4

Browse files
committed
Prevent creation of unnecessary fieldset(mirror changes from rails-api#2370)
1 parent 9fa9373 commit e7437d4

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

lib/active_model_serializers/adapter/attributes.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Adapter
55
class Attributes < Base
66
def initialize(*)
77
super
8-
instance_options[:fieldset] ||= ActiveModel::Serializer::Fieldset.new(fields_to_fieldset(instance_options.delete(:fields)))
8+
instance_options[:fieldset] ||= fields_to_fieldset(instance_options.delete(:fields))
99
end
1010

1111
def serializable_hash(options = nil)
@@ -29,7 +29,7 @@ def fields_to_fieldset(fields)
2929
else fail ArgumentError, "Unknown conversion of fields to fieldset: '#{field.inspect}' in '#{fields.inspect}'"
3030
end
3131
end
32-
relationship_fields.merge!(serializer.json_key.to_sym => resource_fields)
32+
ActiveModel::Serializer::Fieldset.new(relationship_fields.merge!(serializer.json_key.to_sym => resource_fields))
3333
end
3434
end
3535
end

lib/active_model_serializers/adapter/json_api.rb

+10-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def self.fragment_cache(cached_hash, non_cached_hash, root = true)
5353
def initialize(serializer, options = {})
5454
super
5555
@include_directive = JSONAPI::IncludeDirective.new(options[:include], allow_wildcard: true)
56-
@fieldset = options[:fieldset] || ActiveModel::Serializer::Fieldset.new(options.delete(:fields))
56+
@fieldset = options[:fieldset] || fields_to_fieldset(options.delete(:fields))
5757
end
5858

5959
# {http://jsonapi.org/format/#crud Requests are transactional, i.e. success or failure}
@@ -335,6 +335,7 @@ def resource_object_for(serializer, include_slice = {})
335335
resource_object
336336
end
337337

338+
# rubocop:disable Metrics/CyclomaticComplexity
338339
def data_for(serializer, include_slice)
339340
data = serializer.fetch(self) do
340341
resource_object = ResourceIdentifier.new(serializer, instance_options).as_json
@@ -348,11 +349,12 @@ def data_for(serializer, include_slice)
348349
data.tap do |resource_object|
349350
next if resource_object.nil?
350351
# NOTE(BF): the attributes are cached above, separately from the relationships, below.
351-
requested_associations = fieldset.fields_for(resource_object[:type]) || '*'
352+
requested_associations = (fieldset && fieldset.fields_for(resource_object[:type])) || '*'
352353
relationships = relationships_for(serializer, requested_associations, include_slice)
353354
resource_object[:relationships] = relationships if relationships.any?
354355
end
355356
end
357+
# rubocop:enable Metrics/CyclomaticComplexity
356358

357359
# {http://jsonapi.org/format/#document-resource-object-relationships Document Resource Object Relationship}
358360
# relationships
@@ -529,6 +531,12 @@ def pagination_links_for(serializer)
529531
def meta_for(serializer)
530532
Meta.new(serializer).as_json
531533
end
534+
535+
def fields_to_fieldset(fields)
536+
return fields if fields.nil?
537+
538+
ActiveModel::Serializer::Fieldset.new(fields)
539+
end
532540
end
533541
end
534542
end

0 commit comments

Comments
 (0)