1

我在編輯導軌移植(我使用導軌3.1.0rc5)時犯了一個錯誤。所以我糾正它,並試圖做一個rake db:rollback,然後是rake db:migrate db:test:prepare。但由於某種原因,回滾失敗。下面是遷移的回滾部分:導軌移植回滾失敗

def down 
    drop_table :assets 
    end 

這是來自db:rollback響應:

== CreateAssets: reverting =================================================== 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

ActiveRecord::IrreversibleMigration 

Tasks: TOP => db:rollback 
(See full trace by running task with --trace) 

所以我只是手動在數據庫中刪除的資產表(我只用sqlite3的DBS) ,註釋掉drop_table :assets線,並再次運行db:rollback

== CreateAssets: reverting =================================================== 
-- drop_table("assets") 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: no such table: assets: DROP TABLE "assets" 

Tasks: TOP => db:rollback 
(See full trace by running task with --trace) 

爲什麼試圖除去資產表?我注意到(實際上後來刪除)drop_table :assets行遷移。我甚至做了一個grep -r assets來查看rails可能從那裏獲得那個drop命令,但是找不到任何東西。

所以我的問題是如何獲得此遷移重新運行?我很好奇Rails在哪裏得到這個下降命令?

UPDATE:原來,導軌3.1實際上回滾時,不會看遷移類的down方法!它會查看change方法的遷移命令並將其反轉。這就是爲什麼rake db:rollback試圖刪除資產表,即使我刪除了drop_table :assets指令!我如何解決這個問題是我將change方法更改爲舊的rails 3.0風格up方法。然後rails看着down方法,我已經從中刪除了drop_table命令,並且回滾成功。

+0

有類似的情況(Rails 3.2),並且用'up'替換'change'也適用於我。 – user456584

回答

2

使用最新的rails,遷移發生了一些變化,特別是反轉遷移。
我認爲http://shardul.wordpress.com/2012/01/25/reversible-migrations/將爲您提供所需的信息和選項。

btw我有很多與3.1的問題。 rc候選人(例如rc4,rc5),現在不得不在3.0.9以上穩定的新應用程序。

+0

這條edgerails文章爲我解決了它!我會用結果更新我的問題。 –