Rails计算belongs_to的平均值

时间:2012-02-01 07:14:17

标签: ruby-on-rails activerecord

我有一个购买模型,它既属于产品又属于模型。我试图保留用户所有购买的平均价格,并在保存新购买时更新此平均值。

我知道我可以计算滚动平均值,但我尝试使用ActiveRecord提供的平均方法来执行此操作。另一个警告是,在这个人为的例子中,产品的价格为零是有效的。在计算平均值时,均值会忽略所有nil实例吗?

我的主要挂机是购买中的after_save块。

class Product < ActiveRecord::Base
    #price   :float

    has_many :purchases
end

class User < ActiveRecord::Base
    #average_purchase_price  :float

    has_many :purchases
end

class Purchase < ActiveRecord::Base
    belongs_to :user
    belongs_to :product

    after_save do
       #Cant quite nail down the syntax here.
       user.update_attributes average_purchase_price: user.purchases.average(#todo average purchase prices)
    end
end

2 个答案:

答案 0 :(得分:1)

生成的查询是SELECT AVG(average_purchase_price)FROM purchase ... (参考:http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html#M000293)。

如果你查看mysql关于组函数的文档(http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html),它会声明除非明确指定,否则将忽略空值。所以是的,零值将被忽略。

答案 1 :(得分:0)

试试这个:

user.update_attribute(:average_purchase_price, 
  user.purchases.average("products.price", :joins => :product)