是否可以进行分组验证?

时间:2010-06-10 21:10:22

标签: ruby-on-rails validation activerecord

我使用了很多自己的验证方法来比较一个关联到另一个关联的数据。我注意到在尝试给他们打电话之前我经常检查我的关联是不是nil,但我也在验证他们的存在,所以我觉得我的零检查是多余的。这是一个例子:

class House < ActiveRecord::Base
  has_one :enterance, :class => Door
  has_one :exit, :class => Door

  validates_presence_of :enterance, :exit

  validate :not_a_fire_hazard
  def not_a_fire_hazard
    if enterance && exit && enterance.location != exit.location
      errors.add_to_base('If there is a fire you will most likely die')
      return false
    end
  end
end

我觉得我通过检查enterance的存在并在我自己的验证中退出来重复自己。

还有更多“The Rails Way”吗?

1 个答案:

答案 0 :(得分:0)

您还可以考虑使用validates_associated节来验证关联对象本身是否有效。另外,另一种更清洁的方法是确保入口和出口都存在(不是零)将具有以下内容:

validates_presence_of :entrance_or_foo

def entrance_or_foo
    entrance and foo
end

然后,您可以清理火灾危险方法,如下所示:

 def not_a_fire_hazard
    if enterance.location != foo.location
      errors.add_to_base('If there is a fire you will most likely die')
    end
 end

上面的定义中不需要返回false。

正如Francois在评论中所指出的,exit是内核模块中定义的方法。您应该重命名您的类,以避免与Ruby定义的退出方法混淆。我已经在上面的示例代码中将exit实例重命名为foo。