Ruby on Rails:为多态关联设置特定的序列化程序

时间:2017-03-29 03:57:58

标签: ruby-on-rails polymorphic-associations active-model-serializers

我试图覆盖多态关系的默认序列化程序。我有:

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

1 个答案:

答案 0 :(得分:0)

您可以使用belongs_to:notifiable with&amp; block选项在那里指定适合的序列化程序。