2014-04-25 2 views
1

입력 한 우편 번호가 내 zip_codes 테이블의 우편 번호와 일치하는지 확인하여 서점을 생성 할 때 우편 번호의 유효성을 검사하려고합니다. 같은 서점 모델에서 활성 레코드 유효성 검사 레일 4

, 뭔가 :

validates_presence_of :zip_code, unless: ........ 

SQL 문은 우편 번호를 찾을 수있다 :

select zip_code from book_stores where zip_code not in (select distinct zip_code from zip_codes); 

답변

2

당신은 당신의 자신의 검증 방법을 정의 할 수 있습니다 :

validate :zip_code_exists 

def zip_code_exists 
    errors.add(:zip_code, 'is not valid') unless ZipCode.exists?(zip_code: zip_code) 
end 

모델의 zip_code 속성에 오류 메시지가 추가됩니다. ZipCode 모델의 레코드는 zip_code이고 zip_code과 일치합니다.

+0

감사합니다. 잘됐다. 내가 변경 한 유일한 것은 쓰기입니다 : '유효하지 않습니다'대신 유효하지 않습니다, 같은 오류 메시지를 표시합니다. – uralika

0

대신 여기에 before_save 훅을 사용합니다. 이 방법은 함수를 호출하고 함수가 true를 반환하는 경우에만 레코드를 저장합니다. 그래서 예를 들면 :

BookStore.rb 다음 before_save 메소드가 호출되기 전에 검증이 발생하기 때문에 당신은 또한 before_save 호출을 단순화하기 위해 ZIP_CODE의 존재를 확인할 수

before_save :check_zip_code 

def check_zip_code 
    connection = ActiveRecord::Base.connection 

    zip_codes=connection.execute('select "zip_code" from "book_stores" where "zip_code" not in (select distinct "zip_code" from "zip_codes")').to_a 

    if self.zip_code&&(zip_codes.include?(self.zip_code) 
    return true 
    else 
    return false 
    end 
end 

. 그런 다음 self.zip_code가 정의되었다고 가정 할 수 있습니다.

관련 문제