【发布时间】:2017-03-29 03:57:58
【问题描述】:
我正在尝试覆盖多态关系的默认序列化程序。我有:
class NotificationListSerializer < ActiveModel::Serializer
attributes :id, :title
belongs_to :notifiable, polymorphic: true
end
如果notifiable 是一个组织,则该组织使用OrganizationSerializer 进行序列化。如果notifiable 是一个组,则该组使用 GroupSerializer 进行序列化。这很有意义,但是如何根据类指定不同的序列化程序?
例如,如果notifiable 是一个组织,我想使用 SparseOrganizationSerializer 而不是 OrganizationSerializer。我怎样才能做到这一点?
我很确定这已记录在案,但我很难跟踪并找到任何示例。
多态关系
多态关系通过指定关系进行序列化,就像任何其他关联一样。例如:
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
【问题讨论】:
-
你有没有找到一个好的解决方案。另外,有什么想法可以防止这些多态序列化程序的 n+1 加载?
-
如果其他人遇到这个问题,我实际上需要 model.class.to_s 而不仅仅是 model.class
标签: ruby-on-rails polymorphic-associations active-model-serializers