1

我在编辑 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命令的方法,回滚成功。

4

1 回答 1

2

迁移随着最新的 rails 发生了相当大的变化,尤其是逆向迁移。
我认为http://shardul.wordpress.com/2012/01/25/reversible-migrations/将为您提供所需的信息和选项。

顺便说一句,我对 3.1 有很多问题。rc 候选(例如 rc4、rc5)并且现在必须保持在 3.0.9 才能获得稳定的新应用程序。

于 2011-08-21T12:24:35.697 回答