首页 > 解决方案 > 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

标签: ruby-on-railspostgresqlactiverecord

解决方案


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。


推荐阅读