通常更好的做法(以及为什么)验证模型或数据库定义中的属性?
对于(一个微不足道的)例子:
在用户模型中:
validates_presence_of :name
与迁移相比:
t.string :name, :null => false
一方面,将其包含在数据库中似乎更能保证不会出现任何类型的不良数据。另一方面,将其包含在模型中会使事情更加透明,更易于理解。代码与其余的验证。我也考虑过两者兼顾,但这似乎既不干,也不易维护。
答案 0 :(得分:46)
我强烈建议在两个地方都这样做。在模型中执行此操作可以为您保存一个数据库查询(可能在整个网络中),该查询基本上会出错,并且在数据库中执行此操作可以保证数据的一致性。
答案 1 :(得分:11)
还
validates_presence_of :name
与
不一样t.string :name, :null => false
如果您只是在数据库中设置NOT NULL列,您仍然可以插入空值(“”)。如果你正在使用模型validates_presence_of - 你不能。
答案 2 :(得分:4)
这两种做法都是很好的做法。模型验证是用户友好的,而数据库验证则添加了最后的组件,可以加强代码并显示应用程序逻辑中缺少的验证。
答案 3 :(得分:2)
它有所不同。我认为应该在数据库中完成简单的,与数据相关的验证(例如字符串长度,字段约束等)。遵循某些业务规则的任何验证都应在模型中完成。
答案 4 :(得分:1)
我建议使用Migration Validators项目(https://rubygems.org/gems/mv-core)来定义db级别的验证,然后将其透明地提升为ActiveRecord模型。
示例:
在迁移中:
def change
create_table :posts do |t|
t.string :title, length: 1..30
end
end
在您的模型中:
class Post < ActiveRecord::Base
enforce_migration_validations
end
结果您将获得两级数据验证。第一个将在db中实现(作为检查约束的触发条件),第二个将在模型中作为ActiveModel验证。
答案 5 :(得分:0)
取决于您的应用程序设计, 如果你有一个中小型应用程序,你可以在两者中或仅在模型中, 但是如果你有一个大型的应用程序,可能是面向服务或分层,那么在数据库中有基本的验证,即强制/可空,最小/最大长度等,更严格,即模型中的模式或业务规则。