ActiveRecord验证:基于属性或功能
我正在寻找一些有关ActiveRecord在执行从ActiveRecord :: Base继承的类的实例的验证时实际做了什么的澄清。
为了讨论的目的,这里是一个例子(你可以假设bar是由AR迁移生成的foos表中的一列)
class Foo < ActiveRecord::Base
def bar
read_attribute(:bar).length
end
end
f = Foo.new
f.bar = 'abcdefg'
f.bar => 7
f.read_attribute(:bar) => 'abcdefg'
我想了解的是当ActiveRecord调用.valid时? (或调用验证的任何方法)是否经过f.bar验证,或者是否验证了f.read_attribute(:bar)?
答案是否有特殊情况? 例如,当使用唯一性验证程序或自定义验证程序时。
同样重要的是:当AR写入生成插入或更新语句以将对象写入数据库时,属性值是否保持不变或者是否使用具有所使用的表列名称的函数返回的值?
有趣的问题,所以我尝试了一下。
存在的验证在f.bar
访问器方法上, f.bar
不是在f.read_attribute(:bar)
但是,唯一性验证将测试条列值为7
的记录不在数据库中,因此唯一性验证将无法按预期工作。
为了唯一性,您可能希望在测试f.read_attribute(:bar)
不存在的情况下进行自定义验证(并且如果它存在,它不是相同的记录)
自定义验证程序当然是自定义的,因此您可以根据最适合您的需要的方式显式使用f.bar
或f.read_attribute(:bar)
。
上一篇: ActiveRecord Validation: based on attribute or function
下一篇: ruby on rails