2012-09-27 3 views
1

내 레일 프로젝트에는 두 가지 모델 (및 테이블)이 있습니다. 각 모델에는 "주소"필드가 있습니다.ActiveRecord - 테이블간에 중복 된 항목을 방지합니다.

현재 각 모델에서 주소의 고유성을 확인하도록 코드를 설정했으며 동일한 데이터를 저장하려는 여러 연결의 경우 중복을 방지하기 위해 각 테이블에 주소 색인이 있습니다.

그러나 Address 필드가 두 테이블에서 고유 한 인지 확인하고 싶습니다. 에서처럼 주소가 한 테이블에 있으면 두 번째 테이블에 저장할 수 없습니다.

그 코드를 해결하는 것이 어렵지는 않지만 비 고유 값이 저장되지 않도록 데이터베이스 수준 (인덱스와 유사)에서이 검사를 어떻게 구현합니까?

+1

«데이터베이스 수준»에 대한 질문은 태그 및 제목을 업데이트하고 DBMS를 지정하는 것이 좋습니다. 그것은 MySQL의 경우 - http://stackoverflow.com/questions/1452097/implementing-unique-across-linked-tables-in-mysql. 하지만 난 오히려 사용자 정의 검증 방법으로 이것을 해결할 것입니다 - 매우 간단합니다. – jibiel

+0

데이터베이스 디자인이 잘못되었습니다. http://en.wikipedia.org/wiki/Database_normalization –

답변

0

두 테이블 모두에 사용자 정의 유효성 검사기를 작성하십시오. custom validation rails guide은 시작하기에 좋은 곳입니다. 사용자 정의 유효성 검사기에서 값이 이미 다른 테이블 주소 필드에 있으면 오류를 발생시킬 수 있습니다.

+0

데이터베이스 수준에서이 고유성을 적용 할 수 있기를 정말로 바랬지 만 사용자 지정 유효성 검사가 내가 할 수있는 최선의 방법이라고 생각합니다. – Bryce

2

독자적으로 고유성을 유지할 책임이있는 주소 테이블을 만드는 것이 가장 좋을 것입니다. 다른 모델에 주소 필드를 유지하는 대신 연결을 제공하십시오. 다음과 같이 수행 할 수 있습니다.

class Home < ActiveRecord::Base 
    belongs_to :address 
end 

class Office < ActiveRecord::Base 
    belongs_to :address 
end 

class Address < ActiveRecord::Base 
    attr_accessible :body 
    validates :body, uniqueness: true 

    has_many :homes 
    has_may :offices 
end 
+0

나는 협회에 익숙하지만,이 경우에는 저에게 맞지 않을 것입니다. 문제를 해결할 방법이 있습니까? – Bryce

관련 문제