From 75ba64a5c91bf3e5dad49ece73cfacc3ca0d663c Mon Sep 17 00:00:00 2001 From: Markus Doits Date: Sat, 26 Jan 2019 14:15:06 +0100 Subject: [PATCH 1/2] make belongs_to polymorphic use `id_method_name` --- lib/fast_jsonapi/relationship.rb | 7 +++ .../lib/object_serializer_polymorphic_spec.rb | 48 ++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/fast_jsonapi/relationship.rb b/lib/fast_jsonapi/relationship.rb index 7a038de7..882e8f26 100644 --- a/lib/fast_jsonapi/relationship.rb +++ b/lib/fast_jsonapi/relationship.rb @@ -68,6 +68,13 @@ def ids_hash_from_record_and_relationship(record, params = {}) return unless associated_object = fetch_associated_object(record, params) + if relationship_type == :belongs_to + return { + id: fetch_id(record, params), + type: run_key_transform(associated_object.class.name.demodulize.underscore) + } + end + return associated_object.map do |object| id_hash_from_record object, polymorphic end if associated_object.respond_to? :map diff --git a/spec/lib/object_serializer_polymorphic_spec.rb b/spec/lib/object_serializer_polymorphic_spec.rb index f889141f..7f341582 100644 --- a/spec/lib/object_serializer_polymorphic_spec.rb +++ b/spec/lib/object_serializer_polymorphic_spec.rb @@ -1,8 +1,12 @@ require 'spec_helper' describe FastJsonapi::ObjectSerializer do + class ListOwner + attr_accessor :id, :uuid + end + class List - attr_accessor :id, :name, :items + attr_accessor :id, :name, :items, :owner, :owner_id, :owner_type, :owner_uuid end class ChecklistItem @@ -19,6 +23,13 @@ class ListSerializer attributes :name set_key_transform :dash has_many :items, polymorphic: true + belongs_to :owner, polymorphic: true, id_method_name: :owner_uuid + belongs_to :owner_block, polymorphic: true, id_method_name: :uuid do + owner = ListOwner.new + owner.id = 2 + owner.uuid = 234234234 + owner + end end let(:car) do @@ -36,6 +47,13 @@ class ListSerializer checklist_item end + let(:owner) do + owner = ListOwner.new + owner.id = 1 + owner.uuid = 123123123 + owner + end + context 'when serializing id and type of polymorphic relationships' do it 'should return correct type when transform_method is specified' do list = List.new @@ -47,5 +65,33 @@ class ListSerializer record_type = list_hash[:data][:relationships][:items][:data][1][:type] expect(record_type).to eq 'car'.to_sym end + + it 'should return correct id for belongs_to when id_method_name is specified' do + list = List.new + list.id = 1 + list.owner = owner + list.owner_id = owner.id + list.owner_type = owner.class.name + list.owner_uuid = owner.uuid + list_hash = ListSerializer.new(list).to_hash + record_uuid = list_hash[:data][:relationships][:owner][:data][:id] + expect(record_uuid).to eq list.owner_uuid + end + + it 'should return nil for belongs_to when association is nil' do + list = List.new + list.id = 1 + list_hash = ListSerializer.new(list).to_hash + owner_relationship = list_hash[:data][:relationships][:owner][:data] + expect(owner_relationship).to be_nil + end + + it 'should return nil for belongs_to when association is nil' do + list = List.new + list.id = 1 + list_hash = ListSerializer.new(list).to_hash + owner_relationship = list_hash[:data][:relationships][:'owner-block'][:data] + expect(owner_relationship).to eq(id: 234234234, type: :'list-owner') + end end end From 97a37b86c649bcaae35c5f39cadbc20bf76bb749 Mon Sep 17 00:00:00 2001 From: Markus Doits Date: Sat, 26 Jan 2019 14:31:07 +0100 Subject: [PATCH 2/2] fix spec name --- spec/lib/object_serializer_polymorphic_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/lib/object_serializer_polymorphic_spec.rb b/spec/lib/object_serializer_polymorphic_spec.rb index 7f341582..1ad32f15 100644 --- a/spec/lib/object_serializer_polymorphic_spec.rb +++ b/spec/lib/object_serializer_polymorphic_spec.rb @@ -86,7 +86,7 @@ class ListSerializer expect(owner_relationship).to be_nil end - it 'should return nil for belongs_to when association is nil' do + it 'should return correct data for belongs_to with object_block when id_method_name is specified' do list = List.new list.id = 1 list_hash = ListSerializer.new(list).to_hash