在Rails中按月份和年份分组记录

bod*_*tva 13 ruby mysql group-by ruby-on-rails-3

我在Ruby 1.9.2,Rails 3.0.x上使用MySQL DB.我有一个消息模型,每天都可以发布新消息.

我有一个索引操作,我想显示按月和年分组的这些消息.这基本上用于过滤消息.

我的查询如下: -

@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC')
Run Code Online (Sandbox Code Playgroud)

在参考这篇文章之后,我在Rails中使用了group_by函数

我的分组查询是: -

@msgs_by_month = @active_msgs.all.group_by {|u| u.created_at.month }
Run Code Online (Sandbox Code Playgroud)

我收到了一个叫做@msgs_by_month的Hash.这有助于我按月对消息进行分组,但我需要考虑这一年,以形成一个独特的密钥,因为它可以帮助我区分例如,2011年9月和2012年9月.

我当前的键只有Hash [Month]类型(例如Hash [9] => 9月份,我可以显示所有适当的值).如何获得一个月,年的类型的唯一键,我可以轻松循环显示按月和创建年份分组的所有记录.

谢谢

编辑: -

我猜测一种方法,就是使用这里created_at.to_date提供的api .我只是在想,我怎么能带出一天从得到一个独特的年份和月份组合键可能与GROUP_BY功能工作.created_at.to_date

noo*_*odl 35

在SQL中:

select * from messages group by year(created_at), month(created_at);
Run Code Online (Sandbox Code Playgroud)

在Rails中:

Message.all.group_by { |m| m.created_at.beginning_of_month }
Run Code Online (Sandbox Code Playgroud)

  • 切勿使用此解决方案。正如 @HuzaifaSaifuddin 提到的,这是选择所有记录 - 因此它将整个消息表加载到内存中,然后在返回的对象上使用 group_by 方法。这将无法扩展。 (3认同)
  • DownVote 因为它选择避开年份的一个月的所有记录。因此 2017 年 12 月和 2018 年 12 月的数据属于相同的 HASH (2认同)