2011-04-24 3 views
18

나는 User 클래스가 있고 Contact는 User의 하위 클래스입니다. 두 클래스는 모두 users 테이블에 저장됩니다.Rails - 서브 클래스의 레일 유효성 검사 건너 뛰기

내 사용자의 모델 정의에 validates_presence_of :email이 있음에도 불구하고 내 연락처에 이메일 주소가 있거나 없을 수도 있습니다.

나의 추론은 연락처가 사용자에 의해 입력되고 나중에 사용자가 자신의 프로필을 요구할 때 사용자가 될 수 있다는 것입니다.

  • 먼저 내 사용자와 연락처를 내가 정의한대로 정의 하시겠습니까?
  • 두 번째로, 내 연락처 모델에서 validate_presence_of email유효성 검사를 어떻게 건너 뛰시겠습니까?

덕분에 (내가 레일 2.3.8에있어)!

UPDATE :

  • 은 단일 테이블 상속이 테이블이 내 연락을 위해 이메일의 존재를 확인을 건너 뛸

  • 올바른 방법이 필요 정확히 할 을 설계 보인다 다음과 같이 :

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

+1

이없는 사용자가 서브 클래스해야

이 올바르게 모델을 검증 할 방법입니다 연락처? 사용자 *는 등록한 연락처입니다. 그러나 연락처가 반드시 사용자는 아닙니다. 이것은 validation이 User 모델에 적용되어서 : unless 절이 필요 없기 때문에 검증 문제도 해결할 수 있습니다. – Raphael

답변

22

사용자와 연락처를 하나의 테이블로 통합하는 대신 두 테이블로 추상화해야하는 것처럼 들립니다. 연락처 이 될 수 있지만 그렇다고해서 그런 의미는 아닙니다.

연락처 테이블/모델에 입력란이 없어도 validate_presence_of :email 질문도 해결됩니다. 나중에 잠재적 인 성능 문제가 완화 될 것이라고 나는 믿는다. 등록 된 사용자를 찾기 위해 정렬 할 연락처가 많지 않으실 것입니다. 당신이 비록 하나 개의 테이블에 그 일에 죽은 설정된 경우

, 난 당신이 뭔가를 할 수 있다고 생각 다음

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

이 당신이 USER_TYPE 열이 있다고 가정하지만,있다 UserContact인지 여부를 결정하는 방법에 따라이를 대체 할 수 있습니다.

업데이트는 : 모델에서 validates_presence_of를 제거하고이 블록의 내부에 배치 :

with_options :unless => :user_type == "contact" do |user| 
    user.validates_presence_of :email 
end 
+0

현재 내 사용자 테이블에 행이 사용자인지 연락처인지를 나타내는 "user_type"필드가 있습니다. 두 테이블을 같은 테이블에두면 내 프로파일을 요구할 때 연락처를 사용자로 쉽게 변환 할 수 있습니다. 모든 필드는 비슷하지만 전자 메일의 유효성 검사 만 다릅니다. 그래서 같은 테이블을 사용하고 싶습니다. 전자 메일 필드의 유효성 검사를 무시할 수있는 방법에 대한 단서가 있습니다 (또는 Contact.save (false)를 할 수 있지만 전자 메일뿐만 아니라 모든 유효성 검사를 건너 뜁니다.) – alex

+0

그 사실을 이해하고 그것이 반드시 나쁜 방법은 아닙니다. 내 이해를 위해 사용자는 반드시 등록 된 사용자 일 필요는없는 수백 개의 연락처가있을 수 있습니다. 사이트가 100,000 명의 사용자로 성장한 경우이를 하나의 테이블로 통합하여 성능에 미치는 영향을 생각하십시오. 현재 문제는 아니지만, 잠재적으로 거대한 테이블을 가지고 있지 않다는 이유로 더 많은 데이터베이스 호출을 처리해야합니다. –

+0

또한 업데이트 된 답변을 살펴보십시오. 'validates_presence_of : 전자 메일이 아니라면 ... '비트가 작동해야 메모리가 올바르게 작동합니다. –

관련 문제