Как сделать столбец уникальным и индексировать его в миграции Ruby on Rails?
Я хотел бы сделать колонки unique
в сценарии миграции Ruby on Rails. Как лучше всего это сделать? Также есть ли способ индексировать столбец в таблице?
Я хотел бы применить unique
столбцы в базе данных, а не просто используя :validate_uniqueness_of
.
7 ответов
короткий ответ:
add_index :table_name, :column_name, unique: true
чтобы индексировать несколько столбцов вместе, вы передаете массив имен столбцов вместо одного имени столбца,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
для более мелкозернистого управления есть"execute
" метод, который выполняет прямой SQL.
вот именно!
Если вы делаете это в качестве замены для регулярных старых моделей проверки, просто проверьте, как это работает. Я не уверен, что сообщение об ошибке пользователю будет таким же приятным. Ты всегда можешь это сделать. оба.
rails генерирует миграцию add_index_to_table_name column_name:uniq
или
rails генерирует миграцию 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
line, или положить в чек
add_column :moderators, :username, :string unless column_exists? :moderators, :username
так это еще не упоминалось, но отвечает на вопрос, который я имел, когда я нашел эту страницу, вы также можете указать, что индекс должен быть уникальным при добавлении его через 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
)
Если вы создаете новую таблицу, вы можете использовать встроенную ярлык:
def change
create_table :posts do |t|
t.string :title, null: false, index: { unique: true }
t.timestamps
end
end
Я использую 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
add_index :table_name, :column_name, unique: true
чтобы индексировать несколько столбцов вместе, вы передаете массив имен столбцов вместо одного имени столбца.
вы можете добавить имя для уникального ключа столько раз, сколько имя unique_key по умолчанию по рельсам может быть слишком длинным, для которого БД может выдать ошибку.
добавить имя для вашего индекса просто использовать . Запрос может выглядеть так -
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