당신은 테이블을
add_index :users_roles, [ :user_id, :role_id ], :unique => true, :name => 'by_user_and_role'
보고 가입 고유성 추가 할 수 있습니다 (물론 이름과 설명이 열 값이다의) In a join table, what's the best workaround for Rails' absence of a composite key?
당신이 다음 예외가 발생합니다 데이터베이스, 다루다.
나는이 사건에 대한 레일 유효성 검사를 사용하기 위해 준비 모르겠지만,이 같은 자신의 유효성 검사를 추가 할 수 있습니다
class User < ActiveRecord::Base
has_and_belongs_to_many :roles, :before_add => :validates_role
난 그냥 자동으로 데이터베이스 호출을 삭제하고 성공을보고 할 것입니다.
def validates_role(role)
raise ActiveRecord::Rollback if self.roles.include? role
end
ActiveRecord :: Rollback은 내부적으로 캡처되었지만 다시로드되지 않습니다.
편집
내가 지정 유효성 검사을 추가 해요 부분을 사용하지 마십시오. 다소 효과가 있지만 더 좋은 대안이 있습니다. @Spyros으로 협회에
사용 :uniq
옵션은 다른 답변에서 제안 :
class Parts < ActiveRecord::Base
has_and_belongs_to_many :assemblies, :uniq => true, :read_only => true
end
(이 코드는 레일 가이드 3 절에서)입니다. Rails Guides v 3.2.13에서 읽기 4.4.2.19 찾기 : uniq
Rails Guide v.4에서는 가능한 경쟁 조건으로 인해 고유성 검사에 대해 include?
을 사용하는 것에 대해 경고합니다.
조인 테이블에 인덱스를 추가하는 부분이 유지됩니다.
감사합니다. 나는 HABTM 사용자와 그룹 (본질적으로 같은 종류의 역할 설정)을 위해 이것을 사용했다. – dennismonsewicz
': has_many'와는 달리 중복 제거가 habtm 연관에 대해 자동으로 처리되지 않는다는 점을 조금은 엿 봅니다. 편집 후 – prusswan
이 게시되었습니다. 이 답변을 게시하고 잊어 버렸습니다. 그리고 나서 나는 관련된 문제를 발견했고 나는 사람들이 상향 투표를하는 대답을 가지고 있다는 것을 기억했고 나는 그것과 OMG를 점검했다! 나는 무엇을 생각하고 있었느냐! 내 대답을 사용했기 때문에 아무도 문제가 없기를 바랍니다. 나는 그것없이 충분히 나쁘다고 느낀다. 우리 모두에게 그것이 교훈입니다. 당신은 Stackoverflow에 서둘러 답답한 대답을두고 그것에 대해 잊어 버릴거야하지만 시간이 올 것이다 그것이 당신에게 튀어 나와 엉덩이에 물린거야. –