0

我创建了以下迁移:

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

当我第一次看到这个错误时,我只是删除了第二次迁移(例如,将其移至我的垃圾文件夹),再次运行 rake db:migrate,然后继续。在那之后,我创建了 3 个迁移并成功运行它们。

当我推到 Heroku 时,这被证明是有问题的。不知何故,Heroku 仍在处理已删除的迁移。我通过运行 heroku run rake db:schema:reload 让它工作,但我知道这不是一个长期的解决方案。

我认为我需要做的是将第二次迁移移回我的 db/migrate 目录,并在将 :votable_id 重命名为 :post_id 的两者之间插入迁移,以便第二次迁移可以正常运行。我也可以运行 rake db:rollback,但是自从有问题的迁移以来已经进行了一些迁移,这可能会变得一团糟。

关于如何负责任地解决这个问题的任何想法?这只是一个有趣的项目,因此删除数据库并不是世界末日,但我想学习如何以正确的方式进行操作,如果有的话。

4

2 回答 2

4

迁移在很多方面都很棒,但是一旦你混淆了之前的迁移并且已经运行了后续的迁移,那么它们的美丽就会崩溃,修复它可能会让人头疼。

如果这只是为了好玩,我会修复您的迁移,以便所有迁移都是准确的并建立在先前的迁移之上。不要遗漏任何步骤。然后恢复到迁移的最开始,然后是重新迁移..

rake db:migrate VERSION=0
rake db:migrate

如果我正在快速构建一个未上线的应用程序,我通常会迁移回 VERSION 0,然后合并我的迁移,这样我就有一个构建资源的迁移,我发现它看起来更有条理,但几乎没有必要的。

作为一项规则,我建议永远不要删除/修改当前迁移之后的迁移。正如您发现的那样,在开发过程中,这可能会造成麻烦,而当您在现场时,这可能会令人痛苦(并且有风险)来解决。

于 2012-07-29T04:25:49.473 回答
2

您的 github 存储库中可能有一个已删除的迁移文件。

确保您已提交删除此文件。

git status如果有什么不同,会告诉你...

提交删除的文件:

git add -u 
git commit -m "file deleted"

现在你可以推送到你的 github 和 heroku

git push
git push heroku

Heroku 不应该再看到旧的迁移......

于 2012-07-28T18:05:08.247 回答