schema.rb没有在rake db:rollback上获得更新

时间:2013-12-10 06:32:31

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

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

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

这不会发生。

所以,我做了一个rake db:rollback STEP = 5,当我签出一个新的分支然后做了db:migrate。即使是现在,我在上一个分支中有关于迁移的表详细信息。我做错了什么?或者Rails的表现如何?

1 个答案:

答案 0 :(得分:1)

所有已执行的迁移都保存在表schema_migrations中(迁移时间戳保存在DB中)。运行rake db:migrate时,Rails会解析目录db/migrate并查找表中未显示的文件(按时间戳进行比较)。

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

你回到主人并运行rake db:migrate - Rails将不会因为没有找到新文件(在db/migrate中)。当你运行rake db:rollback STEP=5我想(我从未检查过它)Rails回滚5分支MASTER的最后一次迁移。这是合乎逻辑的,因为上一次迁移(在branch_1中创建)在分支主服务器中不存在(包含代码的文件仅存在于branch_1中!)。因此,您无法从分支主服务器回滚在branch_1中进行的数据库更改。

什么待办事项?! 我看到了几个策略:

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

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

PS也许smbd else建议在当前分支中获得正确DB的其他方法