ActiveRecord,嵌套式包含计数器

时间:2018-11-10 05:25:16

标签: ruby-on-rails postgresql activerecord

我有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

1 个答案:

答案 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。