Yanıtlar:
Rails'in eski sürümleri için kısa cevap (Rails 4+ için diğer cevaplara bakın):
add_index :table_name, :column_name, unique: true
Birden çok sütunu birlikte dizine eklemek için tek bir sütun adı yerine bir dizi sütun adı geçirirsiniz,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
"Dizin adı ... çok uzun" name: "whatever"
alırsanız, adı kısaltmak için add_index yöntemine ekleyebilirsiniz .
Ayrıntılı denetim için, execute
düz SQL yürüten bir " " yöntemi vardır.
Bu kadar!
Bunu düzenli olarak eski model doğrulamaları için değiştiriyorsanız, nasıl çalıştığını kontrol edin. Kullanıcıya raporlama hatası, model düzeyinde doğrulamalar olmadan iyi olmayabilir. Her ikisini de yapabilirsiniz.
indexed columns are not unique
Benzersiz bir dizin oluşturmaya çalışırken bir hata alırsanız , bunun nedeni tablodaki verilerin yinelenenler içermesi olabilir. Yinelenen verileri kaldırmayı ve taşımayı yeniden çalıştırmayı deneyin.
, :name => "whatever"
için add_index
yönteme ekleyebilirsiniz .
raylar taşıma oluşturur add_index_to_table_name column_name: uniq
veya
raylar geçiş oluşturur add_column_name_to_table_name sütun_adı: string: uniq: index
üretir
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Mevcut bir sütuna bir dizin ekliyorsanız, add_column
satırı kaldırın veya yorum yapın veya bir onay işareti koyun
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
değil add_column...
.
Bu henüz bahsedilmediğinden, ancak bu sayfayı bulduğumda sahip olduğum soruyu yanıtladığından, bir dizinin t.references
veya yoluyla eklerken benzersiz olması gerektiğini de belirtebilirsiniz t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(en azından raylar itibariyle 4.2.7
)
Rails 5 kullanıyorum ve yukarıdaki cevaplar harika çalışıyor; benim için de işe yarayan başka bir yol var (tablo adı :people
ve sütun adı :email_address
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
Benzersiz anahtarın adını, rayların varsayılan unique_key adının DB'nin hata atabileceği kadar uzun olabileceği için eklemek isteyebilirsiniz.
Dizininize ad eklemek için name:
seçeneği kullanın. Taşıma sorgusu şöyle görünebilir -
add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Daha fazla bilgi - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
DB sütununa benzersiz eklemeyi kaçırdıysanız, alanın benzersiz olup olmadığını kontrol etmek için modelde bu doğrulamayı eklemeniz yeterlidir:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
Buraya bakın Yukarıda yalnızca test amaçlıdır, lütfen @Nate tarafından önerilen şekilde DB sütununu değiştirerek dizin ekleyin
daha fazla bilgi için lütfen indeks ile birlikte bakın