如何用ActiveRecord分组计算选手总分?ActiveAdmin场景求助
解决ActiveRecord GROUP BY报错并统计选手总分
正确的ActiveRecord查询语句
方式一(返回ActiveRecord关系对象,适配ActiveAdmin scoped_collection)
Competiton.select('contestant_id, SUM(total) AS total').group('contestant_id')
方式二(返回哈希,适合快速获取结果,无需ActiveRecord对象时可使用)
Competiton.group(:contestant_id).sum(:total)
错误原因解释
你之前的查询报错是因为ActiveRecord默认会尝试加载表的所有字段(包括id),但遵循SQL标准的数据库要求:GROUP BY子句之外的字段,要么被聚合函数包裹,要么必须出现在GROUP BY中。由于id字段既不在GROUP BY里也未被聚合,因此触发了报错。
通过明确指定select仅包含contestant_id和聚合后的SUM(total),就能避免默认加载其他无关字段,解决这个问题。
在ActiveAdmin scoped_collection中的使用示例
ActiveAdmin.register Competiton do # 定义自定义scope scope :aggregated_total_scores, default: false do Competiton.select('contestant_id, SUM(total) AS total').group('contestant_id') end end
验证结果
执行上述查询后,会得到符合你期望的结果:
| contestant_id | total |
|---|---|
| 1 | 24 |
| 2 | 10 |
| 3 | 8 |
内容的提问来源于stack exchange,提问作者VR_1
相关产品推荐
相关产品推荐

