Рельсы: добавление индекса после добавления столбца
предположим я создал таблицу table в приложения Rails. Некоторое время спустя я добавляю столбец под управлением:
rails generate migration AddUser_idColumnToTable user_id:string.
затем я понимаю, что мне нужно добавить user_id как индекс. Я знаю про add_index метод, но где должен быть вызван этот метод? Я должен запустить миграцию (если да, то какой ?), то добавляя вручную этот метод?
4 ответов:
вы можете запустить другую миграцию, только для индекса:
class AddIndexToTable < ActiveRecord::Migration def change add_index :table, :user_id end end
Если вам нужно создать
user_idтогда было бы разумным предположением, что вы ссылаетесь на пользовательскую таблицу. В этом случае миграция должна быть:rails generate migration AddUserRefToProducts user:referencesэта команда создаст следующую миграцию:
class AddUserRefToProducts < ActiveRecord::Migration def change add_reference :user, :product, index: true end endпосле
rake db:migrateи столбец, и индекс будут добавлены вproductтаблица.в случае, если вам просто нужно добавить индекс к существующему столбцу, например
nameнаuserтаблица, следующий метод может будьте полезны:
rails generate migration AddIndexToUsers name:string:indexбудет генерировать следующую миграцию:class AddIndexToUsers < ActiveRecord::Migration def change add_column :users, :name, :string add_index :users, :name end endудалить
add_columnпостройте и запустите миграцию.в описанном случае вы могли бы выдан
rails generate migration AddIndexIdToTable index_id:integer:indexкоманда, а затем удалитьadd_columnлинии за счет миграции. Но я бы скорее рекомендовал отменить начальную миграцию и добавить ссылку вместо этого:rails generate migration RemoveUserIdFromProducts user_id:integer rails generate migration AddUserRefToProducts user:references
добавьте в сгенерированную миграцию после создания столбца следующее (пример)
add_index :photographers, :email, :unique => true
для ссылок вы можете позвонить
rails generate migration AddUserIdColumnToTable user:referencesЕсли в будущем вам нужно добавить общий индекс, вы можете запустить этот
rails g migration AddOrdinationNumberToTable ordination_number:integer:indexгенерировать код:
class AddOrdinationNumberToTable < ActiveRecord::Migration def change add_column :tables, :ordination_number, :integer add_index :dt_json_structs, :ordination_number, unique: true end end
Comments