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.