2012-03-13 73 views
1

我想驗證一個浮點數,它可以在1到6.5之間,但只增加0.5,所以{1,1.5,2.0,2.5,3,3.5,4,4.5,5,5.5,6 ,6.5}。有沒有什麼辦法來驗證這在軌道上。到目前爲止,我有:在Rails中驗證值

validates :value, :inclusion => 1..6.5, is_value_valid => true 

def is_value_valid 
    if self.value % 0.5 == 0 
    true 
    else 
    false 
    end 
end 

我收到錯誤,當我測試,我不認爲這是你如何調用is_value_valid方法。

+1

乘以2,並詢問是否是一個1和13之間的整數?浮點範圍很難看。 – 2012-03-13 03:47:50

+0

@MarcTalbot我認爲這是一個很好的方法。爲什麼不把它作爲答案呢? – 2012-03-13 03:49:35

+0

答案似乎很輕浮,但我會試一試。 :) – 2012-03-13 03:51:21

回答

4

您可以用自定義的方法進行驗證,所以你的完整的驗證應該是這樣的:

validates :value, :inclusion => {:in => 1..6.5} 
validate :value_is_multiple_of_point_five 

def value_is_multiple_of_point_five 
    unless value % 0.5 == 0 
     errors.add(:value, "must be multiple of 0.5") 
    end 
end 
+0

@rafarlkin當我運行我的測試時,我得到'驗證':您需要提供至少一個驗證(ArgumentError)'這個解決方案。 – trev9065 2012-03-13 04:01:58

+0

更正。認爲你的第一次嘗試是正確的,至少包括:) – rafaelkin 2012-03-13 04:06:28

+0

你也可以獲得更多的幫助在軌道指南太http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators – rafaelkin 2012-03-13 04:07:55

0

首先,你將不得不使用t.decimal列,如果你真的需要有值如15.5,使用浮點值打開所有常見浮點問題的大門。如果您使用的是十進制列,Rails會與BigDecimal的價值觀合作,爲您value,當你把一切都在BigDecimal的土地,你會好起來的,只要:

validate :valid_value_very_vigorously 
HALF = BigDecimal('0.5') 
UPPER = BigDecimal('6.5') 
LOWER = BigDecimal('1.0') 

def valid_value_very_vigorously 
    errors.add(:value, "Value must be at least #{LOWER}") if(value < LOWER) 
    errors.add(:value, "Value must be at most #{UPPER}") if(value > UPPER) 
    errors.add(:value, "Value must be a multiple of 0.5") if(value % HALF != 0) 
end