2013-02-26 1 views
5

나는 다음 있습니다.레일은 일대일 관계

내가 원하는 것은 사용자가 단 하나의 자동차 만 가질 수 있도록하기 위해서입니다. 그것은 그가 자신에게 할당 된 차를 만든다면 그는 두 번째 차를 만들 수 없다는 것을 의미합니다.

어떻게이 작업을 수행 할 수 있습니까?

+0

여기 http://rubyonrailsthrissur.wordpress.com/2012/07/19/one-to-one-relation-in-rails/ 가장 실용적인 설명 – montells

답변

2

사용자가 자동차를 추가하기 전에 테스트하지 않는 이유는 무엇입니까?

if worker.car 
raise "sorry buddy, no car for you" 
else 
car = Car.create(user_id: worker.id) 
end 
+0

고마워. – cgf

14

분명히 이것을 달성하는 몇 가지 다른 방법이 있습니다. 해당 테이블에서 복합 키 인덱스를 생성하여 user_id가 테이블에서 고유하도록하는 것이 좋습니다. 이렇게하면 한 번만 표시됩니다. 마이그레이션에서 이와 같은 것을 작성할 수 있습니다.

add_index(:cars, :worker_id, :unique => true) 

첫 번째 인수는 테이블 이름입니다 (일반적으로 클래스 이름의 복수형 버전 임). 필드 이름이 두 번째입니다. 유일한 사실은 여분의 행을 삽입하지 못하게하는 것입니다.

참고 : 이것은 데이터베이스 수준 제약 조건입니다. 유효성 검사가 그것을 잡지 못해서 이걸 치면 오류가 발생합니다.

이 솔루션 외에도 자동차 모델 자체에 유효성 검사를 추가 할 수 있습니다.

validates_uniqueness_of :worker_id, message: "can not have more than one car" 

이 오류는 '근로자 ID가 두 대 이상의 자동차를 가질 수 없습니다.'와 같이 표시됩니다. 이 작업자 ID를 사용자 정의 할 가능성이 가장 높습니다. 이를 수행하는 방법은 post을 참조하십시오.

확실히 db 제약 조건을 적용 할 필요는 없지만 다른 사람이 DB에 삽입하는 경우에는 좋은 생각입니다. 그렇지 않으면 Rails에 관한 한 "유효하지 않은"데이터가 생깁니다.