10

私は次の設定をしています。

Invoice has_many Jobs has_many Tasks belongs_to user

タスクがあるのすべてUserのを取得し、それらの数量を合計したい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
4

3 に答える 3

2

あなたの答えに感謝します。

私はこれをなんとか解決しました

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}]
于 2013-03-27T08:19:32.323 に答える
0

たぶん、ハッシュを作成する単純な各ループで十分でしょうか?

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

これはあなたに与えるでしょう:

user_totals =  {"1":110, "2":220}
于 2013-03-26T16:20:27.193 に答える
0

使用するgroup_by

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

そのようなもの(私はそれをテストしていないので、そのままでは動作しない可能性があります)

于 2013-03-26T16:36:17.937 に答える