【问题标题】:Ruby on Rails: set specific serializer for polymorphic associationRuby on Rails:为多态关联设置特定的序列化程序
【发布时间】: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。我怎样才能做到这一点?

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

来自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

【问题讨论】:

  • 你有没有找到一个好的解决方案。另外,有什么想法可以防止这些多态序列化程序的 n+1 加载?
  • 如果其他人遇到这个问题,我实际上需要 model.class.to_s 而不仅仅是 model.class

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


【解决方案1】:

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

【讨论】:

  • 你能举个例子吗?如果有人想根据各种多态关联指定各种不同的序列化程序以避免多个可能相关或不相关的属性,具体取决于关联?
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2012-08-30
  • 2011-07-05
  • 2023-03-29
相关资源
最近更新 更多