Skip to content

Commit aa20faa

Browse files
committed
Prevent creation of unnecessary fieldset(mirror changes from #2370)
Co-authored-by: https://github.com/abcang
1 parent 9fa9373 commit aa20faa

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

lib/active_model/serializer.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,10 @@ def associations(include_directive = ActiveModelSerializers.default_include_dire
366366
def serializable_hash(adapter_options = nil, options = {}, adapter_instance = self.class.serialization_adapter_instance)
367367
adapter_options ||= {}
368368
options[:include_directive] ||= ActiveModel::Serializer.include_directive_from_options(adapter_options)
369-
if (fieldset = adapter_options[:fieldset])
370-
options[:fields] = fieldset.fields_for(json_key)
371-
end
369+
370+
fieldset = adapter_options[:fieldset]
371+
options[:fields] = fieldset.fields_for(json_key) if fieldset
372+
372373
resource = attributes_hash(adapter_options, options, adapter_instance)
373374
relationships = associations_hash(adapter_options, options, adapter_instance)
374375
resource.merge(relationships)

lib/active_model_serializers/adapter/attributes.rb

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ 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+
9+
fields = instance_options.delete(:fields)
10+
fieldset = fields_to_fieldset(fields)
11+
instance_options[:fieldset] = ActiveModel::Serializer::Fieldset.new(fieldset) if fieldset
912
end
1013

1114
def serializable_hash(options = nil)
@@ -19,16 +22,19 @@ def serializable_hash(options = nil)
1922
private
2023

2124
def fields_to_fieldset(fields)
22-
return fields if fields.nil?
25+
return if fields.nil?
26+
2327
resource_fields = []
2428
relationship_fields = {}
29+
2530
fields.each do |field|
2631
case field
2732
when Symbol, String then resource_fields << field
2833
when Hash then relationship_fields.merge!(field)
2934
else fail ArgumentError, "Unknown conversion of fields to fieldset: '#{field.inspect}' in '#{fields.inspect}'"
3035
end
3136
end
37+
3238
relationship_fields.merge!(serializer.json_key.to_sym => resource_fields)
3339
end
3440
end

lib/active_model_serializers/adapter/json_api.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ 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+
option_fields = options.delete(:fields)
57+
@fieldset = ActiveModel::Serializer::Fieldset.new(option_fields) if option_fields
5758
end
5859

5960
# {http://jsonapi.org/format/#crud Requests are transactional, i.e. success or failure}
@@ -348,7 +349,8 @@ 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_fields = fieldset && fieldset.fields_for(resource_object[:type])
353+
requested_associations = requested_fields || '*'
352354
relationships = relationships_for(serializer, requested_associations, include_slice)
353355
resource_object[:relationships] = relationships if relationships.any?
354356
end

0 commit comments

Comments
 (0)