我在编辑 rails 迁移时犯了一个错误(我使用的是 rails 3.1.0rc5)。所以我更正了它并尝试做 arake db:rollback
后跟 a 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 从哪里得到这个 drop 命令?
更新:事实证明,rails 3.1down
在回滚时实际上并没有查看迁移类的方法!它查看change
方法的迁移命令并反转它们。这就是为什么指令rake db:rollback
后仍试图删除资产表drop_table :assets
我如何解决这个问题是我将change
方法更改为旧的 rails 3.0 样式up
方法。然后rails查看了down
我从中删除drop_table
命令的方法,回滚成功。