使用Active Record对相关表进行求和

时间:2010-12-30 22:02:28

标签: ruby-on-rails activerecord

如何将一个关联中的所有“总”列相加?

我的SQL-fu糟透了,所以我想学习如何使用Active Record for my rails 2.3.5应用程序(所以没有花哨的语法,请讨好;-)而且我在使用MySQL。

让我说我有:


Shop 

has_many :customers
has_many :transactions, :through => :customers

非常正常。


shop = Shop.first
shop.transactions
=> 100 

好的,问题的所有背景:

我希望在过去一年(2010年1月1日,2010年12月31日)的交易中汇总total列并按客户显示。

虽然我知道如何对事务进行分组并找到条件,但这是我缺乏SQL的总和部分让我失望。


first = Date.new(2010, 01, 01)
last = Date.new(2010, 12, 31)

shop.transactions(:conditions => {:created_at => first..last}, :group => :customer_id, :include => sum(:total))

我只是刺了一下,我是在正确的轨道上吗?

2 个答案:

答案 0 :(得分:8)


shop.transactions.sum(:total, :conditions => {:created_at => first..last}, :group => :customer_id)

这看起来更简单。我现在知道sum也可以采用AR属性。凉爽。

答案 1 :(得分:0)

查看收集方法。

您可以执行以下操作:

transactions = Shop.transactions
total = 0
sum = transactions.collect{|i| total+=i.transaction.amount}

将金额替换为包含交易金额的财产。

你也可以使用.sum

sum = transactions.to_a.sum(&:amount)