在 Rails 中恢复特定的旧迁移,而不恢复以后的迁移

Posted

技术标签:

【中文标题】在 Rails 中恢复特定的旧迁移,而不恢复以后的迁移【英文标题】:Revert specific, old migration in Rails without reverting later migrations 【发布时间】:2015-03-25 18:53:56 【问题描述】:

我开始在 Rails 应用程序中使用 Rolify,并在大约 15 次迁移前创建了一个迁移来设置其表。我现在决定用我自己的代码替换它,并希望在不触及所有以后的迁移的情况下恢复该迁移。该数据库现在正在使用中,因此还原 15,删除我不想添加的那个,然后应用后续的 14 会破坏数据。

Section 3.11 of the Rails Guide on migrations 建议这可以通过创建一个新迁移来完成,该迁移按名称还原特定的旧迁移:

class FixupExampleMigration < ActiveRecord::Migration
  def change
    revert ExampleMigration

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

我尝试根据我的上下文对其进行自定义,如下所示:

class RolifyDestroyRoles < ActiveRecord::Migration
  def change
    revert RolifyCreateRoles
  end
end

(我最初的 Rolify 迁移的第一行是class RolifyCreateRoles &lt; ActiveRecord::Migration)。但是,我收到一个命名空间错误:

StandardError: An error has occurred, this and all later migrations canceled:

uninitialized constant RolifyDestroyRoles::RolifyCreateRoles/home/slack/rails/tracker/db/migrate/20150127093921_rolify_destroy_roles.rb:3:in `change'

Rails 4 中可能发生了一些变化。有谁知道我应该如何引用 RolifyCreateRoles 以便 Rails 可以找到它?

【问题讨论】:

【参考方案1】:

在 rails 中恢复特定迁移:

假设我们有一个迁移:

db/migrate/20150127071749_create_users.rb

revert: 
rake db:migrate:down VERSION=20150127071749

setup again:
rake db:migrate:up VERSION=20150127071749

希望有帮助:)

【讨论】:

这不会也恢复 20150127071749 之后的所有迁移吗? 不,这不会恢复所有迁移。这将针对特定的迁移 (20150127071749)。 太棒了!我对this answer 感到困惑,它指出rake db:migrate:down VERSION=nnn 将回滚一个特定版本——我认为这意味着回滚两者之间的所有内容,但显然不是。 澄清一下,rake db:migrate:down VERSION=nnn 只会删除指定的版本,而rake db:migrate VERSION=nnn 将回滚指定的版本(根据需要删除任何中间迁移)。

以上是关于在 Rails 中恢复特定的旧迁移,而不恢复以后的迁移的主要内容,如果未能解决你的问题,请参考以下文章

回滚特定迁移而不回滚其他迁移

Exchange13/16恢复丢失或损坏的迁移邮箱

如何在Linux中备份,恢复和迁移Docker容器

Git:恢复单个文件的旧提交

rails 迁移更改了不相关的列

丢失了我的旧 grafana.db,我们可以恢复它吗?