Jawaban singkat untuk Rails versi lama (lihat jawaban lain untuk Rails 4+):
add_index :table_name, :column_name, unique: true
Untuk mengindeks beberapa kolom secara bersamaan, Anda meneruskan larik nama kolom alih-alih nama kolom tunggal,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Jika Anda mendapatkan "nama indeks ... terlalu panjang", Anda dapat menambahkan name: "whatever"
metode add_index untuk membuat nama lebih pendek.
Untuk kontrol " execute
" berbutir halus, ada metode " " yang mengeksekusi SQL langsung.
Itu dia!
Jika Anda melakukan ini sebagai pengganti validasi model lama yang biasa, periksa untuk melihat cara kerjanya. Kesalahan pelaporan kepada pengguna kemungkinan tidak akan sebaik tanpa validasi tingkat model. Anda selalu dapat melakukan keduanya.
indexed columns are not unique
kesalahan saat mencoba membuat indeks unik, itu mungkin karena data dalam tabel sudah berisi duplikat. Coba hapus data duplikat dan jalankan migrasi lagi., :name => "whatever"
keadd_index
metode untuk membuat nama yang lebih pendek.atau
menghasilkan
Jika Anda menambahkan indeks ke kolom yang ada, hapus atau komentari
add_column
baris, atau beri tanda centangsumber
add_index...
dan tidakadd_column...
.Karena ini belum disebutkan tetapi menjawab pertanyaan yang saya miliki ketika saya menemukan halaman ini, Anda juga dapat menentukan bahwa indeks harus unik ketika menambahkannya melalui
t.references
ataut.belongs_to
:(setidaknya dari Rails
4.2.7
)sumber
Jika Anda membuat tabel baru, Anda bisa menggunakan pintasan inline:
sumber
Saya menggunakan Rails 5 dan jawaban di atas berfungsi dengan baik; inilah cara lain yang juga berfungsi untuk saya (nama tabel
:people
dan nama kolomnya:email_address
)sumber
Anda mungkin ingin menambahkan nama untuk kunci unik karena berkali-kali nama unique_key default oleh rails bisa terlalu lama sehingga DB dapat melempar kesalahan.
Untuk menambahkan nama untuk indeks Anda cukup gunakan
name:
opsi. Kueri migrasi mungkin terlihat seperti ini -add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Info lebih lanjut - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
sumber
Untuk mengindeks beberapa kolom secara bersamaan, Anda meneruskan larik nama kolom alih-alih satu nama kolom.
sumber
Jika Anda lupa menambahkan unik ke kolom DB, cukup tambahkan validasi ini dalam model untuk memeriksa apakah bidang tersebut unik:
lihat di sini Di atas hanya untuk tujuan pengujian, silakan tambahkan indeks dengan mengubah kolom DB seperti yang disarankan oleh @Nate
silakan merujuk ini dengan indeks untuk informasi lebih lanjut
sumber