Jawaban:
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"
ke add_index
metode untuk membuat nama yang lebih pendek.
rails menghasilkan migrasi add_index_to_table_name column_name: uniq
atau
rails menghasilkan migrasi add_column_name_to_table_name column_name: string: uniq: index
menghasilkan
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Jika Anda menambahkan indeks ke kolom yang ada, hapus atau komentari add_column
baris, atau beri tanda centang
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
dan tidak add_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
atau t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(setidaknya dari Rails 4.2.7
)
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
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
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
Jika Anda lupa menambahkan unik ke kolom DB, cukup tambahkan validasi ini dalam model untuk memeriksa apakah bidang tersebut unik:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
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