2014-01-18 3 views
5
내가 대신 배열의 mongoid GROUP_BY에서 해시 맵을 검색 할

의 배열의 해시 맵을 반환 GROUP_BYmongoid 대신 해시

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 
,451,515,

=> { "12354asdf"=> [제품 1, 제품 2, 제품 3] "safakjgh314"=> [product4입니다, product5, product6]}

이를위한 더 효율적인 방법이 있는가? 차라리 의미가 열거 가능한 함께 컬렉션에서 동작 것 그룹화 한 후

편집 *** .

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를 구현 .ORG/메뉴얼 MongoDB의 API로부터의/기준/방법/db.collection.group /) 방법. 결과는 의도적으로 배열로 반환됩니다. findOne''같은 심지어 작업 esstially 당신의 코드가하는 것처럼 표준 방법을 포장. –

+0

당신은 어떻게 더 효율적으로할까요? –

+0

형식의 펑키 나는 –

답변

3

, 각 요소의 first : //docs.mongodb :

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

을 이해하기 위해 노력하고있어. 이 작업은 배열을 두 번 또는 한 번 반복합니까? –

+0

두 개 이상의 블록 인수가있는 .each를 사용하여 배열을 반복 할 수 있다는 것을 알지 못했습니다 ... [[ "a", "b", "c"]] each {| array_element_1, array_element_2, array_element_3 | p array_element_1; p array_element_2; p array_element_3; } –

+0

.alldu (Hash.new, : merge)를 사용하는 것보다 .map (& : first)를 호출하는 것이 효율적입니까? –