活动模型序列化程序:在呈现为关系时排除属性

时间:2018-05-21 18:26:22

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

TL; DR

使用: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 选项。但是当列为关系的一部分(而不是单独)时,我只希望显示idname。像这样:

{
  "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]

1 个答案:

答案 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