Active Record подсчитывает несколько объединенных таблиц в одном запросе? - PullRequest
2 голосов
/ 18 июня 2020

Предположим, у меня есть следующие модели:

class Shop < ApplicationRecord
  has_many :staffs
  has_many :items
end

class Staff < ApplicationRecord
  belongs_to :shop
end

class Item < ApplicationRecord
  belongs_to :shop
end 

Теперь для конкретного магазина я хочу получить его количество сотрудников и количество предметов в одном запросе. Возможно ли это?

Я пробовал следующий запрос, но результат умножается друг на друга:

@shop = Shop.joins(:items, :staffs).select('COUNT(items.id) AS items_count', 'COUNT(staffs.id) AS staffs_count').find(params[:id])
# => @shop.items_count = 30, @ship.staffs_count = 30
# Where the correct result should be 5 and 6

1 Ответ

0 голосов
/ 18 июня 2020

К сожалению, подход joins в этом случае не работает. Что вы можете использовать, так это подзапрос для получения всех предметов и / или персонала из текущей строки магазина:

SELECT (SELECT count(*) FROM items  WHERE shop_id = t1.id) items_count,
       (SELECT count(*) FROM staffs WHERE shop_id = t1.id) staffs_count
FROM shops t1
WHERE t1.id = 1
LIMIT 1

Способ ActiveRecord будет использовать инструкцию RAW SQL для параметра select плюс использование from:

Shop
  .select('(SELECT count(*) FROM items  WHERE shop_id = t1.id) items_count, 
           (SELECT count(*) FROM staffs WHERE shop_id = t1.id) staffs_count')
  .from(Shop.where(id: 1), :t1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...