3

여러 개의 has_and_belongs_to_many 연관이 있고 중복 키와 관련된 MySQL 오류를 피하기 위해 연관에 uniq 옵션을 사용했습니다. 내 협회는 다음과 같습니다 : I 추가has_and_belongs_to_many 연관 테이블의 고유 인덱스가 "중복 항목"생성 실패

has_and_belongs_to_many :people, :uniq => true 

인덱스 내가 사용하여 추가 분단 기본 키 다음 assocation의 양쪽에

add_index :table_name, [:key_1, :key_2], :unique => true 

. 그러나 객체를 두 번 연결하려고하면 MySQL에서 생성 된 Mysql2::Error: Duplicate entry '1-9' for key... 오류가 발생합니다. 이 문제를 해결할 현명한 방법이 있습니까?

나는 몇 가지 가능한 해결책을 생각했지만 똑똑하지 않습니다. :insert_sql 옵션을 사용하여 INSERT 쿼리를 수동으로 변경하는 방법을 생각했지만 20 개의 연관 테이블에 대해 많은 작업이 필요했습니다. 이 문제를 해결할 더 좋은 방법이 있습니까?

답변

3

uniq 옵션은 복제본이 추가되는 것을 방지하기 위해 매우 열심히 시도하지 않습니다. 연관성이로드되면 객체가 이미 거기에 있는지 확인하지만 검사하기 위해 연관을로드하지 않습니다.

가장 쉬운 것은 아마 ActiveRecord::RecordNonUnique를 구출하고 적절하게 대처하지 - 상관없이 당신의 루비 수준의 검사는 항상

+1

내가 어떻게 할 수있는 데이터베이스가 잡힐 경쟁 조건의 기회가있을거야 얼마나 조심 일을 지키기 위해 중앙 위치에서 이것을합니까? 나는이 20 개의 다른 장소에서이 오류를 재현하고 싶지 않다. – davidb

+0

이 질문에 새 스레드 개설 => http://stackoverflow.com/questions/8644577/how-to-rescue-exception-central-and-dry – davidb

관련 문제