Сериализаторы активной модели: исключать атрибуты при рендеринге как отношения - PullRequest
0 голосов
/ 21 мая 2018

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 я получаю все параметры из сериализатора.Но когда он указан как часть отношений (а не сам по себе), я хочу, чтобы отображались только 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]

?

...