Ответ 1
Вы можете запустить другую миграцию только для индекса:
class AddIndexToTable < ActiveRecord::Migration
def change
add_index :table, :user_id
end
end
Предположим, что я создал таблицу table
в приложении Rails. Через некоторое время я добавлю столбец:
rails generate migration AddUser_idColumnToTable user_id:string.
Тогда я понимаю, что мне нужно добавить user_id
в качестве индекса. Я знаю о методе add_index
, но где должен быть вызван этот метод? Должен ли я запускать миграцию (если да, какой?), А затем вручную добавить этот метод?
Вы можете запустить другую миграцию только для индекса:
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
Вы можете использовать это, просто подумайте, что 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