我在编辑rails迁移时犯了一个错误(我正在使用rails 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在哪里获得drop命令?
更新 :事实证明,在回滚时,rails 3.1实际上并没有查看迁移类'down
方法!它查看change
方法的迁移命令并将其反转。这就是为什么rake db:rollback
在删除drop_table :assets
指令后试图删除资产表的原因!我如何解决这个问题是我将change
方法更改为旧的rails 3.0样式up
方法。然后rails查看了down
方法,我从中移除了drop_table
命令并且回滚成功。
答案 0 :(得分:2)
迁移改变了最新的轨道,尤其是逆转迁移 我认为http://shardul.wordpress.com/2012/01/25/reversible-migrations/将为您提供所需的信息和选项。
btw我在3.1上遇到了很多问题。 rc候选人(例如rc4,rc5)并且现在必须保持3.0.9才能获得稳定的新应用程序。