Запрос связанных таблиц в ruby ​​на рельсах - PullRequest
0 голосов
/ 25 сентября 2018

Итак, я работаю над тем, чтобы разобраться с рубином на рельсах.У меня есть 3 таблицы с приведенными ниже ассоциациями.Я хочу запросить все элементы таблицы продуктов и данные, связанные с каждым продуктом.

Например, я хочу отобразить в своем компоненте реакции:

Название продукта происходит из таблицы продуктов

Продукт UPC происходит из таблицы продуктов

Продукт доступен на дату поступает из таблицы продуктов

Наименование объекта (напр. Материал) происходит из таблицы свойств

Значение свойства (напр. Хлопок) взято из таблицы product_property

class Property < ApplicationRecord
  has_many :product_properties
  has_many :products, through: :product_properties
  accepts_nested_attributes_for :product_properties
end

class Product < ApplicationRecord
  has_many :product_properties
  has_many :properties, through: :product_properties
end

class ProductProperty < ApplicationRecord
  belongs_to :property, required: false
  belongs_to :product, required: false
end

Сейчас я понимаю, как получить все продукты, используя:

Product.all

Что яЯ не понимаю, как получить каждый продукт и связанные свойства и свойства продукта.

Я вижу здесь , где они используют этот метод, но я не могу реализовать это.

Author.joins(:articles).where(articles: { author: author })

Спасибо за любую помощь, вы можете мне помочь.

1 Ответ

0 голосов
/ 25 сентября 2018

Для быстрой загрузки обычно следует использовать

Product.includes(:properties)

Однако общий подход, используемый ActiveRecord, заключается в использовании отдельных запросов для загрузки данных ассоциации, что приводит к следующим запросам:

> products = Product.includes(:properties).to_a
  Product Load (0.2ms)  SELECT "products".* FROM "products"
  ProductProperty Load (0.2ms)  SELECT "product_properties".* FROM "product_properties" WHERE "product_properties"."product_id" = ?  [["product_id", 1]]
  Property Load (0.2ms)  SELECT "properties".* FROM "properties" WHERE "properties"."id" = ?  [["id", 1]]
 => [#<Product id: 1, name: "product">] 
> products.first.properties.to_a
 => [#<Property id: 1, name: "property">] 

Если вы знаете, что ваши записи могут быть загружены только одним запросом, вы можете использовать

Product.eager_load(:properties)

, что приведет к

SELECT "products"."id" AS t0_r0, "products"."name" AS t0_r1, "properties"."id" AS t1_r0, "properties"."name" AS t1_r1 FROM "products" LEFT OUTER JOIN "product_properties" ON "product_properties"."product_id" = "products"."id" LEFT OUTER JOIN "properties" ON "properties"."id" = "product_properties"."property_id"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...