在两个现有迁移之间插入Rails迁移

时间:2012-07-28 17:46:52

标签: ruby-on-rails ruby heroku sqlite migration

我创建了以下迁移:

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,但是自从有问题的迁移以来已经进行了一些迁移,这可能会变得混乱。

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

2 个答案:

答案 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不应再看到旧的迁移......