如何使用現有數據動態驗證某個範圍內的數字?Rails動態範圍驗證
例如 - 我對產品批量訂購有一定的折扣。如果客戶購買10-50個單位,他們將關閉X,如果他們訂購51-200個單位Y.
我該如何驗證這一點,以便用戶不能在同一範圍內投入大量折扣?
如何使用現有數據動態驗證某個範圍內的數字?Rails動態範圍驗證
例如 - 我對產品批量訂購有一定的折扣。如果客戶購買10-50個單位,他們將關閉X,如果他們訂購51-200個單位Y.
我該如何驗證這一點,以便用戶不能在同一範圍內投入大量折扣?
如果我理解你的問題正確,那麼你要設法避免重疊一個已經存在的折讓範圍的創建。下面的代碼應該這樣做,你
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檢查,以確保我們不從我們自己的唱片
我不太明白你的問題,但我確定自定義驗證是解決你試圖實現的任何一種方法。只需在您的模型添加一個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
我很困惑得到一個假陰性。用戶是否輸入折扣金額或者他們是否被固定?如果折扣金額固定,則使用案例說明,請參閱http://snippets.dzone.com/posts/show/6043 – JosephL 2009-12-09 20:02:31
用戶正在輸入金額。因此,在此示例中,用戶可以輸入「start_range」,「end_range」和「quoted_price」。 「價格報價」和「數量折扣」之間存在has_many關係。 我只是不確定如何構建一個驗證,它將通過所有現有的數量折扣循環,並確保start_range或end_range不在現有集合之間。 – sshefer 2009-12-09 20:10:52
你能舉一個現有的例子嗎? – EmFi 2009-12-10 00:05:29