我来自一个尽可能完全定义数据库架构的背景,例如:字段长度,非空,默认值,复杂的参照完整性等。使用Rails,我必须在模型中完成所有这些以获得智能验证。那么我也要复制数据库定义中的所有内容吗?
例如,如果电子邮件是必填字段,是否可以将validates :email, :presence => true
添加到模型并将:null => false
添加到迁移中?
弦乐怎么样?如果模型中有:length => { :maximum => 50 }
,迁移中是否还需要:limit => 50
?
我是否将外键添加到数据库以强制引用完整性?
或者是“Rails方式”在模型中尽可能多地做,并将数据库保留为“哑”持久性引擎?
答案 0 :(得分:2)
明确添加:null =>假。否则你的DBA可能会伤害你。您的Rails应用程序并不是唯一触及数据库的应用程序。
最大长度为您提供增益DB内存。绝对设置最大长度,但一定要添加rails验证。如果不是,您可能会遇到错误的应用错误。
外键很好但在rails应用程序中使用较少
答案 1 :(得分:1)
标准的“Rails方式”是将约束保留在Ruby代码中。
我很少有Rails(甚至只是Ruby)触摸数据库的奢侈......而且说实话,即使只是直接在数据库上乱窜的人也会导致问题...所以我倾向于使用数据库约束,因为我不确定数据是否能够过于精心修饰。
答案 2 :(得分:0)
通常,最佳做法是尽可能多地从数据库中删除逻辑。为迁移添加可空验证并不会对保持逻辑失效的方面产生任何影响或帮助。如果您正在使用模型验证,那么您的大部分应用都应该通过它。这是我心中的洗漱。
你可以过火的地方是其他类型的限制。一些数据库支持各种疯狂约束,这些约束更有效地作为验证器 - 验证器更容易测试并以自动方式运行这些测试。
如果您有许多涉及数据库的部分并且它们并非都是红宝石,那么编写SOA层来进行所有验证,这在代码中通常很有用。同样,测试代码比DB中的逻辑更容易。