Skip to content

Commit 29b2e83

Browse files
committed
make belongs_to polymorphic use id_method_name
1 parent fdcaed6 commit 29b2e83

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

fast_jsonapi.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
3030
gem.add_development_dependency(%q<rspec>, ["~> 3.5.0"])
3131
gem.add_development_dependency(%q<oj>, ["~> 3.3"])
3232
gem.add_development_dependency(%q<rspec-benchmark>, ["~> 0.3.0"])
33-
gem.add_development_dependency(%q<bundler>, ["~> 1.0"])
33+
gem.add_development_dependency(%q<bundler>, ["~> 2.0"])
3434
gem.add_development_dependency(%q<byebug>, [">= 0"])
3535
gem.add_development_dependency(%q<active_model_serializers>, ["~> 0.10.7"])
3636
gem.add_development_dependency(%q<sqlite3>, ["~> 1.3"])

lib/fast_jsonapi/relationship.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ def ids_hash_from_record_and_relationship(record, params = {})
6868

6969
return unless associated_object = fetch_associated_object(record, params)
7070

71+
if relationship_type == :belongs_to
72+
return {
73+
id: fetch_id(record, params),
74+
type: run_key_transform(associated_object.class.name.demodulize.underscore)
75+
}
76+
end
77+
7178
return associated_object.map do |object|
7279
id_hash_from_record object, polymorphic
7380
end if associated_object.respond_to? :map

spec/lib/object_serializer_polymorphic_spec.rb

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
require 'spec_helper'
22

33
describe FastJsonapi::ObjectSerializer do
4+
class ListOwner
5+
attr_accessor :id, :uuid
6+
end
7+
48
class List
5-
attr_accessor :id, :name, :items
9+
attr_accessor :id, :name, :items, :owner, :owner_id, :owner_type, :owner_uuid
610
end
711

812
class ChecklistItem
@@ -19,6 +23,13 @@ class ListSerializer
1923
attributes :name
2024
set_key_transform :dash
2125
has_many :items, polymorphic: true
26+
belongs_to :owner, polymorphic: true, id_method_name: :owner_uuid
27+
belongs_to :owner_block, polymorphic: true, id_method_name: :uuid do
28+
owner = ListOwner.new
29+
owner.id = 2
30+
owner.uuid = 234234234
31+
owner
32+
end
2233
end
2334

2435
let(:car) do
@@ -36,6 +47,13 @@ class ListSerializer
3647
checklist_item
3748
end
3849

50+
let(:owner) do
51+
owner = ListOwner.new
52+
owner.id = 1
53+
owner.uuid = 123123123
54+
owner
55+
end
56+
3957
context 'when serializing id and type of polymorphic relationships' do
4058
it 'should return correct type when transform_method is specified' do
4159
list = List.new
@@ -47,5 +65,33 @@ class ListSerializer
4765
record_type = list_hash[:data][:relationships][:items][:data][1][:type]
4866
expect(record_type).to eq 'car'.to_sym
4967
end
68+
69+
it 'should return correct id for belongs_to when id_method_name is specified' do
70+
list = List.new
71+
list.id = 1
72+
list.owner = owner
73+
list.owner_id = owner.id
74+
list.owner_type = owner.class.name
75+
list.owner_uuid = owner.uuid
76+
list_hash = ListSerializer.new(list).to_hash
77+
record_uuid = list_hash[:data][:relationships][:owner][:data][:id]
78+
expect(record_uuid).to eq list.owner_uuid
79+
end
80+
81+
it 'should return nil for belongs_to when association is nil' do
82+
list = List.new
83+
list.id = 1
84+
list_hash = ListSerializer.new(list).to_hash
85+
owner_relationship = list_hash[:data][:relationships][:owner][:data]
86+
expect(owner_relationship).to be_nil
87+
end
88+
89+
it 'should return nil for belongs_to when association is nil' do
90+
list = List.new
91+
list.id = 1
92+
list_hash = ListSerializer.new(list).to_hash
93+
owner_relationship = list_hash[:data][:relationships][:'owner-block'][:data]
94+
expect(owner_relationship).to eq(id: 234234234, type: :'list-owner')
95+
end
5096
end
5197
end

0 commit comments

Comments
 (0)