如何正确删除Active Record Migration?

时间:2015-04-20 15:07:54

标签: ruby-on-rails migration

在我的迁移中,我有3个与此问题有关。按顺序,有CreateEvents < ActiveRecord::Migration。下一行是CreateYears < ActiveRecord::Migration。然后最后一个是AddYearIdToEvents < ActiveRecord::Migration。最后一个看起来像这样......

class AddYearIdToEvents < ActiveRecord::Migration
  def change
    add_column :events, :year_id, :integer, null: false, index: true
  end
end

现在的问题是,每当我尝试删除整个数据库(而不是接近部署到生产)时,我都会遇到明显的错误

ERROR:  cannot drop table years because other objects depend on it
DETAIL:  constraint events_year_id_fk on table events depends on table seasons
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

现在,我不是铁路专家,但我相信我需要在上次迁移中定义def down。而不是def改变,我需要一个def up和def down吗? def下来放弃这个特定的列。

如果是这样,我该怎么做呢。此迁移是20次迁移。您不能像这样编辑迁移吗?我是否添加了新迁移并指定了def down?或者答案是完全不同的?

1 个答案:

答案 0 :(得分:2)

您是否尝试过回滚迁移?这将以相反的顺序撤消迁移,即从最近的迁移开始。

$ rake db:rollback

如果您有20次迁移并且想要回滚所有这些迁移,则可以使用STEP=20

$ rake db:rollback STEP=20

一旦您回滚过您想要更改的迁移,就可以更改它。

此外,您应该能够使用rake db:drop,它会丢弃整个数据库,而不是以相反的顺序进行每次迁移。如果您要删除数据库,然后重新创建它并重新运行所有迁移,则可以运行rake db:reset。请注意,如果您有rake db:seed文件,这也会运行db/seed.rb

在回答你的问题时,“我不需要改变,我需要一个def up and def down?”,答案是肯定的。较新版本的Rails使用def change,因为(除其他原因外)它可以在生成迁移后更轻松地编辑迁移,即在向表中添加列时拼写错误的列名称。