Rails中group_by_month分组select查询结果缺失月份值问题
解决方法
拿不到对应月份是因为你手动指定select字段的时候,没把分组用的时间字段加进去。group_by_month是groupdate gem提供的分组方法,它只会在GROUP BY子句里把时间截断到月份维度,不会自动把月份值塞到你自定义的select返回结果里。
直接改查询,把分组的时间字段加到select里即可:
books.group_by_month(:date) .select("COUNT(*) as total, SUM(first_attribute) as fa, date as month") .as_json
改完返回的每个哈希里会多一个month字段,值是对应分组月份的月初时间点(比如2024-01-01 00:00:00就代表2024年1月的分组),后续你可以按业务需求格式化这个时间,输出成2024年1月、2024-01这类格式。
如果不想自定义字段名,也可以直接把:date当参数传给select,返回结果里会默认用date作为键存月份值,写法如下:
books.group_by_month(:date) .select(:date, "COUNT(*) as total", "SUM(first_attribute) as fa") .as_json
补充说明
- 返回结果里
id值为nil是正常情况,分组聚合查询查出来的不是单条Book记录,本来就没有对应单条记录的id - 你贴的返回结果里聚合字段键是
fb,但代码里给SUM结果起的别名是fa,属于笔误,使用时自己对齐别名即可 - 如果你调用
group_by_month时传了自定义:as别名,比如写的是group_by_month(:date, as: :record_month),那select里对应把date as month换成record_month as month就可以
内容的提问来源于stack exchange,提问作者Sayan Patel
相关产品推荐
相关产品推荐

