2012-03-13 55 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