Programing

Ruby on Rails ActiveRecord 마이그레이션에서 너무 긴 색인 이름을 어떻게 처리합니까?

lottogame 2020. 2. 28. 18:36
반응형

Ruby on Rails ActiveRecord 마이그레이션에서 너무 긴 색인 이름을 어떻게 처리합니까?


네 개의 관련 테이블의 외래 키에서 생성되는 고유 인덱스를 추가하려고합니다.

add_index :studies,
  ["user_id", "university_id", "subject_name_id", "subject_type_id"],
  :unique => true

인덱스 이름에 대한 데이터베이스 제한으로 인해 마이그레이션이 실패합니다. 오류 메시지는 다음과 같습니다.

테이블 'studies'의 인덱스 이름 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id'가 너무 깁니다. 한도는 64 자입니다

이것을 어떻게 처리 할 수 ​​있습니까? 다른 색인 이름을 지정할 수 있습니까?


다음 과 같은 :name옵션을 제공하십시오 add_index.

add_index :studies,
  ["user_id", "university_id", "subject_name_id", "subject_type_id"], 
  :unique => true,
  :name => 'my_index'

블록 에서 :index옵션을 사용하는 경우 과 동일한 옵션 해시를 사용합니다.referencescreate_tableadd_index

t.references :long_name, index: { name: :my_index }

create_table블록 내의 열 정의에서 색인 이름을 변경할 수도 있습니다 (예 : 마이그레이션 생성기에서 가져옴).

create_table :studies do |t|
  t.references :user, index: {:name => "index_my_shorter_name"}
end

PostgreSQL 에서 기본 제한은 63 자 입니다. 인덱스 이름은 고유해야하기 때문에 약간의 규칙이있는 것이 좋습니다. 나는 (더 복잡한 구조를 설명하기 위해 예를 조정했다) :

def change
  add_index :studies, [:professor_id, :user_id], name: :idx_study_professor_user
end

일반적인 색인은 다음과 같습니다.

:index_studies_on_professor_id_and_user_id

논리는 다음과 같습니다.

  • index 된다 idx
  • 단수 테이블 이름
  • 참여 단어가 없습니다
  • 아니 _id
  • 알파벳 순서

일반적으로 어떤 일을합니까?


당신은 또한 할 수 있습니다

t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')

Ruby on Rails API 에서와 같이 .


이전 답변과 비슷합니다. 일반 add_index 줄에 'name'키를 사용하십시오.

def change
  add_index :studies, :user_id, name: 'my_index'
end

참고 URL : https://stackoverflow.com/questions/5443740/how-do-i-handle-too-long-index-names-in-a-ruby-on-rails-activerecord-migration



반응형