Ruby on rails rails迁移的回滚失败
我在编辑rails迁移时出错(我使用的是rails 3.1.0rc5)。所以我纠正了它,并尝试执行Ruby on rails rails迁移的回滚失败,ruby-on-rails,ruby-on-rails-3,migration,ruby-on-rails-3.1,rails-migrations,Ruby On Rails,Ruby On Rails 3,Migration,Ruby On Rails 3.1,Rails Migrations,我在编辑rails迁移时出错(我使用的是rails 3.1.0rc5)。所以我纠正了它,并尝试执行rakedb:rollback,然后执行rakedb:migrateddb:test:prepare。但由于某种原因,回滚失败了。以下是迁移的回滚部分: def down drop_table :assets end 这是来自db:rollback的响应: == CreateAssets: reverting ===================================
rakedb:rollback
,然后执行rakedb:migrateddb: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数据库),注释掉了drop\u 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\u table:assets
行。我甚至做了一个grep-r assets
来查看rails可能从何处获得drop命令,但找不到任何东西
所以我的问题是如何重新运行迁移?我很好奇rails是从哪里得到下降命令的
更新:事实证明,rails 3.1在回滚时实际上没有查看迁移类“
down
方法!它查看change
方法的迁移命令并反转它们。这就是为什么rake db:rollback
即使在我删除drop\u table:assets
指令后仍试图删除assets表的原因!我是如何解决这个问题的,我将change
方法更改为旧的rails 3.0样式up
方法。然后rails查看了我从中删除的drop\u table
命令的down
方法,回滚成功。迁移随着最新rails的出现发生了相当大的变化,尤其是反向迁移。我认为这将为您提供所需的信息和选项
顺便说一句,我有很多问题与3.1。rc候选者(如rc4、rc5),现在必须保持在3.0.9才能获得稳定的新应用。edgerails的那篇文章为我解决了这个问题!我将用结果更新我的问题。有一个类似的情况(Rails 3.2),用“up”替换“change”对我也很有效。