Лучший способ добавления_индекса в базу данных
У меня есть следующие две миграции уже в моей базе данных:
Когда я создал Цены:
class CreatePrices < ActiveRecord::Migration
def self.up
create_table :prices do |t|
t.string :price_name
t.decimal :price
t.date :date
t.timestamps
end
# add_index :prices (not added)
end
def self.down
drop_table :prices
end
end
, и когда я добавил user_id в Цены:
class AddUserIdToPrices < ActiveRecord::Migration
def self.up
add_column :prices, :user_id, :integer
end
# add_index :user_id (not added)
end
def self.down
remove_column :prices, :user_id
end
end
Есть ли способ из командной строки добавить цены и user_id для индексации? Я рассмотрел этот вопрос и все еще был смущен тем, как идти о добавлении индексов, а части, в которые я помещал "не добавил", похоже, подвержены ошибкам, потому что они были более ранними миграциями.
Мой вопрос: какой лучший способ для меня добавить индексирование цен и user_id?
Спасибо за помощь!
Ответы
Ответ 1
Я думаю, что одна дополнительная миграция хорошо подходит:
class AddIndexes < ActiveRecord::Migration
def self.up
add_index :prices, :user_id
add_index :prices, :price
end
def self.down
remove_index :prices, :user_id
remove_index :prices, :price
end
end
Или вы можете использовать синтаксис change
с более новыми версиями рельсов, посмотрите комментарий DonamiteIsTnt
для деталей:
class AddIndexes < ActiveRecord::Migration
def change
add_index :prices, :user_id
add_index :prices, :price
end
end
Ответ 2
Как только приложение находится в процессе производства, предполагается, что миграция будет применяться один раз.
Если вы все еще разрабатываете свое приложение, вы всегда можете добавить его, как вы отметили, а затем rake db:migrate:reset
, это уничтожит вашу базу данных и заново создаст ее.
В противном случае создайте новую миграцию rails g migration add_user_id_index
.
class AddUserIdIndex < ActiveRecord::Migration
def self.up
add_index :prices, :user_id
end
def self.down
remove_index :prices, :user_id
end
end
FWIW, add_index :prices
не имеет смысла. Индексы относятся к столбцу, а не к таблице.
Вы всегда можете вручную создавать индексы, войдя в вашу базу данных.
CREATE INDEX prices__user_id__idx ON prices (user_id);
Ответ 3
Простое решение:
- создать новую миграцию
- добавьте там индексы (они не должны быть в старых миграциях)
- выполнить миграцию