Подтвердить что ты не робот

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

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

rails generate migration AddUser_idColumnToTable user_id:string. 

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

4b9b3361

Ответ 1

Вы можете запустить другую миграцию только для индекса:

class AddIndexToTable < ActiveRecord::Migration
  def change
    add_index :table, :user_id
  end
end

Ответ 2

Если вам нужно создать 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

Ответ 3

Добавьте в сгенерированную миграцию после создания столбца следующего (пример)

add_index :photographers, :email, :unique => true

Ответ 4

Для ссылок вы можете позвонить

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

Ответ 5

Вы можете использовать это, просто подумайте, что Job - это название модели, к которой вы добавляете индекс cader_id:

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end