From 955f4f234d0e6fa768c5457839d5d39d04bad26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pradel?= Date: Thu, 23 Aug 2018 16:58:39 -0700 Subject: [PATCH] Add support for polymorphic includes --- lib/fast_jsonapi/object_serializer.rb | 3 +-- lib/fast_jsonapi/serialization_core.rb | 12 +++++++++--- spec/lib/object_serializer_spec.rb | 18 ++++++++++++++++-- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/fast_jsonapi/object_serializer.rb b/lib/fast_jsonapi/object_serializer.rb index afab577..26a4f95 100644 --- a/lib/fast_jsonapi/object_serializer.rb +++ b/lib/fast_jsonapi/object_serializer.rb @@ -295,8 +295,7 @@ module FastJsonapi relationships_to_serialize = klass.relationships_to_serialize || {} relationship_to_include = relationships_to_serialize[parsed_include] raise ArgumentError, "#{parsed_include} is not specified as a relationship on #{klass.name}" unless relationship_to_include - raise NotImplementedError if relationship_to_include.polymorphic.is_a?(Hash) - klass = relationship_to_include.serializer.to_s.constantize + klass = relationship_to_include.serializer.to_s.constantize unless relationship_to_include.polymorphic.is_a?(Hash) end end end diff --git a/lib/fast_jsonapi/serialization_core.rb b/lib/fast_jsonapi/serialization_core.rb index e64bf1a..a456b21 100644 --- a/lib/fast_jsonapi/serialization_core.rb +++ b/lib/fast_jsonapi/serialization_core.rb @@ -119,9 +119,10 @@ module FastJsonapi next unless relationships_to_serialize && relationships_to_serialize[item] relationship_item = relationships_to_serialize[item] next unless relationship_item.include_relationship?(record, params) - raise NotImplementedError if relationship_item.polymorphic.is_a?(Hash) - record_type = relationship_item.record_type - serializer = relationship_item.serializer.to_s.constantize + unless relationship_item.polymorphic.is_a?(Hash) + record_type = relationship_item.record_type + serializer = relationship_item.serializer.to_s.constantize + end relationship_type = relationship_item.relationship_type included_objects = relationship_item.fetch_associated_object(record, params) @@ -129,6 +130,11 @@ module FastJsonapi included_objects = [included_objects] unless relationship_type == :has_many included_objects.each do |inc_obj| + if relationship_item.polymorphic.is_a?(Hash) + record_type = inc_obj.class.name.demodulize.underscore + serializer = self.compute_serializer_name(inc_obj.class.name.demodulize.to_sym).to_s.constantize + end + if remaining_items(items) serializer_records = serializer.get_included_records(inc_obj, remaining_items(items), known_included_objects, fieldsets, params) included_records.concat(serializer_records) unless serializer_records.empty? diff --git a/spec/lib/object_serializer_spec.rb b/spec/lib/object_serializer_spec.rb index 236cf8d..85f4a79 100644 --- a/spec/lib/object_serializer_spec.rb +++ b/spec/lib/object_serializer_spec.rb @@ -278,10 +278,24 @@ describe FastJsonapi::ObjectSerializer do end end - it 'polymorphic throws an error that polymorphic is not supported' do + it 'polymorphic has_many: returns correct nested includes when serializable_hash is called' do options = {} options[:include] = [:groupees] - expect(-> { GroupSerializer.new([group], options)}).to raise_error(NotImplementedError) + + serializable_hash = GroupSerializer.new([group], options).serializable_hash + + persons_serialized = serializable_hash[:included].find_all { |included| included[:type] == :person }.map { |included| included[:id].to_i } + groups_serialized = serializable_hash[:included].find_all { |included| included[:type] == :group }.map { |included| included[:id].to_i } + + persons = group.groupees.find_all { |groupee| groupee.is_a?(Person) } + persons.each do |person| + expect(persons_serialized).to include(person.id) + end + + groups = group.groupees.find_all { |groupee| groupee.is_a?(Group) } + groups.each do |group| + expect(groups_serialized).to include(group.id) + end end end