diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 16eb7d87..8f06a8a7 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -112,7 +112,16 @@ module ActiveModel end def serialize_ids(object, scope) - object && object.read_attribute_for_serialization(:id) + return unless object + + if polymorphic? + { + :id => object.read_attribute_for_serialization(:id), + "#{name}_type".to_sym => object.class.to_s.split('::').last + } + else + object.read_attribute_for_serialization(:id) + end end end end diff --git a/test/serializer_test.rb b/test/serializer_test.rb index bb21d533..99b030e2 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -710,4 +710,28 @@ class SerializerTest < ActiveModel::TestCase } }, serializer.as_json) end + + def test_polymorphic_has_one_with_ids + polymorphic_blog = Class.new do + attr_accessor :writer + end + + polymorphic_serializer = Class.new(ActiveModel::Serializer) do + embed :ids + has_one :writer, :polymorphic => true + end + + user = PolymorphicUser.new :id => 1 + blog = polymorphic_blog.new + blog.writer = user + + serializer = polymorphic_serializer.new(blog, user) + + assert_equal({ + :writer => { + :writer_type => 'PolymorphicUser', + :id => 1 + } + }, serializer.as_json) + end end