Рельсы: добавление индекса после добавления столбца



предположим я создал таблицу table в приложения Rails. Некоторое время спустя я добавляю столбец под управлением:



rails generate migration AddUser_idColumnToTable user_id:string. 


затем я понимаю, что мне нужно добавить user_id как индекс. Я знаю про add_index метод, но где должен быть вызван этот метод? Я должен запустить миграцию (если да, то какой ?), то добавляя вручную этот метод?

577   4  

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

    Ничего не найдено.