如何正确删除 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= 时拼错了列名].
在我的迁移中,我有 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= 时拼错了列名].