按月和月分组在轨道中的ruby数组

时间:2014-03-02 19:21:03

标签: ruby-on-rails ruby

我目前正在对我的事件进行排序;

@events_by_month = @events.group_by { |x| x.date.month }

这依赖于所有事件都发生在同一年的事实,但我现在也想要展示明年的事件。 我希望输出的格式与上面输出的格式相同,但按年份排序 这就是我所拥有的;

{3=>[#<Event id: 7032, date: "2014-03-02 00:00:00">, #<Event id: 7033, date: "2015-03-02 00:00:00">]}

这就是我想要的;

{3=>[#<Event id: 7032, date: "2014-03-02 00:00:00">]},{3=> [#<Event id: 7033, date: "2015-03-02 00:00:00">]}

3 个答案:

答案 0 :(得分:4)

您希望按照我的理解按月和年分组事件。 然后用 @events_by_month = @events.group_by { |x| [x.date.month, x.date.year] } 你会收到

{[3, 2014]=>[#<Event id: 7032, date: "2014-03-02 00:00:00">]},{[3,2015]=> [#<Event id: 7033, date: "2015-03-02 00:00:00">]}

在您的示例中,它将比重复的键更正确。

答案 1 :(得分:0)

我认为这对你有用

results = []

@events.group_by { |x| x.date.year }.sort.
  each { |_, e| results << e.group_by { |x| x.date.month } }

例如

[
  #<Event:0x007fd957d3dd98 @date=2014-03-02 21:37:18 +0200>,
  #<Event:0x007fd957d6e9e8 @date=2014-01-01 00:00:00 +0200>,
  #<Event:0x007fd957da4228 @date=2014-03-01 17:52:12 +0200>,
  #<Event:0x007fd957db98f8 @date=33702-11-27 23:25:40 +0200>
]

将给出

[
  {
    3=>[#<Event:0x007fd957d3dd98 @date=2014-03-02 21:37:18 +0200>,
        #<Event:0x007fd957da4228 @date=2014-03-01 17:52:12 +0200>],
    1=>[#<Event:0x007fd957d6e9e8 @date=2014-01-01 00:00:00 +0200>]
  },
  {
    11=>[#<Event:0x007fd957db98f8 @date=33702-11-27 23:25:40 +0200>]
  }
]

答案 2 :(得分:0)

假设事件已排序(sort_by(&:date)):

@events.group_by { |e| e.date.year } \
       .values \
       .map { |es| 
         es.group_by { |e| e.date.month } 
       }