2013-03-26 5 views
9

私は以下の設定をしています。配列をグループ化して合計を得る

Invoice has_many Jobs has_many Tasks belongs_to user 

私は仕事を持っているInvoiceためのすべてのUser Sを取得し、ここで

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

+1

これは、ActiveRecordを使用するのではなく、生のSQLまたはArelに適したジョブのようです。 –

+0

SQLビューについて考えていませんか? –

答えて

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] }] 

何かを(私はそれをテストしていないので、それがあるとして、それは動作しない場合があります)

あなたの答えは
関連する問題