2012-03-13 26 views
1

浮動小数点数は1から6.5の間でも、0.5の増分だけを検証しようとしています。so {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

、それはだかどうか尋ねます1と13の間の整数?浮動小数点の範囲は醜いです。 –

+0

@MarcTalbot私はそれが素晴らしいアプローチだと思います。それを答えとして提案してみませんか? –

+0

答えが軽すぎるようでしたが、試してみます。 :) –

答えて

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テストを実行しているとき、私は' validates 'を取得しています。少なくとも1つのバリデーション(ArgumentError)をこの解決策と一緒に提供する必要があります。 – trev9065

+0

修正済み。あなたの最初の試みは、少なくとも含まれていると思ったのです。 – rafaelkin

+0

あなたは、レールガイドについてのさらなるヘルプを得ることができます。http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators – rafaelkin

0

まず、あなたはあなたが本当に持っている必要がある場合t.decimal列を使用する必要があるとしています浮動小数点値を使用して、通常の浮動小数点問題のすべての扉を開けます。15.5のような値です。あなたは10進数の列を使用している場合は、RailsはあなたのvalueのためのBigDecimal値で働くことになり、あなたは限り、あなたはBigDecimalの土地のすべてを保つよう大丈夫でしょう:2を掛け、それ

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