以前schema.rb是一个很好的地方,可以快速查看列默认值是什么以及它们是否可以为空,但现在它很麻烦。例如,这是一个用户表:
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh admin@acme.com";
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh admin@acme.com";
}
现在它看起来很可怕:
create_table "users", force: :cascade do |t|
t.string "name", null: false
t.string "email", null: false
t.string "locale", default: "en-ca", null: false
t.string "password_digest", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true, using: :btree
end
为什么会发生这种情况,如何在保持良好变化的同时修复它,例如create_table "users", id: :serial, force: :cascade do |t|
t.string "name", null: false
t.string "email", null: false
t.string "locale", default: "en-ca", null: false
t.string "password_digest", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_users_on_email", unique: true
end
和隐式id: :serial
?
答案 0 :(得分:7)
它在this提交中有意更改。
因为我每天至少看50次schema.rb才能看到这种类型的信息,我今晚会写一个工具来很好地格式化它,同时保留积极的变化。
一旦准备就绪,我会在这里发布链接。如果我忘记发布它,请在这里弄错。
编辑:
我创建了脚本,但它非常脆弱。我正在将字符串输出转换为新的字符串输出,我不相信我已经击中了所有的边框。 如果你想冒险与我联系,我会给你当前工作版本的rake任务,但它并不是很好。
<强> EDIT2:强>
我一直在使用my hacky script一段时间没有问题。如果要将其添加到项目中,请随意将其复制到rake任务中。
EDIT3:
我已经切换到SQL模式,因为它更好地包含了我们在生产/测试中工作时通常需要的东西。我仍然想在开发过程中阅读schema.rb,所以我所做的就是以下内容,它工作得很好并且风险较小:
# In config/application.rb
config.active_record.schema_format = :sql
# In config/environments/development.rb
config.active_record.schema_format = :ruby
# In the rake task
namespace :db do
def cleanup_schema
# Other code goes here
end
task :migrate do
if Rails.env.development?
cleanup_schema
end
end
task :rollback do
if Rails.env.development?
cleanup_schema
end
end
task :cleanup_schema do
cleanup_schema
end
end