如何确保两个用户不同时保存记录?

时间:2013-05-13 16:23:34

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

我有这堂课:

class Payment < ActiveRecord::Base

  attr_accessible :amount, :invoice_id

  belongs_to :invoice

  validates :amount, :numericality => { :greater_than => 0, :less_than_or_equal_to => :maximum_amount }, :if => "invoice.present?"

  private

  def maximum_amount
    invoice.total if invoice.present?
  end

end

上面的代码有效。但是,如何确保没有两个用户可以同时保存新的payment记录,从而超过发票总额?

是否有可能以某种方式在数据库级别执行此操作?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以将maximum_amount功能修改为以下内容:

def maximum_amount
  if invoice.present?
    amt_paid = 0
    invoice.payments.each do |payment|
      amt_paid += payment.amount
    end
    invoice.total - amt_paid
  end
end

这并不是说数据库级别,但如果第二个用户尝试支付的金额超过现有余额,则不会进行验证。