Saya mencoba menambahkan indeks unik yang dibuat dari kunci asing dari empat tabel terkait:
add_index :studies,
["user_id", "university_id", "subject_name_id", "subject_type_id"],
:unique => true
Keterbatasan database untuk nama indeks menyebabkan migrasi gagal. Inilah pesan kesalahannya:
Nama indeks 'index_studies_on_user_id_and_university_id_and_subject_name_id_and_subject_type_id' pada tabel 'studi' terlalu panjang; batasnya adalah 64 karakter
Bagaimana saya bisa menangani ini? Bisakah saya menentukan nama indeks yang berbeda?
remove_index :studies, :name => 'my_index'
untuk siapa saja yang membutuhkannya4.2.6
bekerja denganindex: { name: :my_index }
. Hanyaname
saja tidak berhasil.Anda juga dapat mengubah nama indeks dalam definisi kolom dalam sebuah
create_table
blok (seperti yang Anda dapatkan dari generator migrasi).sumber
create_table
t.references :searchable, polymorphic:true, index: {:name => "index_searches_on_searchable"}
dalam hal ini indeks sebenarnya multi-kolom (searchable_id dan searchable_type) dan penambahan namespace dalam nama yang dihasilkan menjadi sangat panjang .foreign_key: true
, ini adalah solusi hebat karena ini adalah yang termudah untuk digunakan ketika Anda memiliki file migrasi yang dibuat denganmodel:references
format generator railsDalam PostgreSQL, yang standar batas adalah 63 karakter . Karena nama indeks harus unik, senang memiliki sedikit konvensi. Saya menggunakan (saya mengubah contoh untuk menjelaskan konstruksi yang lebih kompleks):
Indeks normal adalah:
Logikanya adalah:
index
menjadiidx
_id
Yang biasanya melakukan pekerjaan.
sumber
Anda juga bisa melakukannya
seperti pada Ruby on Rails API .
sumber
Mirip dengan jawaban sebelumnya: Cukup gunakan kunci 'nama' dengan baris add_index reguler Anda:
sumber
Saya khawatir tidak ada solusi yang bekerja untuk saya. Mungkin karena saya menggunakan
belongs_to
migrasi create_table untuk asosiasi polimorfik.Saya akan menambahkan kode saya di bawah ini dan tautan ke solusi yang membantu saya kalau-kalau ada orang lain ketika mencari 'Nama indeks terlalu panjang' sehubungan dengan asosiasi polimorfik.
Kode berikut ini TIDAK bekerja untuk saya:
Kode ini tidak berfungsi untuk saya:
Ini adalah T&J SO yang membantu saya: https://stackoverflow.com/a/30366460/3258059
sumber
Saya punya masalah ini, tetapi dengan
timestamps
fungsi. Itu membuat indeks secara otomatis pada updated_at yang melebihi batas 63 karakter:Saya mencoba menggunakan
timestamps
untuk menentukan nama indeks:Namun, ini mencoba menerapkan nama indeks untuk bidang
updated_at
dancreated_at
:Akhirnya saya menyerah
timestamps
dan baru saja membuat cap waktu:Ini bekerja tetapi saya ingin mendengar jika itu mungkin dengan
timestamps
metode ini!sumber
create_table: you_table_name do | t | t.referensi: pelajar, indeks: {name: 'name_for_studant_index'} t.referensi: guru, indeks: {name: 'name_for_teacher_index'} akhir
sumber
Saya punya proyek yang banyak menggunakan generator dan memerlukan ini otomatis, jadi saya menyalin
index_name
fungsi dari sumber rel untuk menimpanya. Saya menambahkan ini diconfig/initializers/generated_index_name.rb
:Itu menciptakan indeks seperti
ix_assignments_on_case_id__project_id
dan hanya memotongnya menjadi 63 karakter jika masih terlalu panjang. Itu masih akan menjadi non-unik jika nama tabel sangat panjang, tetapi Anda dapat menambahkan komplikasi seperti memperpendek nama tabel secara terpisah dari nama kolom atau benar-benar memeriksa keunikannya.Catatan, ini dari proyek Rails 5.2; jika Anda memutuskan untuk melakukan ini, salin sumber dari versi Anda.
sumber