我有这堂课:
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
记录,从而超过发票总额?
是否有可能以某种方式在数据库级别执行此操作?
感谢您的帮助。
答案 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
这并不是说数据库级别,但如果第二个用户尝试支付的金额超过现有余额,则不会进行验证。