【问题标题】: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 建议在当前分支中获取正确数据库的其他方法