[RUBY-ON-RAILS] 어떻게 루비 레일에 액티브 마이그레이션에 너무 오래 인덱스 이름을 처리 할 수 있습니까?
RUBY-ON-RAILS어떻게 루비 레일에 액티브 마이그레이션에 너무 오래 인덱스 이름을 처리 할 수 있습니까?
나는 네 개의 관련 테이블의 외래 키에서 작성되는 고유 인덱스를 추가하는 것을 시도하고있다 :
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
인덱스 이름에 대한 데이터베이스의 제한은 마이그레이션이 실패합니다. 다음 오류 메시지는 다음과 같습니다
나는이 문제를 어떻게 처리 할 수 있습니까? 나는 다른 인덱스 이름을 지정할 수 있습니까?
해결법
-
==============================
1.예컨대 add_index 등에 이름 옵션 : 다음을 제공합니다
예컨대 add_index 등에 이름 옵션 : 다음을 제공합니다
add_index :studies, ["user_id", "university_id", "subject_name_id", "subject_type_id"], :unique => true, :name => 'my_index'
사용하는 경우 : a CREATE_TABLE 블록 참조에 인덱스 옵션을, 그것의 값으로 add_index 등과 같은 옵션 해시를 취합니다
t.references :long_name, index: { name: :my_index }
-
==============================
2.당신은 또한 (마이그레이션 발생기로부터 얻을 수 등)를 CREATE_TABLE 블록 내에서 열 정의에 인덱스 이름을 변경할 수 있습니다.
당신은 또한 (마이그레이션 발생기로부터 얻을 수 등)를 CREATE_TABLE 블록 내에서 열 정의에 인덱스 이름을 변경할 수 있습니다.
create_table :studies do |t| t.references :user, index: {:name => "index_my_shorter_name"} end
-
==============================
3.PostgreSQL의에서 기본 한도는 63 자입니다. 인덱스 이름은 고유해야하기 때문에 그것은 약간의 규칙을 가지고하는 것이 좋다. 나는 (내가 좀 더 복잡한 구조를 설명하기 위해 예를 쥐게)를 사용합니다 :
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
논리는 다음과 같습니다
어떤 일반적으로 작업을 수행합니다.
-
==============================
4.당신은 또한 할 수있다
당신은 또한 할 수있다
t.index([:branch_id, :party_id], unique: true, name: 'by_branch_party')
루비 온 레일스 API에있다.
-
==============================
5.이전의 대답과 유사 : 그냥 일반 add_index 등 라인 '이름'키를 사용 :
이전의 대답과 유사 : 그냥 일반 add_index 등 라인 '이름'키를 사용 :
def change add_index :studies, :user_id, name: 'my_index' end
-
==============================
6.나는하지만 타임 스탬프 기능이 문제를 가지고 있었다. 그것은 63 자 제한을 초과 updated_at에 인덱스를로 자동으로 생성되었다 :
나는하지만 타임 스탬프 기능이 문제를 가지고 있었다. 그것은 63 자 제한을 초과 updated_at에 인덱스를로 자동으로 생성되었다 :
def change create_table :toooooooooo_loooooooooooooooooooooooooooooong do |t| t.timestamps end end
나는 인덱스 이름을 지정하는 타임 스탬프를 사용하려고 :
def change create_table :toooooooooo_loooooooooooooooooooooooooooooong do |t| t.timestamps index: { name: 'too_loooooooooooooooooooooooooooooong_updated_at' } end end
그러나이 시도는 모두 updated_at과 created_at 필드에 인덱스 이름을 적용합니다 :
마지막으로 나는 타임 스탬프에 포기하고 그냥가 먼 길을 타임 스탬프를 생성 :
def change create_table :toooooooooo_loooooooooooooooooooooooooooooong do |t| t.datetime :updated_at, index: { name: 'too_long_on_updated_at' } t.datetime :created_at, index: { name: 'too_long_on_created_at' } end end
작동하지만 나는 그것이 타임 스탬프 방법으로 가능하다면 듣고 싶어요이!
from https://stackoverflow.com/questions/5443740/how-do-i-handle-too-long-index-names-in-a-ruby-on-rails-activerecord-migration by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 자바에 대한 마이그레이션 (0) | 2020.02.12 |
---|---|
[RUBY-ON-RAILS] 루비는 사용자 지정 특성을 가진 f.select 옵션을 레일 (0) | 2020.02.12 |
[RUBY-ON-RAILS] 레일 메모리 누출 감지 루비 / 루비 (0) | 2020.02.12 |
[RUBY-ON-RAILS] 레일 4 : before_filter 대 before_action (0) | 2020.02.12 |
[RUBY-ON-RAILS] 레일 다음 respond_to 블록 작업을 수행하는 방법? (0) | 2020.02.12 |