Program Tip

Rails : 3 개 열의 고유 한 조합 확인

programtip 2020. 11. 30. 19:46
반응형

Rails : 3 개 열의 고유 한 조합 확인


안녕하세요, 내 테이블에서 3 개 열의 고유 한 조합을 확인하고 싶지 않습니다.

: brand, : model_name 및 : fuel_type 값을 가진 cars라는 테이블이 있다고 가정 해 보겠습니다.

내가 원하는 것은 레코드가 이들 3의 조합을 기반으로 고유한지 확인하는 것입니다. 예 :

    brand    model_name    fuel_type
    Audi     A4            Gas
    Audi     A4            Diesel
    Audi     A6            Gas

모두 유효해야합니다. 그러나 'Audi, A6, Gas'가 포함 된 다른 레코드는 유효하지 않아야합니다.

이 유효성 검사에 대해 알고 있지만 실제로 내가 원하는 것을 수행하는지 의심됩니다.

    validates_uniqueness_of :brand, :scope => {:model_name, :fuel_type}

코드 조각에 구문 오류가 있습니다. 올바른 유효성 검사는 다음과 같습니다.

validates_uniqueness_of :car_model_name, :scope => [:brand_id, :fuel_type_id]

또는 루비 1.9.x에서는 더 짧습니다.

validates_uniqueness_of :car_model_name, scope: [:brand_id, :fuel_type_id]

4 레일 당신은 사용할 수 있습니다 :

validates :car_model_name, uniqueness: { scope: [:brand_id, :fuel_type_id] }

5 레일 당신은 사용할 수 있습니다

validates_uniqueness_of :car_model_name, scope: %i[brand_id fuel_type_id]

필요에 따라 모델 유효성 검사 대신 제약 조건을 추가 할 수도 있습니다 (테이블 생성 마이그레이션의 일부로 또는 별도의 항목으로).

add_index :the_table_name, [:brand, :model_name, :fuel_type], :unique => true

여러 데이터베이스 연결이 동시에 쓰기 작업을 수행하는 경우 데이터베이스 수준에 고유 제약 조건을 추가하는 것이 좋습니다.


나는 이렇게 만들 것이다 :

validates_uniqueness_of :model_name, :scope => {:brand_id, :fuel_type_id}

나에게 더 의미가 있기 때문입니다.

  • "브랜드"와 "연료 유형"의 조합에 대해 중복 된 "모델 이름"이 있어서는 안됩니다.
  • "모델명"과 "연료 유형"의 조합에 대해 중복 된 "브랜드"가 없어야합니다.

그러나 그것은 주관적인 의견입니다.

물론 brand와 fuel_type이 다른 모델과의 관계라면 (그렇지 않다면 "_id"부분을 삭제하십시오). 고유성 유효성 검사를 사용하면 비 DB 열을 확인할 수 없으므로 모델에서 외래 키의 유효성을 검사해야합니다.

어떤 속성의 유효성을 검사할지 정의해야합니다. 한 번에 모두 유효성을 검사하지 않고 원하는 경우 모든 속성에 대해 별도의 유효성 검사를 만들어야하므로 사용자가 실수를하고 중복 된 레코드를 만들려고 할 때 오류를 표시합니다. 잘못된 필드 근처의 양식.


Rails 4에 새로운 해시 패턴이있는 올바른 코드

validates :column_name, uniqueness: {scope: [:brand_id, :fuel_type_id]}

이 유효성 검사 방법을와 함께 사용 ActiveRecord::Validations#save한다고해서 중복 레코드 삽입이 없음이 보장되지는 않습니다. 응용 프로그램 수준의 고유성 검사는 본질적으로 경쟁 조건에 취약하기 때문입니다.

이는 '직렬화 가능'격리 수준으로 트랜잭션을 사용하는 경우에도 발생할 수 있습니다. 이 문제를 해결하는 가장 좋은 방법은를 사용하여 데이터베이스 테이블에 고유 인덱스를 추가하는 것 ActiveRecord::ConnectionAdapters::SchemaStatements#add_index입니다. 드물게 경쟁 조건이 발생하는 경우 데이터베이스는 필드의 고유성을 보장합니다.

참고 URL : https://stackoverflow.com/questions/7428872/rails-validate-unique-combination-of-3-columns

반응형