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

Лучший способ добавления_индекса в базу данных

У меня есть следующие две миграции уже в моей базе данных:

Когда я создал Цены:

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?

Спасибо за помощь!

4b9b3361

Ответ 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

Простое решение:

  • создать новую миграцию
  • добавьте там индексы (они не должны быть в старых миграциях)
  • выполнить миграцию