2017-03-29 152 views
0

使用分組和排序由我有一個函數:通過嵌套哈希

tracks.group_by { |t| t[:track].track_category } 

它創建了一個哈希:

{ 

#<TrackCategory id: 2, order: 0> => 
    [{:track => 
    #<Track promo_order: 2>, 
    :order => 2}, 
    {:track => 
    #<Track promo_order: 2>, 
    :order => 1}], 

#<TrackCategory id: 1, order: 1> => 
    [{:track => 
    #<Track promo_order: 2>, 
    :order => 2}, 
    {:track => 
    #<Track promo_order: 2>, 
    :order => 1}] 
} 

我一直在試圖以該TrackCategories排序,內通過promo_order排序曲目。

這一直給我的錯誤,我敢肯定,我做錯了什麼

tracks.group_by { |t| t[:track].track_category }.sort_by { |t| t[:order] }.sort_by { |t| t[:promo_order] } 
+0

它給你什麼錯誤?如何佈置物體? (即他們與其他事物有什麼關係?) –

回答

1

你傳入這些來自group_by並被迫與數組sort_by鍵值對,然後嘗試訪問數組中的某個鍵,這當然不存在。

換句話說,您錯誤地使用了sort_by中使用的輸入。在第一個sort_by中,|t|是由group_by生成的哈希密鑰對,並被強制轉換爲形式爲[k,v]的數組。在你的情況,t是:

[ #<TrackCategory id: 2, order: 0>, 
    [{:track => 
    #<Track promo_order: 2>, 
    :order => 2}, 
    {:track => 
    #<Track promo_order: 2>, 
    :order => 1}], 
#... 
] 

所以,你想要的是分解中的所有元素的數組,所以你可以得到你想要的那些,是這樣的:

tracks.group_by { |t| t[:track].track_category } 
    .sort_by { |t, _| t[:order] } # here you're sorting by TrackCategory#[:order] 

而且對類似的東西第二行,但使用[:promo_order]代替。