Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion lib/jsonapi/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ def _replace_polymorphic_to_one_link(relationship_type, key_value, key_type, opt
relationship = self.class._relationships[relationship_type.to_sym]

_model.public_send("#{relationship.foreign_key}=", key_value)
_model.public_send("#{relationship.polymorphic_type}=", key_type.to_s.classify)
_model.public_send("#{relationship.polymorphic_type}=", _model_class_name(key_type))

@save_needed = true

Expand Down Expand Up @@ -404,6 +404,12 @@ def _replace_fields(field_data)
:completed
end

def _model_class_name(key_type)
type_class_name = key_type.to_s.classify
resource = self.class.resource_for(type_class_name)
resource ? resource._model_name.to_s : type_class_name
end

class << self
def inherited(subclass)
subclass.abstract(false)
Expand Down
8 changes: 8 additions & 0 deletions test/fixtures/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,9 @@ class Document < ActiveRecord::Base
has_many :pictures, as: :imageable
end

class Document::Topic < Document
end

class Product < ActiveRecord::Base
has_one :picture, as: :imageable
end
Expand Down Expand Up @@ -1209,6 +1212,11 @@ class DocumentResource < JSONAPI::Resource
has_many :pictures
end

class TopicResource < JSONAPI::Resource
model_name 'Document::Topic'
has_many :pictures
end

class ProductResource < JSONAPI::Resource
attribute :name
has_one :picture, always_include_linkage_data: true
Expand Down
8 changes: 8 additions & 0 deletions test/unit/resource/resource_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,14 @@ def test_class_relationships
assert_equal(relationships.size, 2)
end

def test_replace_polymorphic_to_one_link
picture_resource = PictureResource.find_by_key(Picture.first)
picture_resource.replace_polymorphic_to_one_link('imageable', '9', 'Topic')

assert Picture.first.imageable_id == 9
assert Picture.first.imageable_type == Document::Topic.to_s
end

def test_duplicate_relationship_name
assert_output nil, "[DUPLICATE RELATIONSHIP] `mother` has already been defined in CatResource.\n" do
CatResource.instance_eval do
Expand Down