2009-04-17 4 views
0

모델의 필드 중 하나에 따라 레일스에서 ​​모델의 조건부 유효성 검사를 수행해야합니다. 이것은 earlier question에 대한 후속 조치로 올바른 느낌을 갖지 않는 솔루션을 개발하게되었습니다.ActiveRecord의 조건부 유효화

저는 아래의 단축 버전이 '주문 모델'을 기반으로하는 많은 ActiveRecord 모델을 보유하고 있습니다.

class Order < ActiveRecord::Base 

    has_many: previous_addresses 
    has_one: applicant 
    has_one: current_address 
end 

다른 모든 모델은 주문에 속합니다.

나는 신청자, current_address 등과 같은 다양한 모델을 주문의 회사 속성에 따라 다르게 검증하고자합니다.

저는 모든 표준 activeRecord 검사기를 지원하는 완벽한 수동 롤링 검증 세트가 포함 된 솔루션을 개발했습니다. 이 솔루션은 모델링, 필드, field_items 등과 같은 여러 테이블을 사용하여 검증되었으며 많은 양의 데이터를 제공합니다.

이제이 데이터를 조작하고 연결하려는 새로운 회사마다이 데이터를 복사하고 편집해야합니다. 이것은 지루하고 오류가 발생하기 쉽습니다.

'레일 웨이 (The Rails Way)'를 읽는 동안 Obie Fernandez는 ActiveRecord 유효성 검사 문 형식으로 데이터베이스에 유효성 검사 코드를 저장하고 회사 ID의 값에 따라 런타임에 모델에 유효성 검사 코드를 삽입하는 방법을 설명했습니다 .

 
company: 200 
model: person 
Code validates_length_of :middle_name, :maximum => 20, :allow_nil => true 

company: 201 
model: person 
Code validates_length_of :middle_name, :maximum => 1, :allow_nil => true 

그래서 회사에 201 '존'의 중간 이름 유효성 검사 실패하지만 그 회사에 200

에 대한 확인 될 것 - : 나는 다음과 같은 테이블에 데이터를 유지하는 상상하고

누구나이 일을 본 사람이 있습니까? 그렇다면 어떻게해야 할 지에 대한 조언이나 제안 사항이 있습니다. 튜토리얼/코드에 대한 링크가있는 사람이 있습니까?

답변

1

필요한 것은 각 레코드를 개별적으로 확인하는 것입니다. 이것이 사실이라면 validates_each을 사용할 수 있습니다. 이 블록에서 논리를 전달하여 모델 구성원을 평가할 수 있습니다.

validates_each :middle_name do |record, attr, value| 
    if record.company == 201 
    record.errors.add attr, 'cannot be more than 1 character' if value.length > 1 
    elsif record.company == 200 
    record.errors.add attr, 'must be less than 20 characters' if value.length > 1 
    end 
end 
+0

이것은 의심의 여지없이 작동하지만 ifs의 거대한 사슬을 피하려고 노력하고 있습니다. 아이디어는 모델에 모두 나열하는 대신 각 회사의 데이터베이스에 유효성 검사 코드를 추가하는 것입니다. 유지 보수가 쉬워집니다. –