应使用版本控制工具记录
schema.rb
(或structure.sql
)的变化。应使用
rake db:scheme:load
而不是rake db:migrate
来初始化空数据库。应在迁移文件中设置默认值,而不是在应用层面设置。
# 差——在应用中设置默认值
def amount
self[:amount] or 0
end
虽然许多 Rails 开发者建议在 Rails 中强制使用表的默认值,但这会使数据受到许多应用 bug 的影响,因而导致应用极其难以维护。考虑到大多数有一定规模的 Rails 应用都与其它应用共享数据库,保持应用的数据完整性几乎是不可能的。
务必使用外键约束。在 Rails 4.2 中,ActiveRecord 本身已经支持外键约束。
书写建设性的迁移(添加表或列)时,应使用
change
方法而不是up
或down
方法。# 老式写法
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
不要在迁移中使用模型类。由于模型的变化,模型类也一直处在变化当中,过去运行正常的迁移可能不知什么时候就不能正常进行了。