2013-03-26 185 views
9

我有以下設置。將數組分組並獲得總和

Invoice has_many Jobs has_many Tasks belongs_to user 

我想所有User S代表的Invoice有任務,並總結了它們的數量

class Invoice < ActiveRecord::Base 
    has_many :jobs 
end 

class Job < ActiveRecord::Base 
    belongs_to :invoice 
    has_many :tasks  
end 

class Task < ActiveRecord::Base 
    belongs_to :job     
    belongs_to :user  
end  

這裏是我得到

@invoice = Invoice.find(params[:id]) 
jobs = @invoice.jobs.joins(:tasks) 
     .select('tasks.user_id, (sum(tasks.quantity)*jobs.price) as total') 
     .group('tasks.user_id, jobs.id') 
     .order('tasks.user_id') 

我得到這個,這是接近我想要的

- !ruby/object:Job 
    attributes: 
    user_id: '1' 
    total: '60.00' 
- !ruby/object:Job 
    attributes: 
    user_id: '1' 
    total: '50.00' 
- !ruby/object:Job 
    attributes: 
    user_id: '2' 
    total: '120.00' 
- !ruby/object:Job 
    attributes: 
    user_id: '2' 
    total: '100.00' 

我如何將這個按user_id進行分組,然後對總數進行總結,以便得到類似的結果?

user_id: 1 
total: 110 
user_id: 2 
total: 220 
+0

解決這個請你澄清你的模型之間的關係。如何連接任務和作業? – gabrielhilal 2013-03-26 12:18:32

+1

這似乎是一個更適合原始SQL或Arel而不是使用ActiveRecord的工作。 – 2013-03-26 12:18:35

+0

你不是在想SQL查看嗎? – 2013-03-26 14:28:30

回答

1

thansk你的答案。

我設法與

user_totals = jobs.to_a.group_by(&:user_id).map{ |user_id,jobs| {:user_id => user_id.to_i, :total => jobs.sum {|j| j.total.to_f} }} 
=> [{:user_id=>1, :total=>110.0}, {:user_id=>2, :total=>220.0}] 
0

也許只是一個簡單的每個循環創建一個散列會做?

user_totals = Hash.new(0) 
jobs.each do |job| 
    user_totals[job.user_id] += job.total 
end 

這會給你:

user_totals = {"1":110, "2":220} 
0

使用group_by

Hash[jobs.group_by(&:user_id).map {|user_id, jobs| [user_id, jobs.reduce{ |m, job| m+job.total] }] 

類似的東西(我沒有測試過它,所以它可能無法正常工作,因爲它是)