2

我想覆蓋多態關係的默認串行器。我有:Ruby on Rails:爲多態關聯設置特定的串行器

class NotificationListSerializer < ActiveModel::Serializer 
    attributes :id, :title 
    belongs_to :notifiable, polymorphic: true 
end 

如果notifiable是一個組織,該組織正在與序列化OrganizationSerializer。如果notifiable是一個組,則該組將使用GroupSerializer進行序列化。這非常合理,但是如何根據類來指定不同的序列化程序?

例如,如果notifiable是一個組織,我想使用SparseOrganizationSerializer而不是OrganizationSerializer。我怎樣才能做到這一點?

我很確定這是有記錄的,但我很難跟蹤並找到任何示例。

documentation

多態關係

多態性關係被指定的關係,就像任何其他的關聯序列。例如:

class PictureSerializer < ActiveModel::Serializer 
    has_one :imageable 
end 

您可以通過覆蓋serializer_for來指定序列化器。有關多態關係的更多上下文,請參閱每個適配器的測試。

重寫協會串查找

如果要定義您的關聯特定串行查詢,您可以覆蓋加載ActiveModel :: Serializer.serializer_for方法返回基於定義的條件序列化器類。

class MySerializer < ActiveModel::Serializer 
    def self.serializer_for(model, options) 
    return SparseAdminSerializer if model.class == 'Admin' 
    super 
    end 
    # the rest of the serializer 
end 
+0

你有沒有找到一個很好的解決方案。此外,有什麼想法來防止這些多態串行器的n + 1加載? –

+0

如果有其他人遇到問題,我實際上需要model.class.to_s而不是model.class – Marky

回答

0

您可以使用belongs_to的:呈報與&塊選項有指定適合串行器。