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

Posted

技术标签:

【中文标题】Rails 迁移总是在模式中插入空格或更改列的顺序【英文标题】:Rails migration is always inserting whitespaces or changing the ordering of columns in the schema 【发布时间】:2013-07-16 19:35:19 【问题描述】:

有一个令人沮丧的问题,我的 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

【问题讨论】:

是什么让你认为空格是制表符?有机会看到其中一个create_tables 之前和之后的完整版本吗? @muistooshort 谢谢,它们可能是空格 第一个只是表示不是每个人的列在数据库中的顺序都相同,比较psql内部的\d accounts输出,你会找到罪魁祸首;这可能以各种方式发生,应该不是问题。第二个可能只是对齐的事情(即使所有:default => ... 选项对齐),但如果不查看schema.rb 文件之前和之后的整体,就很难判断。 【参考方案1】:

您应该从版本控制中忽略 schema.rb。它会根据迁移的顺序和生成者的不同而有所不同。您只需要迁移来为项目中涉及的每个开发人员生成适用的架构。

问候。

【讨论】:

更正:您应该永远从您的版本控制中忽略 schema.rb。 ***.com/questions/6520017/…【参考方案2】:

我怀疑这个错误是由不同的空格配置引起的(如果你使用的是 sublime,则为'tab width')。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

谢谢!这应该在 Rails 核心中? 干杯,很高兴它帮助了那里的人! @jakeonrails 我完全是偶然发现的。我怀疑在您的宝石名称中添加“排序”一词会引起更多关注。干得好,谢谢!【参考方案4】:

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

【讨论】:

以上是关于Rails 迁移总是在模式中插入空格或更改列的顺序的主要内容,如果未能解决你的问题,请参考以下文章

更改列的 Rails 迁移

你如何更改rails中的列数据类型?

在 postgresql 应用程序的 rails 中运行迁移后的顺序注意事项

在 rails upgrade 迁移条目从模式迁移表中删除后

是否有任何与 rails ActiveRecord 迁移相当的 Firestore 数据库模式迁移概念?

Rails 3 SQLite3 布尔值 false