Это должно сделать это для вас:
Upload.joins(:product).where(products: { catalog_id: 123 }).count
Использование joins
создает INNER JOIN
между двумя таблицами, что позволяет запрашивать таблицу продуктов, как указано выше.
Примечаниеединственное и множественное число product
- объединения должны отражать ассоциацию (upload
принадлежит one product
), в то время как предложение where всегда использует имя таблицы, обычно в множественном числе.
SQL будет выглядеть примерно так:
SELECT "uploads".* FROM "uploads"
INNER JOIN "products"
ON "products"."id" = "uploads"."product_id"
WHERE "products"."catalog_id" = 123
Если вам нужно больше информации о каталоге, вы также можете включить это, например, следующее:
Upload.joins(product: :catalog).where(products: { catalogs: { whatever: 'you want to query' } }).count
Имейте в виду, использование joins
только для запроса, такого как этот.Если вам нужен доступ к атрибутам продукта или каталога, вы должны использовать другой подход, такой как includes
, чтобы предварительно загрузить данные и избежать N + 1 запросов.Здесь хорошее чтение здесь , если вам интересно.