有一个令人沮丧的问题,我的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。它会根据迁移的顺序和产生迁移的人而发生不同的变化。您只需要迁移就可以为项目中涉及的每个开发人员生成合适的模式。
谨致问候。