Rails 3, я добавил таблицу, затем добавил столбец, теперь я хочу добавить индекс - PullRequest
1 голос
/ 07 сентября 2010

В Rails 3,

Я создал таблицу с миграцией, затем добавил столбец с миграцией, который создает отношение has_many, own_to ....

Затем я запустил rake db: migrate

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

Спасибо

Ответы [ 2 ]

4 голосов
/ 07 сентября 2010

Я обычно создаю новую миграцию, если забываю что-то подобное (особенно если я уже мигрировал в рабочей среде) Но если вы все еще в разработке, вы можете изменить свой последний файл миграции и использовать команду redo rake:

rake db:migrate:redo

Также есть:

rake db:rollback  # Rolls the schema back to the previous version (specify steps w/ STEP=n).

Запустите эту команду, чтобы просмотреть все различные задачи по рейку:

rake -T db

Вот раздел в Руководстве по Rails, в котором говорится об этом: http://guides.rubyonrails.org/migrations.html#rolling-back

3 голосов
/ 08 сентября 2010

Если вы хотите добавить свой индекс без потери данных, вы должны создать новую миграцию для добавления индекса. Предполагая, что ваша модель называется Widget , а внешняя модель называется Zidget ;

rails generate migration AddIndexToWidgets

и внутри вашего нового файла миграции на db/migrate/xxxxxxxxxx_add_index_to_widgets

class AddIndexToWidgets < ActiveRecord::Migration
  def self.up
    change_table :widgets do |t|
      t.index :zidget_id # add ':unique => true' option if necessary
    end
  end

  def self.down
    change_table :widgets do |t|
      t.remove_index :zidget_id
    end
  end
end 

, а затем rake db:migrate как обычно и вуаля, у вас есть индексированный столбец.


Обновление : Если все, что вы делаете, - это добавление индекса, есть более краткий способ написать то же самое. Там нет никакой разницы в отношении результатов. Просто прежний синтаксис предназначен для СУШКИ вашего кода, если у вас есть более одного изменения для вашей таблицы.

class AddIndexToWidgets < ActiveRecord::Migration
  def self.up
    add_index :widgets, :zidget_id # add ':unique => true' option if necessary
  end

  def self.down
    remove_index :widgets, :column => :zidget_id
  end
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...