我需要验证来检查属性是否小于或等于同一记录的另一个(虚拟)属性。我怎么能这样做?
示例代码(不工作 - NoMethodError):
attr_reader :virt
attr_accessible :virt
validates :my_attr, :numericality => {:only_integer => true, :less_or_equal => self.virt}
(请温柔而明确,我是RoR newb:])
答案 0 :(得分:3)
由于在首次遇到类定义时将执行这些验证行,因此self.virt
不存在。
您通常可以传入一个lambda / proc,它将在验证时从对象范围call
进行传递:
validates :my_attr, :numericality => { :less_or_equal => lambda { virt } }
但是,这仍然不是那么好。更好的方法是定义自己的验证方法:
validate :my_attr_is_within_range
def my_attr_is_within_range
my_attr <= virtual_attribute
end
这更清洁,更明确。请注意,您不需要在此使用self
,因为没有歧义(如果您设置了,则需要self
)。