Ответы:
Краткий ответ для старых версий 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 имя_ столбца: uniq
или
рельсы генерируют миграцию add_column_name_to_table_name имя_ столбца: строка: uniq: индекс
генерирует
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
(по крайней мере на Rails 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
Возможно, вы захотите добавить имя для уникального ключа, так как много раз имя по умолчанию unique_key по rails может быть слишком длинным, для которого БД может выдать ошибку.
Чтобы добавить имя для вашего индекса, просто используйте 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
пожалуйста, обратитесь к этому с индексом для получения дополнительной информации