Добавление еще одного столбца в результат запроса - Ruby on Rails Association - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть модель продукта, в которой я могу делать запросы API, и она отображается в формате json.Поэтому, когда я пишу в контроллере, например, Product.all, и отображаю как json (render json: products), он прекрасно показывает все Products со всеми столбцами.Однако есть отдельная таблица с ценами, которую я хотел бы включить в тот же запрос и распечатать как Json.(как добавление нового столбца к строкам в результате запроса).

Это было бы что-то вроде Products.all.price_tables_products

Я знаю, что это невозможно сделатьтакой запрос и плюс, мне нужно выбрать только одну строку из price_tables_products.Например (price_tables_products.last).Знаете ли вы лучшее решение?

product.rb

class Product < ApplicationRecord
  has_many :price_tables_products
end

price_table_products.rb

class PriceTablesProduct < ApplicationRecord
  belongs_to :product
end

1 Ответ

0 голосов
/ 09 ноября 2018

Я не совсем понял ваши требования, но вы можете делать практически все что угодно с помощью специального сериализатора. Вы можете прочитать о сериализаторах ActiveModel здесь .

Но, в основном, на контроллере ваших продуктов, на методе, который вы хотите визуализировать ваши продукты:

class ProductsController < ActionController::Base
  def index
    render json: Product.all, each_serializer: ProductSerializer
  end
end

Затем в папке app/serializers сохраняется класс сериализатора

.
class ProductSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :created_at, :updated_at, :prices

  def prices
    PriceTablesProduct.where(product_id: object.id)
  end
end

В ваш класс сериализатора вы можете добавлять все методы, которые вы хотите делать, что хотите. Даже перезаписать существующие методы, чтобы они отображались особым образом.

Вы можете даже отобразить связанные модели, используя хорошо известные ключевые слова has_many, belongs_to и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...