我想根据创建记录的时间从用户表中获取输出。时间存储在created_at列中。
输出将如下:
Time user count
2 am - 6 am 10
6 am - 10 am 5
10 am - 2 pm 5
2 pm - 6 pm 5
6 pm - 10 pm 5
10 pm - 2 am 5
我无法通过created_at进行分组。我找到的解决方案是创建另一个列说time_span并将该列更新为凌晨2点 - 早上6点如果created_at时间落在此范围内,那么我可以在time_span列上执行group_by。有更好的解决方案吗?
答案 0 :(得分:0)
我的建议是在数据库上创建另一个列,这样就可以避免以简单列为代价对选择进行计算。
答案 1 :(得分:0)
我不确定你不能使用group_by是什么意思,但以下内容可行:
hours = Users.all.collect {|u| u.created_at.hour}
ranges = [(2...6), (6...10), (10...14), (14...18), (18...22), (22...26)]
summary = hours.group_by {|h| ranges.find {|r| r === (h<2 ? h+24 : h)}}
ranges.each {|r| puts "#{r} = #{(summary[r] || []).length}"}
可能有机会简化这一点,如果您愿意,可以将分组推送到数据库中,但我想我会继续分享。