복붙노트

[RUBY-ON-RAILS] 여러 열 유효성 검사 고유성

RUBY-ON-RAILS

여러 열 유효성 검사 고유성

실제 기록은 단지 열 고유하고하지 않는 것이 확인 할 수있는 레일 웨이 방법이 있습니까? 예를 들어, 우정 모델 / 테이블처럼 여러 개의 동일한 기록을 할 수 없게한다 :

user_id: 10 | friend_id: 20
user_id: 10 | friend_id: 20

해결법

  1. ==============================

    1.당신은 범위가 validates_uniqueness_of 호출로 다음 수 있습니다.

    당신은 범위가 validates_uniqueness_of 호출로 다음 수 있습니다.

    validates_uniqueness_of :user_id, :scope => :friend_id
    
  2. ==============================

    2.당신은 하나 개의 컬럼에 고유성 유효성을 검사하는 유효성을 확인하고 사용할 수 있습니다 :

    당신은 하나 개의 컬럼에 고유성 유효성을 검사하는 유효성을 확인하고 사용할 수 있습니다 :

    validates :user_id, uniqueness: {scope: :friend_id}
    

    여러 열에서 유효성 검사에 대한 구문은 비슷하지만, 당신은 필드의 배열을 대신 제공해야한다 :

    validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}
    

    그러나 검증은 위의 경쟁 조건을 가지고 일관성을 보장 할 수 없습니다 같이 접근한다. 다음 예를 살펴 보겠습니다 :

    행동의이 종류를 방지하기 위해, 하나는 DB 테이블에 고유 제한 조건을 추가해야합니다. 당신은 하나 (또는 ​​복수) 필드 (들) 다음 마이그레이션을 실행하여 대한 add_index 등 도우미로 설정할 수 있습니다 :

    class AddUniqueConstraints < ActiveRecord::Migration
      def change
       add_index :table_name, [:field1, ... , :fieldn], unique: true
      end
    end
    

    경고 : 당신이 고유 제한 조건을 설정 한 후에도 두 개 이상의 동시 요청이 DB에 동일한 데이터를 작성하려고하지만, 대신에 중복 레코드를 만드는이는 액티브 :: RecordNotUnique 예외를 올릴 것이다, 별도로 처리해야한다 :

    begin
    # writing to database
    rescue ActiveRecord::RecordNotUnique => e
    # handling the case when record already exists
    end 
    
  3. ==============================

    3.이것은 두 개의 열에서 데이터베이스 제약 수행 할 수 있습니다 :

    이것은 두 개의 열에서 데이터베이스 제약 수행 할 수 있습니다 :

    add_index 등 : 우정, [: USER_ID : friend_id], 독특한 : 사실

    당신은 레일 유효성 검사기를 사용할 수 있지만 일반적으로 나는 데이터베이스 제약 조건을 사용하는 것이 좋습니다.

    더 읽기 : https://robots.thoughtbot.com/validation-database-constraint-or-both

  4. from https://stackoverflow.com/questions/4870961/validate-uniqueness-of-multiple-columns by cc-by-sa and MIT license