2009-12-09 177 views
1

如何使用現有數據動態驗證某個範圍內的數字?Rails動態範圍驗證

例如 - 我對產品批量訂購有一定的折扣。如果客戶購買10-50個單位,他們將關閉X,如果他們訂購51-200個單位Y.

我該如何驗證這一點,以便用戶不能在同一範圍內投入大量折扣?

+0

我很困惑得到一個假陰性。用戶是否輸入折扣金額或者他們是否被固定?如果折扣金額固定,則使用案例說明,請參閱http://snippets.dzone.com/posts/show/6043 – JosephL 2009-12-09 20:02:31

+0

用戶正在輸入金額。因此,在此示例中,用戶可以輸入「start_range」,「end_range」和「quoted_price」。 「價格報價」和「數量折扣」之間存在has_many關係。 我只是不確定如何構建一個驗證,它將通過所有現有的數量折扣循環,並確保start_range或end_range不在現有集合之間。 – sshefer 2009-12-09 20:10:52

+0

你能舉一個現有的例子嗎? – EmFi 2009-12-10 00:05:29

回答

0

如果我理解你的問題正確,那麼你要設法避免重疊一個已經存在的折讓範圍的創建。下面的代碼應該這樣做,你

class QtyDiscount < ActiveRecord::Base 

def validate 
    self.errors.add(:amount, "overlaps an existing range") 
     unless self.amount_in_allowed_range 
end 

    def amount_in_allowed_range 
     # Check for overlapping ranges where our record either 
     # - overlaps the start of another 
     # - or overlaps the end of another 
     conditions = " 
     id != :id AND (
     (min_value BETWEEN :min_value AND :max_value) OR 
     (max_value BETWEEN :min_value AND :max_value))" 

     puts "Conditions #{conditions}" 
     overlaps = QtyDiscount.find(:all, :conditions => 
     [ conditions, { :id => self.id.nil? ? 0 : self.id, 
         :min_value => self.min_value, 
         :max_value => self.max_value} ]) 
     overlaps.size == 0 
    end 

end 

EDITED 刪除外來的條件,並增加了一些self.id檢查,以確保我們不從我們自己的唱片

2

我不太明白你的問題,但我確定自定義驗證是解決你試圖實現的任何一種方法。只需在您的模型添加一個validate方法,像這樣:

def validate 
    self.errors.add(:amount, "is out of range") unless self.amount_in_allowed_range 
end 

private 
    def amount_in_allowed_range 
     # logic to return true or false 
    end