Відповіді:
Коротка відповідь для старих версій Rails (див. Інші відповіді для Rails 4+):
add_index :table_name, :column_name, unique: true
Щоб індексувати кілька стовпців разом, ви передаєте масив імен стовпців замість одного імені стовпця,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Якщо ви отримаєте "ім'я індексу ... занадто довге", ви можете додати name: "whatever"
до методу add_index, щоб скоротити ім'я.
Для тонкозернистого контролю існує " execute
" метод, який виконує прямий SQL.
Це воно!
Якщо ви робите це як заміна для звичайних перевірок старої моделі, перевірте, як вона працює. Повідомлення про помилку користувачеві, ймовірно, не буде таким приємним без перевірок на рівні моделі. Ви завжди можете робити і те, і інше.
indexed columns are not unique
помилку при спробі створення унікального індексу, це може бути тому, що дані в таблиці вже містять дублікати. Спробуйте видалити повторювані дані та запустіть міграцію знову.
, :name => "whatever"
до add_index
методу, щоб скоротити ім'я.
рейки генерують міграцію add_index_to_table_name column_name: uniq
або
рейки генерують міграцію add_column_name_to_table_name column_name: string: uniq: index
породжує
class AddIndexToModerators < ActiveRecord::Migration
def change
add_column :moderators, :username, :string
add_index :moderators, :username, unique: true
end
end
Якщо ви додаєте індекс до вже наявного стовпця, видаліть або прокоментуйте add_column
рядок або поставте чек
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
і ні add_column...
.
Оскільки про це ще не було сказано, але він відповідає на запитання, яке було у мене, коли я знайшов цю сторінку, ви також можете вказати, що індекс повинен бути унікальним, додаючи його через t.references
або t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(як мінімум на Рейки 4.2.7
)
Я використовую Rails 5, і вищезазначені відповіді чудово працюють; ось ще один спосіб, який також працював для мене (назва таблиці - це :people
і назва стовпця :email_address
)
class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
def change
change_table :people do |t|
t.index :email_address, unique: true
end
end
end
Можливо, ви хочете додати ім'я унікального ключа стільки разів, скільки за замовчуванням ім'я унікального ключа в рейках може бути занадто довгим, для чого БД може викинути помилку.
Щоб додати ім'я до свого індексу, просто скористайтеся name:
опцією. Запит про міграцію може виглядати приблизно так -
add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'
Докладніше - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index
Якщо ви пропустили додати унікальний в стовпчик БД, просто додайте цю перевірку в модель, щоб перевірити, чи унікальне поле:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
див. вище Вище призначено лише для тестування, додайте індекс , змінивши стовпчик БД, як запропонував @Nate
будь ласка, зверніться до цього з індексом для отримання додаткової інформації