Лучший способ добавить_индекс в базу данных - PullRequest
27 голосов
/ 05 июня 2011

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

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

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?

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

Ответы [ 3 ]

57 голосов
/ 05 июня 2011

Я думаю, что одна дополнительная миграция хорошо подходит:

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 с более новыми версиями rails, смотрите DonamiteIsTnt комментарий для деталей:

class AddIndexes < ActiveRecord::Migration

  def change
    add_index :prices, :user_id
    add_index :prices, :price
  end

end
7 голосов
/ 05 июня 2011

Как только приложение будет запущено, предполагается, что миграции будут применяться один раз .

Если вы все еще разрабатываете свое приложение, вы всегда можете добавить их по мере необходимости.отмеченный, сопровождаемый 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

FWIWadd_index :prices не имеет смысла.Индексы для каждого столбца, а не для таблицы.

Вы всегда можете создать индексы вручную, войдя в свою базу данных.

CREATE INDEX prices__user_id__idx ON prices (user_id);
4 голосов
/ 05 июня 2011

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

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