如何正确删除 Active Record 迁移?

How can I properly drop an Active Record 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.

现在,我不是 rails 专家,但我相信我需要在最后一次迁移中定义一个 def down。我需要 def up 和 def down 而不是 def 变化吗? def down 以删除此特定列。

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

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

$ rake db:rollback

如果你有 20 个迁移并且你想回滚所有的迁移,你可以使用 STEP=20

$ rake db:rollback STEP=20

回滚到您想要更改的迁移后,您可以对其进行更改。

此外,您应该能够使用 rake db:drop,它会删除整个数据库,而不是按相反的顺序执行每个迁移。如果您想删除数据库,然后重新创建它并重新运行 所有迁移,您可以运行 rake db:reset。如果您有 db/seed.rb 文件,请记住这一点 运行s rake db:seed

针对您 "Rather than def change, do I need a def up and def down?" 的问题,答案是否定的。 Rails 的较新版本使用 def change 因为(除其他原因外)它使得在生成迁移后更容易编辑迁移,即如果在将列添加到 [=30= 时拼错了列名].