2011-07-16 81 views
0

我在不同的型號上有兩個相關的驗證。我可以驗證一種方式,但不是另一種。後驗證的工作原理是:如果我嘗試更改作爲賣方的可用數量,並且人們已經訂購了一些,它(正確)不會讓我將數量更改爲已訂購數量以下。rails - 驗證已訂購的產品是否有可用數量

訂單驗證不起作用:如果我嘗試將訂單數量改爲超過可用數量,它會讓我。它只檢查目前的總和(我猜在保存之前),並且沒有注意到買家試圖偷偷出來的東西超出了可用的範圍。當我嘗試將訂單更改爲少於可用數量時,它不會讓我檢查訂單(保存前)的當前總和。

我也嘗試驗證訂單的數量+剩餘的可用庫存(可用-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

你應該只能夠比較可用數量減去訂購數量:

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) 
+0

謝謝,我同意我應該能夠。我嘗試了你的代碼,但它仍然可以讓我訂購的數量超過了可用數量(然後讓我無法將其更改回有效數額) – thejonster

+0

請參閱編輯的答案,這應該解決它。 –

+0

在我嘗試編輯現有訂單之前,這種方式仍然有效:訂購的當前數量雖然有效,但可能會大於其他買方可用的數量。當我編輯並保存訂單而不更改數量時,它會添加錯誤 – thejonster