Skip to content

Commit 81ac803

Browse files
authored
Merge pull request #882 from Exelord/fix-polymorphic-type
Fix polymorphic type setter
2 parents 348c8cf + 4e8110e commit 81ac803

3 files changed

Lines changed: 23 additions & 1 deletion

File tree

lib/jsonapi/resource.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ def _replace_polymorphic_to_one_link(relationship_type, key_value, key_type, opt
324324
relationship = self.class._relationships[relationship_type.to_sym]
325325

326326
_model.public_send("#{relationship.foreign_key}=", key_value)
327-
_model.public_send("#{relationship.polymorphic_type}=", key_type.to_s.classify)
327+
_model.public_send("#{relationship.polymorphic_type}=", _model_class_name(key_type))
328328

329329
@save_needed = true
330330

@@ -404,6 +404,12 @@ def _replace_fields(field_data)
404404
:completed
405405
end
406406

407+
def _model_class_name(key_type)
408+
type_class_name = key_type.to_s.classify
409+
resource = self.class.resource_for(type_class_name)
410+
resource ? resource._model_name.to_s : type_class_name
411+
end
412+
407413
class << self
408414
def inherited(subclass)
409415
subclass.abstract(false)

test/fixtures/active_record.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,9 @@ class Document < ActiveRecord::Base
572572
has_many :pictures, as: :imageable
573573
end
574574

575+
class Document::Topic < Document
576+
end
577+
575578
class Product < ActiveRecord::Base
576579
has_one :picture, as: :imageable
577580
end
@@ -1209,6 +1212,11 @@ class DocumentResource < JSONAPI::Resource
12091212
has_many :pictures
12101213
end
12111214

1215+
class TopicResource < JSONAPI::Resource
1216+
model_name 'Document::Topic'
1217+
has_many :pictures
1218+
end
1219+
12121220
class ProductResource < JSONAPI::Resource
12131221
attribute :name
12141222
has_one :picture, always_include_linkage_data: true

test/unit/resource/resource_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,14 @@ def test_class_relationships
205205
assert_equal(relationships.size, 2)
206206
end
207207

208+
def test_replace_polymorphic_to_one_link
209+
picture_resource = PictureResource.find_by_key(Picture.first)
210+
picture_resource.replace_polymorphic_to_one_link('imageable', '9', 'Topic')
211+
212+
assert Picture.first.imageable_id == 9
213+
assert Picture.first.imageable_type == Document::Topic.to_s
214+
end
215+
208216
def test_duplicate_relationship_name
209217
assert_output nil, "[DUPLICATE RELATIONSHIP] `mother` has already been defined in CatResource.\n" do
210218
CatResource.instance_eval do

0 commit comments

Comments
 (0)