Подсчитать has_many записей запроса - PullRequest
1 голос
/ 07 августа 2020

Если у меня есть Модель с отношением has_many, как я могу получить все записи, на которые указывают все записи в моем запросе?

Скажем так, здания имеют отношение has_many с номера. Вот что я хочу сделать:

Building.where(...query...).rooms.count

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

Один из способов - это, но мне интересно, есть ли лучший способ:

building_ids = Building.where(...query...).pluck(:id)
Room.where(building_id: building_ids).count

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Использование select вместо pluck приведет к одному выражению sql вместо двух отдельных.

building_ids = Building.where(...).ids
Room.where(building_id: building_ids)

вы также можете использовать join

Room.joins(:building).where(building: { name: 'somename' })
0 голосов
/ 07 августа 2020

Я бы использовал сумму кешей счетчиков.

Добавьте столбец кеша счетчика в миграцию:

add_column :buildings, :rooms_count, default: 0

Обновите отношение в комнате:

belongs_to :building, counter_cache: true

Тогда вы можете сделать что-то вроде:

Building.sum(:rooms_count)

Это позволит избежать n + 1 запросов

Подробнее здесь https://blog.appsignal.com/2018/06/19/activerecords-counter-cache.html

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