Rails中distinct.sum返回错误值问题求助
问题原因及解决方法
环境
- ruby: 3.1.2p20
- rails: 7.0.7.2
问题分析
你执行的代码结果不符合预期,核心原因是Rails对distinct和sum的组合逻辑导致的:
当链式调用这两个方法时,Rails会将distinct作用于求和的字段(value),生成的SQL是:
SELECT SUM(DISTINCT "test_models"."value") FROM "test_models" WHERE "test_models"."id" IN (0, 1)
这条SQL的作用是计算所有不同value值的总和,而非先对查询到的行去重再求和。因为你两条记录的value都是10.0,去重后只剩一个值,所以求和结果就是10.0。
解决方法
根据需求选择对应的写法:
- 如果要计算所有符合条件记录的
value总和(不管value是否重复),直接去掉distinct即可:TestModel.where(id: [0,1]).sum(:value) - 如果确实需要先对行去重(比如存在重复行的场景)再求和,先获取去重后的
value集合再计算:TestModel.where(id: [0,1]).distinct.pluck(:value).sum
内容的提问来源于stack exchange,提问作者0lli.rocks
相关产品推荐
相关产品推荐

