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的:呈报与&块选项有指定适合串行器。