我在不同的模型上有两个相关的验证。我可以验证一种方式而不是另一种方式。后验证工作:如果我尝试更改卖方可用的数量,并且人们已经订购了一些,它(正确)将不允许我将数量更改为低于已订购的数量。
订单验证不起作用:如果我尝试将订单金额更改为超过可用订单金额,它就可以让我。它仅检查当前总和(我在保存之前猜测),并且没有注意到买家试图偷偷摸摸超过可用的数量。当我尝试将订单更改回少于可用的订单时,它不会让我检查当前订购的金额(保存前)。
我还尝试验证订单数量+剩余可用库存(可用-sum订购),但遇到同样的问题。
我如何获得验证以检查保存后的数量,如果值无效,则不保存?它还必须用于编辑订单
class Post < ActiveRecord::Base
belongs_to :product
belongs_to :event
has_many :orders, :dependent => :destroy
attr_accessible :quantity, :deadline, :product_id, :event_id
validate :quantity_gt_ordered
def quantity_gt_ordered
self.errors.add(:quantity, " - People have already ordered more than this") unless self.quantity >= self.sum_orders
end
def sum_orders
self.orders.sum(:quantity)
end
class Order < ActiveRecord::Base
belongs_to :user
belongs_to :post
attr_accessible :order_price, :post_id, :user_id, :quantity
validate :quantity_is_available
def quantity_is_available
self.errors.add(:quantity, " - Please order only what's available") unless self.sum_post_orders <= self.post.quantity
end
def sum_post_orders
Order.where(:post => self.post).sum(:quantity)
end
答案 0 :(得分:1)
您应该只能比较可用数量减去订购数量:
available_quantity = self.post.quantity - self.sum_post_order
if quantity > available_quantity
self.errors.add(:quantity, " - Please order only what's available")
end
并确保您的sum_post_orders
不包含当前订单:
Order.where("id != ?", self.id).where(:post => self.post).sum(:quantity)