【问题标题】:schema.rb not getting updated on rake db:rollbackschema.rb 没有在 rake db:rollback 上得到更新
【发布时间】:2013-12-27 13:42:19
【问题描述】:

我有多个分支,每个分支都有一个迁移文件。所以当我签​​出一个分支时,我会执行一个 db:migrate ,然后它会更新我的 schema.rb 文件。

但是,当我签出另一个分支并运行 rake db:migrate 时,理想情况下,我在前一个分支中所做的迁移应该从 schema.rb 中删除,新迁移的详细信息应该进入 schema.rb

这不会发生。

所以,当我签出一个新分支然后执行 db:migrate 时,我执行了 rake db:rollback STEP=5。即使是现在,我在上一个分支中也有迁移的表详细信息。我在做什么错?或者这就是 Rails 的行为方式?

【问题讨论】:

    标签: ruby-on-rails activerecord rails-activerecord


    【解决方案1】:

    所有执行的迁移都保存在表schema_migrations中(迁移时间戳保存在数据库中)。当您运行rake db:migrate Rails 解析目录db/migrate 并找到表中未显示的文件(它通过时间戳进行比较)。

    假设您在分支 master 中有 10 次迁移 - schema_migrations 有 10 条带时间戳的记录。您从 master branch_1 创建一个新分支,在那里创建并运行一个新的迁移。您的表 schema_migrations 有 11 条记录。

    你回到 master 并运行 rake db:migrate - Rails 不会做任何事情,因为没有找到新文件(在 db/migrate 中)。当您运行rake db:rollback STEP=5 时,我想(我从未检查过)Rails 从分支 MASTER 回滚 5 次最后迁移。这是合乎逻辑的,因为最后一次迁移(在branch_1 中进行)在分支 master 中不存在(带有代码的文件只存在于 branch_1 中!)。因此,您无法从分支 master 回滚在 branch_1 中所做的数据库更改。

    要做什么?! 我看到了几种策略:

    1) 结帐到branch_1 并运行rake db:rollback STEP=N(N >= 新迁移计数)(您可以回滚比在此分支中执行的更多迁移)。结帐回master 并运行rake db:migrate(从master 执行迁移)

    2) 当您有生产转储或好种子时。 删除当前数据库,负载转储(或种子),运行rake db:migrate (对我来说,当你有生产转储时,这是最简单的方法!)

    PS 也许 smbd else 建议在当前分支中获取正确数据库的其他方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多