数字验证 - 对另一个属性的引用

时间:2011-11-07 21:49:43

标签: ruby-on-rails-3 validation activerecord

我需要验证来检查属性是否小于或等于同一记录的另一个(虚拟)属性。我怎么能这样做?

示例代码(不工作 - NoMethodError):

attr_reader :virt
attr_accessible :virt

validates :my_attr, :numericality => {:only_integer => true, :less_or_equal => self.virt}

(请温柔而明确,我是RoR newb:])

1 个答案:

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