基于模型

时间:2015-10-21 19:41:46

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

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

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

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

有没有其他方法可以访问该值?或者我是否完全以错误的方式解决这个问题?

1 个答案:

答案 0 :(得分:1)

正在考虑这个问题(自从我开始使用Serializers以来已经有一段时间了),这会有用吗?

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字段对齐。一个想法...