【问题标题】:Merging ActiveRecord migrations out of order无序合并 ActiveRecord 迁移
【发布时间】:2016-04-13 19:41:27
【问题描述】:

假设我在gitRails 应用程序上工作,我有两个分支,每个分支都有自己的迁移。

1) branch001 通过迁移 20160101000000_create_table_A 创建一个名为 tableA 的表

2) branch002 通过迁移 20160101000001_create_table_B 创建一个名为 tableB 的表

很明显,第二次迁移的时间戳是在第一次迁移之后创建的。

但是假设我首先将branch002 合并到master,因为它首先准备好了。我的架构文件变成了 -

ActiveRecord::Schema.define(version: 20160101000001) do
  ....
end

架构版本告诉 activerecord 它已经修补到比我的第一个分支更高的级别/版本。

当我终于可以合并我的第一个分支时会发生什么?

  1. 架构版本会回归到20160101000000吗?
  2. 运行第一个分支的迁移是否会因为架构看到它已经“修补”并跳过它而出现任何问题?
  3. 一般来说,此类事情的最佳做法是什么?我应该使用新的、更新的时间戳重命名第一个分支吗?

谢谢!

编辑 -

真的想知道当我将第二个分支合并到master 时我应该怎么做才能解决合并冲突。我应该将其保留为较晚的时间戳还是将其退回到较早的时间戳?

<<<<<<< HEAD (master)
ActiveRecord::Schema.define(version: 20160101000001) do
=======
ActiveRecord::Schema.define(version: 20160101000000) do
>>>>>>> 282cda7... Adding Table B

【问题讨论】:

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


    【解决方案1】:

    如果发生冲突,您应该选择两者中较大的数字。但无论您选择什么,它都不会影响实际迁移。

    如果您选择较小的数字,那么下次运行 rake db:migrate 时,它将更改此数字(更改为较大的数字),您的 schema.rb 将发生变化,并且不会迁移。这不是问题 - 只有你的提交会有点奇怪。

    Rails rake 任务运行它找到的所有迁移,并且在 schema_migrations 表中没有值。然后它取最高的迁移时间戳并将这个时间戳放入schema.rb。整个迁移想法不是基于一些“最近的时间戳”(模式版本),而是基于 schema_migrations 表的内容,该表包含它已经运行的所有迁移时间戳。所以通过这个表就可以保证没有迁移被跳过。

    【讨论】:

      【解决方案2】:

      非常简短的版本是事情通常都很好:假设迁移不会相互干扰(例如,一个删除了一个表,但另一个假设它仍然存在)你不应该遇到麻烦。

      虽然您的架构文件中只有一个版本号,但当您运行迁移时,rails 会将迁移文件列表与schema_migrations 表的内容进行比较,并运行任何尚未运行的迁移,即使有已经运行的更新的迁移。

      就架构冲突而言,我个人只会运行迁移,这将重新生成 schema.rb。

      【讨论】:

        猜你喜欢
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        相关资源
        最近更新 更多