나는 다음 있습니다.레일은 일대일 관계
내가 원하는 것은 사용자가 단 하나의 자동차 만 가질 수 있도록하기 위해서입니다. 그것은 그가 자신에게 할당 된 차를 만든다면 그는 두 번째 차를 만들 수 없다는 것을 의미합니다.
어떻게이 작업을 수행 할 수 있습니까?
나는 다음 있습니다.레일은 일대일 관계
내가 원하는 것은 사용자가 단 하나의 자동차 만 가질 수 있도록하기 위해서입니다. 그것은 그가 자신에게 할당 된 차를 만든다면 그는 두 번째 차를 만들 수 없다는 것을 의미합니다.
어떻게이 작업을 수행 할 수 있습니까?
사용자가 자동차를 추가하기 전에 테스트하지 않는 이유는 무엇입니까?
if worker.car
raise "sorry buddy, no car for you"
else
car = Car.create(user_id: worker.id)
end
고마워. – cgf
:
class User < ActiveRecord::Base
has_one :car
class Car < ActiveRecord::Base
belongs_to :worker, :class_name => 'User', :foreign_key => 'user_id'
을 그리고 당신은 당신이 찾고있는 무엇을 설정합니다. 참조 : http://guides.rubyonrails.org/association_basics.html#the-has-one-association
분명히 이것을 달성하는 몇 가지 다른 방법이 있습니다. 해당 테이블에서 복합 키 인덱스를 생성하여 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에 관한 한 "유효하지 않은"데이터가 생깁니다.
여기 http://rubyonrailsthrissur.wordpress.com/2012/07/19/one-to-one-relation-in-rails/ 가장 실용적인 설명 – montells