在我的Rails应用程序中,我有这个:
class Invoice < ActiveRecord::Base
has_many :payments
before_save :save_outstanding_amount
def save_outstanding_amount # atomic saving
self.outstanding_amount = new_outstanding_amount
end
def update_outstanding_amount # adds another SQL query
update_column(:outstanding_amount, new_outstanding_amount)
end
private
def new_outstanding_amount
total - payments.sum(&:amount)
end
end
如何使其成为动态,以便从Invoice
类的所有实例调用第一个方法,并从其他类的所有实例调用第二个方法,例如Payment
班?
答案 0 :(得分:0)
你在做一些非常危险的事情。确保使用sql更改值而不是设置新值。
想象一下: 发票金额:1000 User1扣除100,但请求速度非常慢。 在用户1启动后,User2扣除500,并且非常快速地完成。
由于您在应用程序中执行此操作,因此您最终获得了900的未付金额,因为这是最后执行的方法。 update_counters创建一个'安全'的SQL查询。
self.class.update_counters self.id, payments.sum(&:amount)
这也解决了你如何从两个类调用它们的问题。始终像这样更新这些列。