ActiveRecord的validates验证:基于数据库记录还是getter方法?
ActiveRecord validates 验证的取值逻辑
- ActiveRecord 的
validates验证完全依赖你定义的属性 getter 方法返回值,不会直接读取数据库中存储的原始记录。
针对你给出的代码示例:
class Person < ApplicationRecord validates :name, presence: true def name 'hello world' end end
不管你给 name 字段赋值什么(包括 nil),甚至数据库里的 name 列是空的,valid? 验证永远会通过——因为验证执行时会调用你重写的 name 方法,拿到固定返回值 'hello world',满足 presence: true 的要求。
验证的底层逻辑
ActiveRecord 的属性系统是基于方法封装的,所有对属性的访问(包括验证、视图渲染、业务逻辑调用)都会走 getter 方法。验证器在检查属性值时,本质就是调用 object.attribute_name 获取值,再进行校验。
如果你需要验证数据库列的原始值(不经过 getter 处理),可以直接访问原始属性哈希:
validates :name, presence: true, if: -> { attributes['name'].present? } # 或者用 read_attribute 方法 validates :name, presence: true, if: -> { read_attribute(:name).present? }
但这种用法属于特殊场景,通常不推荐,因为它打破了 ActiveRecord 属性封装的设计意图。
内容的提问来源于stack exchange,提问作者Sheng
相关产品推荐
相关产品推荐

