【发布时间】:2011-10-31 13:48:37
【问题描述】:
我在编辑 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)
所以我只是手动删除了数据库中的 assets 表(我只是使用 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命令,回滚成功。
【问题讨论】:
-
有类似的情况(Rails 3.2),用“up”替换“change”也对我有用。
标签: ruby-on-rails ruby-on-rails-3 migration ruby-on-rails-3.1 rails-migrations