Ruby on Rails:在模型或数据库中验证是否更好?

时间:2010-03-02 22:19:14

标签: ruby-on-rails database models validation

通常更好的做法(以及为什么)验证模型或数据库定义中的属性?

对于(一个微不足道的)例子:

在用户模型中:

validates_presence_of :name

与迁移相比:

t.string :name, :null => false 

一方面,将其包含在数据库中似乎更能​​保证不会出现任何类型的不良数据。另一方面,将其包含在模型中会使事情更加透明,更易于理解。代码与其余的验证。我也考虑过两者兼顾,但这似乎既不干,也不易维护。

6 个答案:

答案 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)

取决于您的应用程序设计, 如果你有一个中小型应用程序,你可以在两者中或仅在模型中, 但是如果你有一个大型的应用程序,可能是面向服务或分层,那么在数据库中有基本的验证,即强制/可空,最小/最大长度等,更严格,即模型中的模式或业务规则。