From 32f87791149598dbcb840e1994f45b73a1b9a044 Mon Sep 17 00:00:00 2001 From: twinturbo Date: Sun, 22 Apr 2012 18:11:16 -0700 Subject: [PATCH] Basic rooted polymorphism --- lib/active_model/serializer.rb | 15 +++++++++++- test/serializer_test.rb | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b2eac4ee..7ac2874a 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -216,13 +216,26 @@ module ActiveModel end class HasOne < Config #:nodoc: + def polymorphic? + option :polymorphic + end + + def polymoprhic_key + associated_object.class.to_s.demodulize.underscore.to_sym + end + def plural_key key.to_s.pluralize.to_sym end def serialize object = associated_object - object && find_serializable(object).serializable_hash + + if object && polymorphic? + { polymoprhic_key => find_serializable(object).serializable_hash } + elsif object + find_serializable(object).serializable_hash + end end def serialize_many diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 288af48a..d1473f1a 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -957,4 +957,46 @@ class SerializerTest < ActiveModel::TestCase :foo => true }, actual) end + + # Set up some classes for polymorphic testing + class Attachment < Model + def attachable + @attributes[:attachable] + end + end + + def tests_can_handle_polymorphism + 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 + attributes :name, :url + has_one :attachable, :polymorphic => true + end + + email = email_class.new :subject => 'foo', :body => 'bar' + + 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 => { :subject => 'foo', :body => 'bar' } + } + }, actual) + end end