如何判断哪个类在Ruby on Rails中调用方法?

时间:2013-10-26 10:21:58

标签: ruby-on-rails ruby ruby-on-rails-3

在我的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班?

1 个答案:

答案 0 :(得分:0)

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

想象一下: 发票金额:1000 User1扣除100,但请求速度非常慢。 在用户1启动后,User2扣除500,并且非常快速地完成。

由于您在应用程序中执行此操作,因此您最终获得了900的未付金额,因为这是最后执行的方法。 update_counters创建一个'安全'的SQL查询。

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

这也解决了你如何从两个类调用它们的问题。始终像这样更新这些列。