19

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

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

我的查询如下所示:-

@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC')

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

我的查询分组是:-

@msgs_by_month = @active_msgs.all.group_by {|u| u.created_at.month }

我收到了一个名为@msgs_by_month 的哈希。这有助于我按月对消息进行分组,但我需要考虑年份,以形成一个唯一的 key,因为它可以帮助我区分例如 2011 年 9 月和 2012 年 9 月。

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

谢谢

编辑:-

我猜一种方法是使用此处created_at.to_date提供的 api 。我只是想知道,我怎样才能去掉一天来获得一个可以与 group_by 函数一起使用的独特的月份和年份组合键created_at.to_date

4

5 回答 5

37

在 SQL 中:

select * from messages group by year(created_at), month(created_at);

在 Rails 中:

Message.all.group_by { |m| m.created_at.beginning_of_month }
于 2012-09-21T07:54:27.407 回答
3

使用组日期。

它支持时区,因此如果您需要 - 代码将很容易演变。

https://github.com/ankane/groupdate

于 2015-02-04T19:56:57.050 回答
3
Message.select("date_trunc('month', created_at) as month").group("month")
于 2016-06-23T08:16:55.297 回答
0

按年和月分组(例如,没有 2020 年 12 月和 2021 年 12 月):

Message.group("date_trunc('year', created_at), date_trunc('month', created_at)")

在 PostgreSQL 上测试

于 2020-07-18T15:42:26.670 回答
-1
ModelName.all.group_by { |m| m.created_at.month }

这将起作用,但是月份将作为索引返回。前任。11 月将指 11

于 2018-11-12T23:45:17.617 回答