在Rails 3中,
我创建了一个包含迁移的表,然后添加了一个包含迁移的列,该列创建了一个has_many,belongs_to关系....
然后我运行了rake db:migrate
我现在想添加一个索引,因为我忘记在迁移之前添加它。我可以将其添加到现有的一个迁移文件(创建表一个)中,还是我需要创建一个新的迁移来为现有的表添加索引?
由于
答案 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