@@ -39,7 +39,8 @@ def serializable_hash(options = nil)
3939 @hash [ :data ] = attributes_for ( serializer , options )
4040 relationships = relationships_for ( serializer )
4141 @hash [ :data ] [ :relationships ] = relationships if relationships . any?
42- add_included_relationships ( serializer )
42+ included = included_for ( serializer )
43+ @hash [ :included ] = included if included . any?
4344 end
4445 @hash
4546 end
@@ -116,38 +117,35 @@ def relationships_for(serializer)
116117 relationships
117118 end
118119
119- def add_included_relationships ( serializer )
120- serializer . associations . each do |association |
121- Array ( association . serializer ) . each do |assoc_serializer |
122- add_included ( association . key , assoc_serializer )
123- end
124- end
120+ def included_for ( serializer )
121+ serializer . associations . flat_map { |assoc | _included_for ( assoc . key , assoc . serializer ) } . uniq
125122 end
126123
127- def add_included ( resource_name , serializer , parent = nil )
124+ def _included_for ( resource_name , serializer , parent = nil )
128125 if serializer . respond_to? ( :each )
129- serializer . each { |s | add_included ( resource_name , s , parent ) }
130- return
126+ serializer . flat_map { |s | _included_for ( resource_name , s , parent ) } . uniq
131127 else
132- return unless serializer . object
133- end
134-
135- resource_path = [ parent , resource_name ] . compact . join ( '.' )
136-
137- if include_assoc? ( resource_path )
138- @hash [ :included ] ||= [ ]
139-
140- attrs = attributes_for ( serializer , @options )
141- relationships = relationships_for ( serializer )
142- attrs [ :relationships ] = relationships if relationships . any?
143-
144- @hash [ :included ] . push ( attrs ) unless @hash [ :included ] . include? ( attrs )
145- end
128+ result = [ ]
129+ if serializer && serializer . object
130+ resource_path = [ parent , resource_name ] . compact . join ( '.' )
131+
132+ if include_assoc? ( resource_path )
133+ attrs = attributes_for ( serializer , @options )
134+ relationships = relationships_for ( serializer )
135+ attrs [ :relationships ] = relationships if relationships . any?
136+ result . push ( attrs )
137+ end
146138
147- if include_nested_assoc? ( resource_path )
148- serializer . associations . each do |association |
149- add_included ( association . key , association . serializer , resource_path ) if association . serializer
139+ if include_nested_assoc? ( resource_path )
140+ serializer . associations . each do |association |
141+ if association . serializer
142+ result . concat ( _included_for ( association . key , association . serializer , resource_path ) )
143+ result . uniq!
144+ end
145+ end
146+ end
150147 end
148+ result
151149 end
152150 end
153151
0 commit comments