2011-12-15 6 views
0

오브젝트의 배열에서 덧셈의 배열을 만들기 다음과 같습니다루비 : 나는 개체의 배열을 가지고

[#<Holding id: 5, user_id: 21, outcome_id: 7, quantity: 200, cost_basis: nil, created_at: "2011-12-15 20:52:05", updated_at: "2011-12-15 20:52:05">, 
#<Holding id: 6, user_id: 21, outcome_id: 7, quantity: 750, cost_basis: nil, created_at: "2011-12-15 21:31:30", updated_at: "2011-12-15 21:31:30">, 
#<Holding id: 7, user_id: 21, outcome_id: 9, quantity: 1231, cost_basis: nil, created_at: "2011-12-15 21:35:31", updated_at: "2011-12-15 21:35:31">] 

내 모델의 find_all_by_user_id을 사용하여이를 검색 (Holding.find_all_by_user_id (21)) . 그러나 내가 필요한 것은 합계입니다. 그래서, 예를 들어, 내가이 인스턴스 대신 좀하고 싶습니다 것은 :

[#<Holding id: 5, user_id: 21, outcome_id: 7, quantity: 950, cost_basis: nil, created_at: "2011-12-15 20:52:05", updated_at: "2011-12-15 20:52:05">, 
    #<Holding id: 7, user_id: 21, outcome_id: 9, quantity: 1231, cost_basis: nil, created_at: "2011-12-15 21:35:31", updated_at: "2011-12-15 21:35:31">] 

내 성과 모델 Outcome.description에서 끌어와이 두 번째에있을 수 있다면 더 나은가 만들 것입니다 무엇 id와 함께 배열. 루프를 반복하고 outcome_id가 일치하거나 더 좋은 방법이있는 경우 합계를 만들어야하나요?

답변

2

개인적으로 SQL- SUM(quantity)GROUP BY outcome_id에서이 작업을 수행합니다.

루비의 원하는 경우

holdings = Holding.find_all_by_user_id(21) 

sums = Hash.new(0) 

holdings.each do |h| 
    sums[h.outcome_id] += h.quantity 
end 

sums

지금 키되는 모든 outcome_ids 및 총량되는 값으로 해시 할 수 있습니다.

두 솔루션 (SQL 및 Ruby)에서는 원하는 필드가 아닌 다른 필드 (holding_id, user_id, cost_basis, timestamps)의 정보가 손실됩니다.

+0

SQL을 사용하는 것이 더 나은 해결책이라는 것에 동의합니다. 그것은 항상 도움이되는 훨씬 적은 데이터를 반환합니다. 플러스 DBM은 그런 종류의 리프팅을 위해 만들어졌습니다. 전체 행을 검색 할 수있는 유일한 시간은 합계를 기반으로 데이터를 후속 처리해야하는 경우입니다. –