2012-03-13 3 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}. 이것을 레일에서 검증 할 수있는 방법이 있습니까? 지금까지 나는이 : 나는 테스트입니다 때 오류가 점점 오전레일에서 값 유효성 검사

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 '가 표시됩니다 : 적어도 하나의 유효성 검사 (ArgumentError)를이 솔루션과 함께 제공해야합니다. – trev9065

+0

수정되었습니다. 첫 번째 시도가 최소한 포함되었다고 생각했습니다. – rafaelkin

+0

레일 가이드에 대한 추가 도움말을 얻을 수 있습니다. http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators – rafaelkin

0

첫째, 당신은 당신이 정말로이해야하는 경우 t.decimal 열을 사용해야 할거야 15.5과 같은 값은 부동 소수점 값을 사용하여 일반적인 부동 소수점 문제의 문을 엽니 다. 10 진수 열을 사용하는 경우, 레일은 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 
관련 문제