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记录,从而超过发票总数?

是否有可能在数据库级别以某种方式做到这一点?

谢谢你的帮助。

4

1 回答 1

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

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

于 2013-05-13T17:07:59.443 回答