0

在我的 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该类)调用第二个方法?

4

1 回答 1

0

你在这里做一些非常危险的事情。确保使用 sql 更改值而不是设置新值。

想象一下: 发票金额:1000 用户 1 扣除 100,但请求非常慢。用户 1 刚开始,用户 2 就扣 500,而且做得很快。

由于您在应用程序中执行此操作,因此您最终会得到 900 个未完成的金额,因为这是最后执行的方法。update_counters 创建一个“安全”的 sql 查询。

self.class.update_counters self.id, payments.sum(&:amount)

这也解决了您关于如何从两个类中调用它们的问题。总是像这样更新这些列。

于 2013-10-26T13:11:25.813 回答