diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 7ac2874a..8d6bf83a 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -245,7 +245,11 @@ module ActiveModel end def serialize_ids - if object = associated_object + object = associated_object + + if object && polymorphic? + { polymoprhic_key => object.read_attribute_for_serialization(:id) } + elsif object object.read_attribute_for_serialization(:id) else nil diff --git a/test/serializer_test.rb b/test/serializer_test.rb index d1473f1a..77dc32e7 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -999,4 +999,40 @@ class SerializerTest < ActiveModel::TestCase } }, actual) end + + def test_can_handle_polymoprhic_ids + email_serializer = Class.new(ActiveModel::Serializer) do + attributes :subject, :body + end + + email_class = Class.new(Model) do + def self.to_s + "Email" + end + + define_method :active_model_serializer do + email_serializer + end + end + + attachment_serializer = Class.new(ActiveModel::Serializer) do + embed :ids + attributes :name, :url + has_one :attachable, :polymorphic => true + end + + email = email_class.new :id => 1 + + attachment = Attachment.new :name => 'logo.png', :url => 'http://example.com/logo.png', :attachable => email + + actual = attachment_serializer.new(attachment, {}).as_json + + assert_equal({ + :name => 'logo.png', + :url => 'http://example.com/logo.png', + :attachable => { + :email => 1 + } + }, actual) + end end