2012-07-28 109 views
0

我创建了以下迁移:插入Rails的两个现有的迁移之间的迁移

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 

一旦运行耙这显然会引发错误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 

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

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

我认为我需要做的是将第二次迁移移回到我的db/migrate目录中,并在两者之间插入一个迁移,将votable_id重新命名为:post_id,以便第二次迁移可以正常运行。我也可以运行rake db:rollback,但是由于迁移出现问题以后出现了一些迁移,这可能会变得混乱。

关于如何负责任地解决此问题的任何想法?这只是一个有趣的项目,所以丢弃数据库并不是世界末日,但我想了解如何做到这一点,如果有的话。

回答

3

Mig口粮在许多方面都非常出色,但是一旦你与先前的迁徙相混淆并且随后的迁徙一直在进行,那么他们的美貌就会崩溃,这可能是一个真正令人头痛的问题。

如果这只是为了好玩,我只是修正你的迁移,以便所有的迁移都是准确的,并建立在以前的迁移上。不要忽略任何步骤。然后回复到您的迁移的开始,随后再迁移..

rake db:migrate VERSION=0 
rake db:migrate 

如果我迅速构建不活,我会经常迁移回版本0的应用程序,然后巩固我的迁移,所以我有一个迁移建立资源,我发现它看起来更有组织,但几乎没有必要。

通常,我建议永远不要删除/修改当前迁移后面的迁移。在开发过程中,这可能会造成一个麻烦,就像你发现的那样,当你活着的时候,这可能会让人苦恼(并且冒险)来解决问题。

2

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

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

git status将让你知道,如果有什么区别...

提交删除的文件:

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

现在,你可以把你的GitHub和Heroku的

git push 
git push heroku 

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