Сериализатор активной модели, ассоциация рендеринга без ключа

У меня есть таблица с именем Featured_products, которая содержит только два столбца (product_id, position). В моем GET /featured_products я хочу отобразить что-то вроде этого

[
   { "name":"Product 1" }
   { "name":"product 2" }
]

Но вместо этого я логически получаю следующее:

[
   "product":{ "name":"Product 1" }
   "product":{ "name":"product 2" }
]

Следуя документу Active Model Serializers, я попробовал их в своем классе сериализатора Featured_product:

embed_in_root: true

и

belongs_to :product, embed_in_root: true

но первый выдает ошибку, а второй никак не меняет JSON.

Я не знаю, пропустил ли я ответ, который ищу в документе Active Model Serializer, или ответ можно найти в другом месте, но мне не удалось решить это самостоятельно, я был бы рад получить несколько советов здесь.

Спасибо


person Sonastra    schedule 26.11.2016    source источник


Ответы (3)


Вы также можете попробовать это:

render json: FeaturedProduct.includes(:product).order(:position).map(&:product) # include :product to avoid N + 1 queries on products
person Deepak Mahakale    schedule 26.11.2016
comment
Опять же, это работает для моего конкретного случая. Из любопытства, можно ли каким-либо образом включить продукт в мой JSON, продолжая сериализовать его в FeaturedProductSerializer, чтобы включить другие вещи (например, Position в моем случае)? - person Sonastra; 27.11.2016

Пытаться

render json: @products, root: false
person Andrés    schedule 27.11.2016

Хорошо, я нашел решение, которое работает для моего конкретного случая.

Поскольку для каждого Featured_product я хочу отображать только связанный с ним продукт, в итоге я сопоставил его в вызове рендеринга.

то есть я пошел от этого

render json: FeaturedProduct.all.order(:position)

к тому, что

render json: FeaturedProduct.all.order(:position).map(&:product)

Таким образом, вызывается сериализатор продукта, а не сериализатор из FeaturedProduct.

person Sonastra    schedule 26.11.2016