Skip to content

Commit 955f4f2

Browse files
sirdharmashishirmk
authored andcommitted
Add support for polymorphic includes
1 parent 3973b31 commit 955f4f2

3 files changed

Lines changed: 26 additions & 7 deletions

File tree

lib/fast_jsonapi/object_serializer.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,7 @@ def validate_includes!(includes)
295295
relationships_to_serialize = klass.relationships_to_serialize || {}
296296
relationship_to_include = relationships_to_serialize[parsed_include]
297297
raise ArgumentError, "#{parsed_include} is not specified as a relationship on #{klass.name}" unless relationship_to_include
298-
raise NotImplementedError if relationship_to_include.polymorphic.is_a?(Hash)
299-
klass = relationship_to_include.serializer.to_s.constantize
298+
klass = relationship_to_include.serializer.to_s.constantize unless relationship_to_include.polymorphic.is_a?(Hash)
300299
end
301300
end
302301
end

lib/fast_jsonapi/serialization_core.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,22 @@ def get_included_records(record, includes_list, known_included_objects, fieldset
119119
next unless relationships_to_serialize && relationships_to_serialize[item]
120120
relationship_item = relationships_to_serialize[item]
121121
next unless relationship_item.include_relationship?(record, params)
122-
raise NotImplementedError if relationship_item.polymorphic.is_a?(Hash)
123-
record_type = relationship_item.record_type
124-
serializer = relationship_item.serializer.to_s.constantize
122+
unless relationship_item.polymorphic.is_a?(Hash)
123+
record_type = relationship_item.record_type
124+
serializer = relationship_item.serializer.to_s.constantize
125+
end
125126
relationship_type = relationship_item.relationship_type
126127

127128
included_objects = relationship_item.fetch_associated_object(record, params)
128129
next if included_objects.blank?
129130
included_objects = [included_objects] unless relationship_type == :has_many
130131

131132
included_objects.each do |inc_obj|
133+
if relationship_item.polymorphic.is_a?(Hash)
134+
record_type = inc_obj.class.name.demodulize.underscore
135+
serializer = self.compute_serializer_name(inc_obj.class.name.demodulize.to_sym).to_s.constantize
136+
end
137+
132138
if remaining_items(items)
133139
serializer_records = serializer.get_included_records(inc_obj, remaining_items(items), known_included_objects, fieldsets, params)
134140
included_records.concat(serializer_records) unless serializer_records.empty?

spec/lib/object_serializer_spec.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,10 +278,24 @@ def advertising_campaign
278278
end
279279
end
280280

281-
it 'polymorphic throws an error that polymorphic is not supported' do
281+
it 'polymorphic has_many: returns correct nested includes when serializable_hash is called' do
282282
options = {}
283283
options[:include] = [:groupees]
284-
expect(-> { GroupSerializer.new([group], options)}).to raise_error(NotImplementedError)
284+
285+
serializable_hash = GroupSerializer.new([group], options).serializable_hash
286+
287+
persons_serialized = serializable_hash[:included].find_all { |included| included[:type] == :person }.map { |included| included[:id].to_i }
288+
groups_serialized = serializable_hash[:included].find_all { |included| included[:type] == :group }.map { |included| included[:id].to_i }
289+
290+
persons = group.groupees.find_all { |groupee| groupee.is_a?(Person) }
291+
persons.each do |person|
292+
expect(persons_serialized).to include(person.id)
293+
end
294+
295+
groups = group.groupees.find_all { |groupee| groupee.is_a?(Group) }
296+
groups.each do |group|
297+
expect(groups_serialized).to include(group.id)
298+
end
285299
end
286300
end
287301

0 commit comments

Comments
 (0)