2016-01-15 50 views
2

我在我的rails-api應用程序中使用ActiveModel :: Serializer。 我有一個多態型的關聯稱爲addonable:active_model_serializers關聯爲:

class AddOn < ActiveRecord::Base 
    belongs_to :addonable, polymorphic: true 
end 
class Container < ActiveRecord::Base 
    has_many :add_ons, as: :addonable 
end 
class Depot < ActiveRecord::Base 
    has_many :add_ons, as: :addonable 
end 

然後,我有兩個不同的控制器,它們中的每一個返回不同addonable(容器或倉庫)。 我想序列化與它的類名返回addonable協會:

class DepotSelectSerializer < ActiveModel::Serializer 
    attributes :id, :quantity 

    belongs_to :addonable, serializer: DepotSerializer, polymorphic: true 
end 
#returns: {:data=>{:id=>:string, :type=>:string, :attributes=>{:quantity=>:integer}, :relationships=>{:addonable=>{:data=>:object}}}} 

#I want: {:data=>{:id=>:string, :type=>:string, :attributes=>{:quantity=>:integer}, :relationships=>{:depot=>{:data=>:object}}}} 

我希望對象是在關係散,沒有屬性,這就是爲什麼我不能使用自定義的方法。

理想情況下,我會是這樣的:

belongs_to :addonable, serializer: ContainerSerializer, polymorphic: true, as: :depot 

但我找不到類似的事情。這可能嗎? 在此先感謝

+0

對於那些正在使用rails-api/active_model_serializers的人。可以指示:鍵。所以在我的情況下,它將是belongs_to:addonable,序列化程序:DepotSerializer,polymorphic:true,鍵:: depot – hcarreras

回答

0

active_model_serializerdocument,它描述:

您也可以使用:序列化選項來指定自定義序列化類和多態選項來指定一個協會,是多態(STI)例如:

的has_many:評論,:串行=> CommentShortSerializer

HAS_ONE:評:多態性=>真

串行器只關心多重性,而不是所有權。可以在序列化程序中使用has_one包含belongs_to ActiveRecord關聯。

所以你的情況,讓使用has_one代替belongs_to

has_one :addonable, serializer: DepotSerializer, polymorphic: true 

測試,它工作在我的項目!

+0

這仍呈現與不需要的相同結果。該對象在關鍵字下:addonable。我想要在關鍵點:倉庫。 – hcarreras

+0

@ studiohari:如何定義一個:depot屬性,它返回:addonable實際上? –

+0

對不起,我感到困惑。我實際上使用rails-api/active_model_serializers。所以這些屬性是在關聯之外的另一個散列鍵之下。看看正確的文檔,我剛纔看到我可以使用:key來指定哈希的名稱。感謝您的時間 – hcarreras