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

Cod*_*ama 13 ruby-on-rails pg rails-postgresql ruby-on-rails-3.2 postgresql-9.2

我的rails迁移使用空格和表列的位置更新架构,这是一个令人沮丧的问题.

因此,大多数情况下,当我运行bundle exec rake db:migrate它时,将执行以下方案之一.当我将它合并到我们的主分支中并且其他开发人员解决这个问题时,他们的rails迁移会恢复标签和位置排序.

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

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

例子

下面是git diffs来演示正在发生的事情.

重新排序模式的示例:

   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
Run Code Online (Sandbox Code Playgroud)

向标志添加标签的示例:

   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
Run Code Online (Sandbox Code Playgroud)

jak*_*ils 6

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

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

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

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

  • @jakeonrails 我完全是偶然发现的。我怀疑在您的宝石名称中添加“排序”一词会引起更多关注。干得好,谢谢! (3认同)
  • 谢谢你!这应该在 Rails 核心中 (2认同)

Cor*_*uan -17

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

问候。

  • *更正*:您应该**永远**忽略版本控制中的 schema.rb 。http://stackoverflow.com/questions/6520017/is-it-a-good-idea-to-put-db-schema-rb-to-gitignore-list (5认同)