Bagaimana menerapkan indeks unik pada dua kolom dalam rel

96

Saya memiliki tabel dan saya mencoba menambahkan indeks unik pada dua kolom. Kolom tersebut juga diindeks. Jadi pertanyaan saya adalah apakah saya bisa menghapus indeks yang hanya untuk satu kolom atau jika saya harus menggunakan ketiga indeks:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true
Markus
sumber
5
Sebagai catatan tambahan: Jika Anda menggunakan MySQL, tidak masuk akal untuk memiliki used_iddan content_iddalam indeks terpisah jika Anda juga memiliki indeks unik dari kedua kolom. Ini mungkin juga berlaku untuk DB lain ... Bertentangan dengan apa yang Anda harapkan, ini akan berdampak negatif pada kinerja (terutama penyisipan / pembaruan).
hurikhan77

Jawaban:

189
add_index :subscriptions, [:user_id, :content_id], unique: true
shingara
sumber
6
Ada sintaks alternatif juga: add_index: subscription, [: user_id,: content_id],: unique => true add_index: subscription,% w (user_id content_id),: unique => true Keduanya sama, hanya sintaks yang berbeda untuk menentukan kolom.
François Beausoleil
14
@ FrançoisBeausoleil %w(user_id content_id)dalam ruby ​​hanya membuat deretan string, tidak khusus untuk rails. Anda dapat melakukan hal yang sama dengan "user_id content_id".splitmembuat array string. Saya yakin Anda tahu ini, komentar ini hanya agar pembaca lain tidak salah mengaitkannya dengan rel :)
Khaja Minhajuddin
Apa yang akan menjadi sintaks untuk pembuatan tabel ini? <- jawaban yang ditemukan ( stackoverflow.com/questions/4870961/… )
tnaught
Saya mengalami masalah aneh setelah menggunakan ini. Tidak dapat menjalankan migrasi baru menggunakan rake db: migrate. Hanya dapat menjalankan migrasi menggunakan nomor versi rake db: migrate: up VERSION = 20180411062714 satu file dalam satu waktu. Saya sudah memiliki data pada tabel di mana saya melakukan unique true pada dua kolom.
decodes
1
@ FrançoisBeausoleil Sebenarnya mereka tidak sama, %w(user_id content_id)adalah Array of Strings. Yang sama dengan ['user_id', 'content_id']. Notasi yang berbeda untuk Array of Symbols adalah %i(user_id content_id), atau seperti yang ditulis oleh OP[:user_id, :content_id]
Sasa Blagojevic