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

14

我的rails迁移会在表的列位置和空格方面更新模式,这是一个令人沮丧的问题。

所以大多数情况下,当我运行bundle exec rake db:migrate时,它会执行以下其中一种情况。当我将其合并到我们的主分支中,并且其他开发者从此处工作时,他们的rails迁移会还原制表符和位置排序。

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

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

示例

以下是git差异,以演示正在发生的情况。

重新排序模式的示例:

   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

你怎么知道空格是制表符?有没有可能看到其中一个“create_table”的完整的前后版本? - mu is too short
@muistooshort 谢谢,它们可能是空格。 - Coderama
1
第一个意思是并不是每个人的数据库列都是相同的顺序,比较一下在 psql 中的 \d accounts 输出,你会找到罪魁祸首;这可能以各种方式发生,但不应该成为问题。第二个可能只是一个对齐的问题(即使所有的 :default => ... 选项都排成一行),但如果没有看到整个 schema.rb 文件,很难说清楚。 - mu is too short
3个回答

6
我建立了一个 gem 来解决这个问题。它可以对列、索引名称和外键进行排序,去除多余的空格,并运行 Rubocop 进行格式化,以统一你的 schema.rb 文件的输出结果。

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

在将其添加到Gemfile后,您只需像平常一样运行rake db:migrate或rake db:schema:dump即可。

2
谢谢!这应该是Rails核心的一部分。 - mahemoff
谢谢,很高兴能帮助到某个人! - jakeonrails
3
我偶然发现了这个。我猜在你的宝石名称中加上“sort”这个词会让它更受关注。干得好,谢谢! - user3763682

2

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

原始答案:Original Answer


-17

在版本控制中,您应该忽略 schema.rb 文件。它的变化取决于迁移的顺序和生成者不同。您只需要迁移来为项目中涉及的每个开发人员生成适当的模式。

祝好。


5
更正:你绝不能忽略将schema.rb文件加入版本控制。https://dev59.com/RWw15IYBdhLWcg3wmMx9 - Dorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接