我有一个购买模型,它既属于产品又属于模型。我试图保留用户所有购买的平均价格,并在保存新购买时更新此平均值。
我知道我可以计算滚动平均值,但我尝试使用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
答案 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)