Group records by both month and year in Rails
我在Ruby 1.9.2,Rails 3.0.x上使用MySQL DB。我有一个消息模型,每天都可以发布新消息。
我有一个索引操作,我想显示按月和年分组的这些消息。这基本上用于过滤消息。
我的查询如下: -
1
| @active_msgs = Messages. where('expiry > ?', Time. now).order ('created_at DESC') |
在参考这篇文章之后,我在Rails中使用了group_by函数
我的分组查询是: -
1
| @msgs_by_month = @active_msgs. all.group_by {|u | u.created_at. month } |
我收到了一个叫做@msgs_by_month的Hash。这有助于我按月对消息进行分组,但我需要考虑这一年,以形成一个独特的密钥,因为它可以帮助我区分例如2011年9月和2012年9月。
我当前的密钥只有Hash [Month]类型(例如Hash [9] => 9月份,我可以显示所有适当的值)。如何获得一个月,年的类型的唯一键,我可以轻松循环显示按月和创建年份分组的所有记录。
谢谢
编辑:-
我猜测一种方法是使用这里提供的created_at.to_date api
。我只是想知道,我如何从created_at.to_date中删除那一天,以获得一个可以与group_by函数一起使用的唯一月份和年份组合键。
-
可能重复MySQL Query GROUP BY日/月/年
-
不,不重复。 你所指的q只是MYSQL相关的,这个q是rails + mysql ..
在SQL中:
在Rails中:
1
| Message. all.group_by { |m | m.created_at.beginning_of_month } |
-
多谢,伙计.. :)。 当我将where子句输入到查询中时它也可以工作..只是为了所有的信息..
-
DownVote,因为它选择了一个月的所有记录,避免了一年。 所以2017年12月的数据& 2018年12月属于同样的HASH
使用组日期。
它支持时区,因此如果您需要 - 代码将很容易发展。
https://github.com/ankane/groupdate
1
| ModelName. all.group_by { |m | m.created_at. month } |
这将有效,但是月份将作为索引返回。
防爆。 11月将参考11
1
| Message. select("date_trunc('month', created_at) as month").group ("month") |