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

Mat*_*att 5 ruby-on-rails polymorphic-associations active-model-serializers

我正在尝试覆盖多态关系的默认序列化器。我有:

class NotificationListSerializer < ActiveModel::Serializer
  attributes :id, :title
  belongs_to :notifiable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)

如果notifiable是一个组织,则使用 OrganizationSerializer 对该组织进行序列化。如果notifiable是一个 Group,则使用 GroupSerializer 序列化该组。这是完全有道理的,但是我如何根据类指定不同的序列化器?

例如,如果notifiable是一个组织,我想使用 SparseOrganizationSerializer 而不是 OrganizationSerializer。我怎样才能实现这个目标?

我很确定这已记录在案,但我很难跟踪并找到任何示例。

文档中:

多态关系

与任何其他关联一样,多态关系是通过指定关系来序列化的。例如:

class PictureSerializer < ActiveModel::Serializer
  has_one :imageable
end
Run Code Online (Sandbox Code Playgroud)

您可以通过覆盖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
Run Code Online (Sandbox Code Playgroud)

小智 -1

您可以使用belongs_to :notABLE 和 &block 选项来指定适合的序列化程序。