我使用的是Ruby 1.9.2,Rails 3.0.x,我使用的是MySQL DB。我有一个消息模型,每天都可以发布新消息。
我有一个索引操作,我希望显示按月和年分组的这些消息。这基本上用于过滤消息。
我的查询如下: -
@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC')
在引用this post
后,我在Rails中使用了group_by函数我的分组查询是: -
@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,提供here
。我只是想知道,我如何从created_at.to_date
中删除以获得唯一月份和年份组合键,这可能< strong>使用group_by函数。
答案 0 :(得分:32)
在SQL中:
select * from messages group by year(created_at), month(created_at);
在Rails中:
Message.all.group_by { |m| m.created_at.beginning_of_month }
答案 1 :(得分:2)
答案 2 :(得分:0)
Message.select("date_trunc('month', created_at) as month").group("month")
答案 3 :(得分:0)
ModelName.all.group_by { |m| m.created_at.month }
这将起作用,但是将返回月份作为索引。 例如11月将引用11
答案 4 :(得分:0)
按年份和月份分组(例如,没有2020年12月和2021年12月):
"Sure thing"
在PostgreSQL上测试