【问题标题】:Dynamically specifying a serializer based on a property of a model根据模型的属性动态指定序列化程序
【发布时间】:2015-10-21 19:41:45
【问题描述】:

我正在尝试根据模型的属性(在父序列化程序中)动态指定序列化程序:

ActiveModel::Serializer.setup do |config|
  config.embed = :ids
  config.embed_in_root = true
end

class DocumentSerializer < ActiveModel::Serializer

  attributes :id, :name, :document_layout

  if attributes[:document_layout] === 'portrait'
    has_many :pages, serializer: PortraitPageSerializer
  elsif attributes[:document_layout] === 'landscape'
    has_many :pages, serializer: LandscapePageSerializer
  end

end

但这似乎不起作用(我猜属性不只是哈希)。

还有其他方法可以访问该值吗?还是我完全走错了路?

【问题讨论】:

  • 您是如何选择 DocumentSerializer 的?你刚刚渲染了一个文档吗?
  • 是的,在我正在调用的控制器中:render json: @documents, status: :ok
  • 我想使用相同的序列化程序并根据文档布局将某些列留空可能会更明智

标签: ruby-on-rails activemodel active-model-serializers


【解决方案1】:

是否在考虑更多(我从事序列化程序已经有一段时间了),这行得通吗?

class DocumentSerializer < ActiveModel::Serializer

  attributes :id, :name
  has_many :portrait_pages, key: pages, serializer: PortraitPageSerializer
  has_many :landscape_pages, key: pages, serializer: LandscapePageSerializer

  def portrait_pages
    pages if object.document_layout === 'portrait'
  end

  def landscape_pages
    pages if object.document_layout === 'landscape'
  end

end

这里的另一个选项 - 将您的文档子类化为具有 LandscapeDocument 和 PortraitDocument。这可能基于类型,它与您的 document_layout 字段一致。一个想法……

【讨论】:

  • 嗨,Swards,我认为你是对的...... Rails STI 可能是前进的方向,因为它们都可以从基类继承,但我可以为每种类型使用单独的序列化程序
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多