rails - 验证订购的产品有可用数量

时间:2011-07-16 22:14:07

标签: ruby-on-rails validation

我在不同的模型上有两个相关的验证。我可以验证一种方式而不是另一种方式。后验证工作:如果我尝试更改卖方可用的数量,并且人们已经订购了一些,它(正确)将不允许我将数量更改为低于已订购的数量。

订单验证不起作用:如果我尝试将订单金额更改为超过可用订单金额,它就可以让我。它仅检查当前总和(我在保存之前猜测),并且没有注意到买家试图偷偷摸摸超过可用的数量。当我尝试将订单更改回少于可用的订单时,它不会让我检查当前订购的金额(保存前)。

我还尝试验证订单数量+剩余可用库存(可用-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

1 个答案:

答案 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)