使用:gem 'active_model_serializers', '~> 0.10.7'
当作为关系包含时,是否有办法在序列化程序中包含/排除选项?像这样:
has_many :options, only: [:id, :name]
我有一个序列化器:
class ProductSerializer < BaseSerializer
attribute :id, :name
has_many :options
end
Option
有自己的序列化程序,其中包含其他几个属性
class OptionSerializer < BaseSerializer
attribute :id, :name, :created_at, :updated_at
end
但是,当以Product
关系呈现时,我从序列化程序中获取 all 选项。但是当列为关系的一部分(而不是单独)时,我只希望显示id
和name
。像这样:
{
"products": [{
"id": "704c5a2d-ef53-4cae-9d3f-132dc18c148a",
"name": "foo",
"options": [{
"id": "704c5a2d-ef53-4cae-9d3f-132dc18c148a",
"name": "bar"
}]
...
}
如果我改写关系,我可以到达那里:
def options
object.options.select(:id, :name)
end
...但是1)这感觉很草率,2)这会产生N + 1个问题。我也可以创建一个NestedOptionSerializer
,然后用它来渲染,但这看起来有点矫枉过正。
当将Serializer作为关系包含在内时,是否有更简单/更清晰的方式来包含/排除属性?像这样的东西?
has_many :options, only: [:id, :name]
答案 0 :(得分:0)
您可以尝试创建第二个初始化器,例如ProductOption
,在其中定义您希望该关系的属性,以使Product
序列化器通过,在这种情况下为attributes :id, :name
>
class ProductOptionSerializer < ActiveModel::Serializer
attribute :id, :name
end
然后,回到ProductSerializer
,在关系上指定这个新的序列化器:
class ProductSerializer < ActiveModel::Serializer
attribute :id, :name
has_many :options, serializer: ProductOptionSerializer
end