Skip to content

Commit 4550a26

Browse files
committed
Prevent infinite include loops in JsonApi + improve perfs.
1 parent 379c800 commit 4550a26

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -120,33 +120,33 @@ def relationships_for(serializer)
120120
end
121121

122122
def included_for(serializer)
123-
included_associations = serializer.expand_includes(@included)
124-
included = included_associations.flat_map do |association, assoc_includes|
125-
_included_for(association.serializer, assoc_includes)
123+
included = []
124+
included_associations = expand_includes(@included, serializer.associations)
125+
included_associations.each do |association, assoc_includes|
126+
_included_for(included, association.serializer, assoc_includes)
126127
end
127128

128-
included.uniq
129+
included
129130
end
130131

131-
def _included_for(serializer, includes)
132+
def _included_for(included, serializer, includes)
132133
if serializer.respond_to?(:each)
133-
serializer.flat_map { |s| _included_for(s, includes) }.uniq
134+
serializer.each { |s| _included_for(included, s, includes) }
134135
else
135-
return [] unless serializer && serializer.object
136+
return unless serializer && serializer.object
136137

137138
primary_data = primary_data_for(serializer, @options)
138139
relationships = relationships_for(serializer)
139140
primary_data[:relationships] = relationships if relationships.any?
140141

141-
included = [primary_data]
142+
return if included.include?(primary_data)
143+
144+
included.push(primary_data)
142145

143146
included_associations = serializer.expand_includes(includes)
144147
included_associations.each do |association, assoc_includes|
145-
included.concat(_included_for(association.serializer, assoc_includes))
146-
included.uniq!
148+
_included_for(included, association.serializer, assoc_includes)
147149
end
148-
149-
included
150150
end
151151
end
152152

0 commit comments

Comments
 (0)