Rails : 두 열의 고유성 확인 (함께)


답변:


230

옵션 과 함께 고유성 유효성 검사를 사용할 수 있습니다 scope.

또한 작성하기 전에 동시에 검사 할 때 새 레코드가 유효성 검사를 통과하지 못하도록 DB에 고유 인덱스를 추가해야합니다.

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end

인덱스의 경우 +1이지만 unique인식되지 않는 경우 -1입니다 . 그 부분에 대해서는 아래 답변을 사용했습니다.
Aleks

7
예, 죄송합니다. 유효성 검사 키는이 uniqueness아니 어야합니다 unique. 링크 된 문서를 참조하십시오. 답을 수정합니다.
tompave

1
흠, 좋네요, 감사합니다 :) 반복해서 말씀 드리면, 인덱스를 넣으면이 답변을 찾기 전에 제가 실행해온 다른 "코딩"솔루션과 마찬가지로 솔루션을 다음 단계로 끌어 올릴 수 있습니다. +1
Aleks

70

위의 모든 답변에는 모델에서 여러 속성의 고유성을 확인하는 방법이 없습니다. 아래 코드는 범위에서 여러 속성을 사용하는 방법을 알려줍니다.

validates :country, uniqueness: { scope: [:medium, :another_medium] }

country값이있는 모든 행에서의 고유성을 확인합니다 . mediumanother_medium

참고 : 위 열에 인덱스를 추가하는 것을 잊지 마십시오. 이렇게하면 빠른 검색이 보장되고 고유 레코드에 대한 DB 수준 유효성 검사가 추가됩니다.

업데이트 : 테이블 생성 중 인덱스 추가

t.index [:medium, :another_medium], unique: true

41

:scope다음과 같이 유효성 검사기에 매개 변수를 전달할 수 있습니다 .

validates_uniqueness_of :medium, scope: :country

더 많은 예제 는 설명서 를 참조하십시오 .


8
@DennisBest 그것은 "작동"하지만 경쟁 조건으로부터 보호하지 않습니다. 두 클라이언트가 동시 요청을하는 경우 둘 다 데이터베이스에 커밋되지 않으면 다른 클라이언트의 유효성이 검사되기 전에 둘 다 유효성 검사를 통과 할 수 있습니다. tompave의 답변과 같이 데이터베이스 고유 제약 조건도 필요합니다.
soupdog 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.