ruby-on-rails - 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
解决方案
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。
推荐阅读
- .net-core - .NETCore 3.0 在 VS2019 中未列为 TargetFramework
- nuget - 不支持的 Nuget 包 - 为什么?
- reactjs - React-Router Link在Route上使用render方法时需要点击两次
- cypress - 如何在进行 e2e 测试时等待稍长的调度程序进程完成
- pytorch - RuntimeError:CUDA 错误:参数无效
- office-js - 上下文 Outlook 加载项的行为差异
- python - 将变量值传递给for循环中的查询
- python - 如何压缩我的代码?(格式和计算
- r - 使用 rvg 将 R 基础图形导出到 PowerPoint
- python - Virtualenv 无法正确运行/设置。尝试在脚本目录外调用 python.exe 时出现“拒绝访问”