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

Ruby on rails Rails迁移总是在模式中插入空格或更改列的顺序,ruby-on-rails,ruby-on-rails-3.2,postgresql-9.2,rails-postgresql,pg,Ruby On Rails,Ruby On Rails 3.2,Postgresql 9.2,Rails Postgresql,Pg,有一个令人沮丧的问题,我的rails迁移使用空格和表列的位置更新模式 因此,大多数时候,当我运行bundle exec rake db:migrate时,它会执行以下场景之一。当我将其合并到我们的主分支中,其他开发人员完成此工作时,他们的rails迁移将恢复选项卡和位置顺序 我们注意到,如果我是模式的最后提交者,那么团队中的三个开发人员在运行迁移时都会遇到相同的问题 我刚刚将postgres更新为v9.2.4,这与其他开发人员相同。还有什么我可以试试的吗 例子 下面是git差异来演示正在发生的事

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

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

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

我刚刚将
postgres更新为v9.2.4
,这与其他开发人员相同。还有什么我可以试试的吗

例子 下面是git差异来演示正在发生的事情

重新排序架构的示例:

向架构添加选项卡的示例:


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


尊敬。

我怀疑此错误是由不同的空白配置造成的(“制表符宽度”,如果您使用的是sublime)。

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

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


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

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

是什么让您认为空格是选项卡?有没有可能看到其中一个
create_table
s的前后版本?@muistooshort谢谢,它们可能是空格第一个空格只是意味着数据库中并非每个列的顺序都相同,比较
\d帐户
内的
psql
输出,你就会找到罪魁祸首;这可能以各种方式发生,不应该成为问题。第二个可能只是一种对齐方式(即,使所有的
:default=>…
选项对齐),但是如果不查看
schema.rb
文件前后的全部内容,就很难判断。更正:永远不要从版本控制中忽略schema.rb。谢谢你!这应该是Rails核心的欢呼,很高兴它帮助了别人@杰克:我发现这完全是偶然的。我怀疑在gem的名字上加上sort这个词会引起更多的注意。干得好,谢谢!
   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