2017-11-27 29 views
2

Ruby on Railsアプリケーションに、名前、裏書、経費属性を持つ製品モデルがあります。Ruby集合関数(モデル付き)

すべてのレコードを一覧表示するクエリを作成する必要がありますが、すべてのレコードについて、保証費用を所得値として計算する必要があります。それは大丈夫と思われる。しかし、私はすべての収入を同様に集計する必要があります。例えば

私の記録は、これらのようなものです:


Name Endorsement Expense 
X 100   25 
Y 20   17 
X 60   55 
T 178   78 

は私のように、これらの値をリストする必要があります。


Name Endorsement Expense Income Total Income 
X 100   25  75  75 
Y 20   17  3  78 
X 60   55  5  83 
T 178   78  100  183 

私はそれをどのように行うことができますか?

ありがとうございました。

+0

これらの他の数字は魔法から来ている:それはこのようになります

? – tadman

+0

合計を変数に格納し、レコードをループするごとに各収入を追加しますか? –

+1

'合計= 0; records.each {| r | ....;総計+ = r.income} ' –

答えて

1
rows = Product.select('name,endorsement,expense, (endorsement-expense) as income') 

total_income = 0 
rows.each do |row| 
    total_income += row.income 
    puts "#{row.name}, #{row.endorsement}, #{row.expense}, #{row.income}, #{total_income}" 
end 
+1

'#{total_income} 'ではなく、 '#{total_income}'にする必要があります。 –

+0

ありがとう、編集済み – xeon131

+0

所得がインスタンスメソッドであれば、より再利用可能になります。 – s1mpl3

0

また、各製品の総収入でそれを行うことができます。

products = Product.select("(endorsement - expense) AS 'income', name, endorsement, created_at, null as total") 
products.each do |p| 
    p.total = Product.select("sum(endorsement) - sum(expense) AS 'total'").where(name: p.name).where("created_at <= ?", p.created_at).group('name').last.total 
end 
0

あなたは総収入を蓄積するinject関数を適用することができます。

products.inject{|sum, product| sum += (product.endorsement - product.expense }