Краткий ответ для старых версий 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_column
строку или поставьте галочкуисточник
add_index...
и нетadd_column...
.Поскольку это еще не было упомянуто, но отвечает на вопрос, который у меня возник, когда я нашел эту страницу, вы также можете указать, что индекс должен быть уникальным при добавлении его через
t.references
илиt.belongs_to
:(по крайней мере на Rails
4.2.7
)источник
Если вы создаете новую таблицу, вы можете использовать встроенный ярлык:
источник
Я использую Rails 5, и приведенные выше ответы прекрасно работают; вот еще один способ, который также работал для меня (имя таблицы
:people
и имя столбца:email_address
)источник
Возможно, вы захотите добавить имя для уникального ключа, так как много раз имя по умолчанию 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
источник
Чтобы индексировать несколько столбцов вместе, вы передаете массив имен столбцов вместо одного имени столбца.
источник
Если вы пропустили добавление уникальности в столбец БД, просто добавьте эту проверку в модель, чтобы проверить, является ли поле уникальным:
см. здесь Выше только для целей тестирования, пожалуйста, добавьте индекс , изменив столбец БД, как предложено @Nate
пожалуйста, обратитесь к этому с индексом для получения дополнительной информации
источник