2013-02-25 15 views
0

我有一個模型Foo實例的數組。 Foo是基於歐姆的數據存儲。 Foo的每個實例具有an_id和整數屬性,如follows,likes。如果Foo有兩個相同的an_id,我希望將followslikes屬性加在一起。我的解決方案是創建一個散列,其中每個鍵都是數組的an_id,並保持該狀態。如果數組足夠大,這不是有效的,因爲我需要將每個對象都放回到數組中。我很樂意按Foo#an_id對數組進行分組,並將計數器屬性合併/添加到一起並將其彈回到數組中。目前支持這樣的東西嗎?高效的方法來組合這個紅寶石對象數組

回答

1

group_bysum

作爲開始,是這樣的:

grouped_hash = your_array.group_by(&:an_id) 
sums_by_id = {} 
grouped_hash.each do |id,values| 
    sums_by_id[id] = {} 
    # you could also just iterate over values once and += :follows and :likes 
    sums_by_id[id][:follows] = values.sum(&:follows) 
    sums_by_id[id][:likes] = values.sum(&:likes) 
end 

輸出示例: sums_by_id => {1 => {:如下=> 2,:喜歡=> 4} ,2 => ...

此外,看一看:

inject

(5..10).inject {|sum, n| sum + n } # 45 
+0

我認爲問題與解決方案上面是我需要這回一個數組,所以我可以進行排序操作。理想情況下,我想按照/喜歡等進行排序。使用上面構建的數據結構有沒有一種簡單的方法? – randombits 2013-02-25 04:32:25

+0

sums_by_id.to_a.sort_by {| obj |塊}→數組 – 2013-02-25 04:45:22

+0

您可能想要考慮在數據庫中執行此操作。 Model.where(:some_id_attr => an_id).all.order('DESC'後面),或使用活動記錄:group和:sum – 2013-02-25 04:58:40

0

您可以使用inject得到值的總和:

array = *array of Foo* 
total = array.inject { |sum, x| sum + x.likes }