在我的迁移中,我有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?或者答案是完全不同的?
答案 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
,因为(除其他原因外)它可以在生成迁移后更轻松地编辑迁移,即在向表中添加列时拼写错误的列名称。