我有3个表(a,b,c),“ a” has_many“ b”和“ b” has_many“ c”。我有这行c.includes(b::a),但是我需要计算每个“ c”有多少个“ a”,因此结果应该像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
答案 0 :(得分:1)
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”,值是每个A的C计数。
如果只想为每个A计算唯一的C,则可以指定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。这只会返回具有B的C。