2016-07-14 109 views
2

我創建了一個簡單的分析圖表,並避免實時大量查詢我需要將表中的結果數據集保存在專用於這些統計數據的表中。紅寶石:地圖數組哈希在哈希中創建數組

任何用戶嘗試一些課程,我想使用狀態保存課程的ID。因此,像

{ "invited": [1,3,6], "done": [2,9] } 

我寫這個功能

u.courses.map { |w| [w.status, []<<w.id] }.to_h 

但當然每一次迭代我的數組初始化,所以我有

{"invited"=>[5101]} 

,如果我試圖用

u.courses.map { |w| [w.status, []<<w.id] } 

我獲得

[["invited", [1]], ["invited", [748]], ["invited", [1445]], ["invited", [2113]], ["invited", [2833]], ["invited", [6017]], ["invited", [4146]], ["invited", [5101]]] 

如何在第一次迭代時創建數組並將其保存在我的地圖中?

+0

請閱讀「[mcve]」。我們需要演示問題的最小代碼,相關的最小輸入和您的預期輸出。我們不知道'你'是什麼,也不知道'課程'。我們可以猜測,但我們不應該,你應該告訴我們。 –

回答

2

可以嘗試each_with_object

u.courses.each_with_object({}){|w, o| (o[w.status] ||= []) << w.id} 

reduce/inject

u.courses.reduce({}){|o, w| (o[w.status] ||= []) << w.id} 
0
u.course.each_with_object({}) { |course, h| 
    h.update(course.status=>[course.id]) { |_,o,n| o+n } } 

這使用的Hash#update(又名merge!)的形式,其使用一個塊({ |_,o,n| o+n })以確定這些值兩個哈希中存在的鍵合併。第一個塊變量是公共密鑰。由於沒有在塊計算中使用,所以我用一個下劃線表示它,這是常見的做法。有關其他兩個塊變量的說明,請參閱文檔update