我创建了以下迁移:
class FixVoteColumnName < ActiveRecord::Migration
def change
rename_column :votes, :post_id, :votable_id
add_column :votes, :votable_type, :string
end
end
然后错误地创建了这个迁移,再次重命名该列:
class ChangeVoteTableColumns < ActiveRecord::Migration
def change
rename_column :votes, :post_id, :votable_id
end
end
这显然会在运行rake db:migrate:
时引发错误== FixVoteColumnName: migrating ==============================================
-- rename_column(:votes, :post_id, :votable_id)
rake aborted!
An error has occurred, this and all later migrations canceled:
Missing column votes.post_id
当我第一次看到这个错误时,我只是删除了第二次迁移(如,将其移动到我的Trash文件夹中),再次运行rake db:migrate,然后继续。在那之后,我创建了3次迁移并成功运行它们。
当我推到Heroku时,这证明是有问题的。不知何故,Heroku仍在处理已删除的迁移。我通过运行heroku run rake db:schema:reload来实现它,但我知道这不是一个长期的解决方案。
我认为我需要做的是将第二次迁移移回我的db / migrate目录并在两者之间插入一个重命名的迁移:votable_id返回:post_id,以便第二次迁移可以正常运行。我也可以运行rake db:rollback,但是自从有问题的迁移以来已经进行了一些迁移,这可能会变得混乱。
关于如何负责任地解决这个问题的任何想法?这只是一个有趣的项目,所以删除数据库不是世界末日,但我想学习如何以正确的方式(如果有的话)。
答案 0 :(得分:3)
迁移在很多方面都很棒,但是一旦你在之前的迁移过程中遇到移植困难,那么他们的美丽就会崩溃,这可能是一个非常令人头痛的问题。
如果这只是为了好玩,我只是修复您的迁移,以便所有迁移都是准确的,并以之前的迁移为基础。不要遗漏任何步骤。然后恢复到迁移的最开始,然后再进行迁移..
rake db:migrate VERSION=0
rake db:migrate
如果我正在快速构建一个不活动的应用程序,我会经常迁移回VERSION 0,然后合并我的迁移,这样我就有一个迁移可以构建资源,而我发现它看起来更像有组织,但几乎没有必要。
作为一项规则,我建议永远不要删除/修改当前迁移背后的迁移。在开发过程中,这可能会造成麻烦,正如您所发现的那样,当您活着时,这可能会让您感到痛苦(并且有风险)。
答案 1 :(得分:2)
您可能在github存储库中有一个已删除的迁移文件。
确保您已提交删除此文件。
git status
会告诉您是否存在任何差异......
提交已删除的文件:
git add -u
git commit -m "file deleted"
现在你可以推送到你的github和heroku
git push
git push heroku
Heroku不应再看到旧的迁移......