2014-03-02 139 views
1

我目前正在排序我的事件,例如:按年份和月份分組的紅寶石數組

@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">]}

+0

預期輸出是散列與具有每月鍵單個元件的陣列?看起來很奇怪。 – tokland

回答

3

你想羣體性事件按我的理解,按月份和年份。 然後使用 @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">]} 

這將是更正確的在你的榜樣,然後重複鍵。

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>] 
    } 
] 
0

假設事件排序(sort_by(&:date)):

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