>

채팅 조인 테이블을 만들려고 할 때 문제가 있습니다. 여기에는 user_id1과 user_id2의 두 user_id가 있습니다. user_id1이 1이고 user_id2가 2 일 때의 고유성 유효성 검증을 얻을 수 있습니다. 정확한 속성으로 더 이상 대화를 만들 수 없습니다. 하지만 매치 메이킹 검색을 수행하기 때문에 때때로 user_id1이 2이고 user_id2가 1 인 곳에서 일치하는 결과가 발생합니다.

데이터베이스 수준에서이 두 가지 사이의 고유성 제약 조건을 찾고 있는데 찾을 수없는 것 같습니다. 모델 수준에서 사용자 지정 유효성 검사를 만들어야한다고 생각합니다.이 유효성 검사는 데이터베이스 수준에서 수행 할 수있는 방법이 있습니까? 아니면 이것에 접근하는 더 좋은 방법이 있습니까? 미리 감사드립니다.

tl;dr :

a = 1, b = 2

b = 1, a = 2에 대한 제약이 필요합니다.

  • 답변 # 1

    이 작업을 수행하는 일반적인 방법은 표현식에서 인덱스를 작성하고 greatest 를 사용하는 것입니다.  그리고 least  열 순서를 무시하는 표현식을 작성하는 함수입니다. 귀하의 경우 다음과 같은 색인을 원합니다 :

    create unique index whatever_you_want_to_call_it
    on your_table(greatest(user_id1, user_id2), least(user_id1, user_id2))
    
    

    ActiveRecord가 그러한 인덱스를 생성하도록하는 방법을 모릅니다. 또는 schema.rb 에 저장되지 않습니다. . 이러한 문제점에 대한 임시 해결책은 SQL 스키마로 전환하고 마이그레이션에서 색인을 수동으로 작성하는 것입니다. db/schema.rb 에서 전환하려면   db/structure.sqlconfig/application.rb 에서 설정을 업데이트하십시오. :

    config.active_record.schema_format = :sql
    
    

    이주에서 색인을 생성하십시오 :

    def up
      connection.execute(%q{
        create unique index whatever_you_want_to_call_it
        on your_table(greatest(user_id1, user_id2), least(user_id1, user_id2))
      })
    end
    
    

    그러면 db/schema.rb 를 버릴 수 있습니다  (더 이상 사용되지 않으므로) db/structure.sql 로 작업을 시작하십시오.  대신에. 다른 레이크 작업을 시작하고 싶을 수도 있습니다 :

    db:structure:dump   db:schema:dump 대신

    db:structure:load   db:schema:load 대신

  • 이전 android - 프로그래밍 방식으로 생성 된 확인란의 값을 다음 액티비티로 이전 하시겠습니까?
  • 다음 visual studio - TFS가 연결되지 않는 이유 오류 503 서비스가 일시적으로 과부하되었습니다