Skip to content

Commit ea5ea72

Browse files
committed
Serializers should know how to serializer themselves
1 parent c3db0d2 commit ea5ea72

File tree

2 files changed

+35
-32
lines changed

2 files changed

+35
-32
lines changed

lib/active_model/serializer.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,37 @@ def read_attribute_for_serialization(attr)
185185
end
186186
end
187187

188+
def serialize(options, adapter_options, adapter_instance, include_tree)
189+
cached_attributes(options[:fields], adapter_instance)
190+
.merge(cached_relationships(adapter_options, adapter_instance, include_tree))
191+
end
192+
193+
def cached_relationships(adapter_options, adapter_instance, include_tree)
194+
relationships = {}
195+
associations(include_tree).each do |association|
196+
relationships[association.key] =
197+
if association.options[:virtual_value]
198+
association.options[:virtual_value]
199+
elsif association.serializer && association.serializer.object
200+
association_serializer = association.serializer
201+
association_options = adapter_options.merge(include: include_tree[association.key])
202+
association_include_tree = ActiveModel::Serializer::IncludeTree.from_include_args(association_options[:include] || '*')
203+
if association_serializer.respond_to?(:each)
204+
association_options[:cached_attributes] ||= ActiveModel::Serializer.cache_read_multi(association_serializer, adapter_instance, association_include_tree)
205+
association_serializer.map do |serializer|
206+
serializer.serialize(association_options, adapter_options, adapter_instance, association_include_tree)
207+
end
208+
else
209+
association_serializer.serialize(association_options, adapter_options, adapter_instance, association_include_tree)
210+
end
211+
else
212+
nil
213+
end
214+
end
215+
216+
relationships
217+
end
218+
188219
protected
189220

190221
attr_accessor :instance_options

lib/active_model_serializers/adapter/attributes.rb

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,13 @@ def serializable_hash(options = nil)
1010
options = serialization_options(options)
1111

1212
if serializer.respond_to?(:each)
13-
serializable_hash_for_collection(options)
13+
serializer.map do |element|
14+
element.serialize(options, instance_options, self, @include_tree)
15+
end
1416
else
15-
serializable_hash_for_single_resource(options)
17+
serializer.serialize(options, instance_options, self, @include_tree)
1618
end
1719
end
18-
19-
private
20-
21-
def serializable_hash_for_collection(options)
22-
instance_options[:cached_attributes] ||= ActiveModel::Serializer.cache_read_multi(serializer, self, @include_tree)
23-
serializer.map { |s| Attributes.new(s, instance_options).serializable_hash(options) }
24-
end
25-
26-
def serializable_hash_for_single_resource(options)
27-
resource = serializer.cached_attributes(options[:fields], self)
28-
relationships = resource_relationships(options)
29-
resource.merge(relationships)
30-
end
31-
32-
def resource_relationships(options)
33-
relationships = {}
34-
serializer.associations(@include_tree).each do |association|
35-
relationships[association.key] ||= relationship_value_for(association, options)
36-
end
37-
38-
relationships
39-
end
40-
41-
def relationship_value_for(association, options)
42-
return association.options[:virtual_value] if association.options[:virtual_value]
43-
return unless association.serializer && association.serializer.object
44-
45-
opts = instance_options.merge(include: @include_tree[association.key])
46-
Attributes.new(association.serializer, opts).serializable_hash(options)
47-
end
4820
end
4921
end
5022
end

0 commit comments

Comments
 (0)