@@ -39,7 +39,8 @@ def serializable_hash(options = nil)
39
39
@hash [ :data ] = attributes_for ( serializer , options )
40
40
relationships = relationships_for ( serializer )
41
41
@hash [ :data ] [ :relationships ] = relationships if relationships . any?
42
- add_included_relationships ( serializer )
42
+ included = included_for ( serializer )
43
+ @hash [ :included ] = included if included . any?
43
44
end
44
45
@hash
45
46
end
@@ -116,38 +117,35 @@ def relationships_for(serializer)
116
117
relationships
117
118
end
118
119
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
125
122
end
126
123
127
- def add_included ( resource_name , serializer , parent = nil )
124
+ def _included_for ( resource_name , serializer , parent = nil )
128
125
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
131
127
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
146
138
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
150
147
end
148
+ result
151
149
end
152
150
end
153
151
0 commit comments