Rails迁移总是在模式中插入空白或更改列的顺序



有一个令人沮丧的问题,我的rails迁移使用空格和表列的位置更新模式。

所以大多数时候,当我运行bundle exec rake db:migrate时,它会执行以下场景之一。当我将其合并到我们的主分支中,其他开发人员完成这项工作时,他们的rails迁移将恢复选项卡和位置顺序。

我们注意到,如果我是模式的最后一个提交者,那么团队中的所有三个开发人员在运行迁移时都会遇到相同的问题。

我刚刚更新了与其他开发人员相同的postgres to v9.2.4。还有什么我可以尝试的想法吗?

示例

下面是git-diff来演示正在发生的事情。

重新排序模式的示例:

   create_table "accounts", :force => true do |t|
     t.integer  "organisation_id"
-    t.boolean  "active",             :default => false
     t.text     "notes"
+    t.boolean  "active",             :default => false
   end

将选项卡添加到架构的示例:

   create_table "comments", :force => true do |t|
-    t.integer  "commentable_id",   :default => 0
-    t.string   "commentable_type", :default => ""
+    t.integer  "commentable_id",     :default => 0
+    t.string   "commentable_type",   :default => ""
-    t.datetime "created_at",                       :null => false
-    t.datetime "updated_at",                       :null => false
+    t.datetime "created_at",                            :null => false
+    t.datetime "updated_at",                            :null => false

我构建了一个gem来解决这个问题。

它对列、索引名和外键进行排序,删除多余的空白,并运行Rubocop进行一些格式化,以统一schema.rb文件的输出。

https://github.com/jakeonrails/fix-db-schema-conflicts

将其添加到Gemfile后,只需像正常情况一样运行rake-db:migrate或rake-db:schema:dump。

好消息!Rails最终推出了一个更新,正好解决了这个问题。从Rails v5.1.0开始,默认(也是唯一的选项)是删除列之间的任何额外空间。

您应该忽略版本控制中的schema.rb。它会根据迁移的顺序和产生迁移的人而发生不同的变化。您只需要迁移就可以为项目中涉及的每个开发人员生成合适的模式。

谨致问候。

最新更新