🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 迁移 * <a name="schema-version"></a> 应使用版本控制工具记录 `schema.rb` (或 `structure.sql` )的变化。 <sup>[[link](#schema-version)]</sup> * <a name="db-schema-load"></a> 应使用 `rake db:scheme:load` 而不是 `rake db:migrate` 来初始化空数据库。 <sup>[[link](#db-schema-load)]</sup> * <a name="default-migration-values"></a> 应在迁移文件中设置默认值,而不是在应用层面设置。 <sup>[[link](#default-migration-values)]</sup> ```Ruby # 差——在应用中设置默认值 def amount self[:amount] or 0 end ``` 虽然许多 Rails 开发者建议在 Rails 中强制使用表的默认值,但这会使数据受到许多应用 bug 的影响,因而导致应用极其难以维护。考虑到大多数有一定规模的 Rails 应用都与其它应用共享数据库,保持应用的数据完整性几乎是不可能的。 * <a name="foreign-key-constraints"></a> 务必使用外键约束。在 Rails 4.2 中,ActiveRecord 本身已经支持外键约束。 <sup>[[link](#foreign-key-constraints)]</sup> * <a name="change-vs-up-down"></a> 书写建设性的迁移(添加表或列)时,应使用 `change` 方法而不是 `up` 或 `down` 方法。 <sup>[[link](#change-vs-up-down)]</sup> ```Ruby # 老式写法 class AddNameToPeople < ActiveRecord::Migration def up add_column :people, :name, :string end def down remove_column :people, :name end end # 新式写法(更好) class AddNameToPeople < ActiveRecord::Migration def change add_column :people, :name, :string end end ``` * <a name="no-model-class-migrations"></a> 不要在迁移中使用模型类。由于模型的变化,模型类也一直处在变化当中,过去运行正常的迁移可能不知什么时候就不能正常进行了。 <sup>[[link](#no-model-class-migrations)]</sup>