2014-01-18 81 views
5

我想從mongoid GROUP_BY代替陣列獲取一個HashMap的陣列是一個HashMapmongoid GROUP_BY返回,而不是散列

Product.group_by {|p| p.user_id } 

返回映射的數組

result = Product.group_by {|p| p.user_id } 

=> [ {"12354asdf" => [product1, product2, product3]}, 
{"safakjgh314" => [product4, product5, product6]} ] 

我目前運行以下查詢的結果以實現映射的單個散列

result.reduce Hash.new, :merge 

=> { 「12354asdf」=> [產品1,產品2,產品3], 「safakjgh314」=> [product4的,產品5,產品6]}

是有一個更有效的方式來做到這一點?

編輯*** 分組後,我寧願在集合上操作一個有意義的枚舉。

result.each do |k v| k v end 

而不是

result.each do |h| h.keys.first, h.values.first end 

例如它當前返回。

[ 
    {user_object => [item1, item2, item3] }, 
    {user2_object => [item1, item2, item3] }, 
    {user2_object => [item1, item2, item3] } 
] 
+0

的方法,這裏基本上實現了[組](HTTP://docs.mongodb .org/manual/reference/method/db.collection.group /)方法。結果按設計返回爲數組。即使是像findOne這樣的操作,也只是像你的代碼一樣包裝標準方法。 –

+0

您希望它如何更高效? –

+0

格式化的時髦我給原問題添加評論 –

回答

3

關於更緊湊的方式遍歷散列陣列,可以採取每個元素的first

result.map(&:first).each do |k, v| 
    puts k 
    puts v.count 
end 
# 12354asdf 
# 3 
# safakjgh314 
# 3 
+0

我很喜歡這個。這是否遍歷數組兩次或一次? –

+0

我不知道你可以迭代遍歷一個數組。每個塊有多個塊參數... [[「a」,「b」,「c」]]。 p array_element_1; p array_element_2; p array_element_3; } –

+0

調用.map(&:first)與使用.reduce(Hash.new,:merge)是否有效? –