ActiveRecord, Nested включает в себя со счетчиком - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть 3 таблицы (a, b, c) и "a" has_many "b" и "b" has_many "c". У меня есть эта строка c.includes (b:: a), но мне нужно посчитать, сколько «a» для каждого «c», чтобы результаты были похожи на 2 столбца. Также есть некоторые данные в C, которые не имеют b, поэтому, когда я их показываю, выдается ошибка.

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

Отлично работает запрос:

select count(c.id), a.name from c
left Join b on b.id = c.b_id 
left join a on a.id = b.a_id 
where c.created_at between '2018-11-08 00:00:00' and '2018-11-08 23:59:59' group by a.name

1 Ответ

0 голосов
/ 10 ноября 2018
A.
joins(:b).
joins(b: :c).
group("a.name").
where("c.created_at between ? and ?", DateTime.new(2018, 
11, 08), DateTime.new(2018, 11, 08).end_of_day).
count

возвращает хэш, где ключами являются «a.name», а значения - это число C для каждого A.

Если вы хотите рассчитывать только уникальные C для каждого A, вы можете указать count("distinct c.id").

Для более сложных запросов вы всегда можете выполнить запрос с необработанным SQL:

ActiveRecord::Base.connection.execute(<<~SQL).values
  select count(c.id), a.name from c
  left Join b on b.id = c.b_id 
  left join a on a.id = b.a_id 
  where c.created_at between '2018-11-08 00:00:00' and '2018- 
 11-08 23:59:59' group by a.name
SQL

возвращает неровный массив результатов.

Что касается ваших осиротевших записей C, когда вы запрашиваете их, вы можете внутренне присоединиться к B. Это вернет только C, у которого есть B.

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