我在编辑导轨移植(我使用导轨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
命令,并且回滚成功。
有类似的情况(Rails 3.2),并且用'up'替换'change'也适用于我。 – user456584