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文章为我解决了它!我会用结果更新我的问题。 –