2012-07-28 56 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不應該再看到舊遷移...