0

我想根据创建记录的时间从用户表中获取输出。时间存储在 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 am - 6 am 如果 created_at 时间落在此范围内,然后我可以在 time_span 列上执行 group_by 。有更好的解决方案吗?

4

2 回答 2

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}"}

可能有机会简化这一点,如果您愿意,您可以将分组推送到数据库中,但我想我会继续分享。

于 2013-07-03T13:08:34.887 回答
0

我的建议是在数据库上创建另一列,这样可以避免对选择进行计算而牺牲一个简单的列。

于 2013-07-03T06:33:43.017 回答