Rails 3,我添加了一个表,然后添加了一个列,现在我想添加一个索引

时间:2010-09-07 17:23:45

标签: ruby-on-rails migration ruby-on-rails-3

在Rails 3中,

我创建了一个包含迁移的表,然后添加了一个包含迁移的列,该列创建了一个has_many,belongs_to关系....

然后我运行了rake db:migrate

我现在想添加一个索引,因为我忘记在迁移之前添加它。我可以将其添加到现有的一个迁移文件(创建表一个)中,还是我需要创建一个新的迁移来为现有的表添加索引?

由于

2 个答案:

答案 0 :(得分:4)

如果我忘记这样的话,我通常会创建一个新的迁移(特别是如果我已经在生产中迁移)。但是,如果您仍处于开发阶段,则可以更改上一个迁移文件并使用redo rake命令:

rake db:migrate:redo

还有:

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

运行此命令以查看所有不同的rake任务:

rake -T db

以下是Rails指南中讨论它的部分: http://guides.rubyonrails.org/migrations.html#rolling-back

答案 1 :(得分:3)

如果要在不丢失数据的情况下添加索引,则必须创建新的迁移以添加索引。假设您的模型名为 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