根据父模型验证模型

时间:2011-04-12 11:21:53

标签: ruby-on-rails ruby validation activerecord

我有两个模型,一个是另一个模型的父模型,父模型是accept_nested_attributes_for和validates_associated孩子。

但是,我的一些验证有:如果需要检查父项的一个属性。

我在想我可以这样做:

validates_presence_of :blah, :if => Proc.new{|thing| thing.parent.some_value.present?}

但是,验证时似乎没有设置“父”关系(我会假设孩子们首先进行实例化和验证。

因此有什么方法可以做我正在考虑的事情?有可能吗?

3 个答案:

答案 0 :(得分:1)

您可以根据需要使用before_update或before_create回调。

def before_update
  self.errors.add("Error Message") if self.parent.some_value.present?
  return false if self.errors.count > 0
end

def before_create
  self.errors.add("Error Message") if self.parent.some_value.present?
  return false if self.errors.count > 0
end

答案 1 :(得分:0)

这种验证应该有效:

  

validates_associated:children

但它不会

据我所知,原因是使用acceptes_nested_attributes_for通过一个事务直接创建嵌套对象而不传递任何子验证。

您可以在此处执行的操作:在父模型中编写您自己的验证并验证创建子对象。

答案 2 :(得分:0)

在父项上使用:inverse_of选项进行关联,因此子项在构建时将具有对父项的引用。

class Parent < ActiveRecord::Base
  has_many :children, :inverse_of => :parent
  accepts_nested_attributes_for :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

p = Parent.new :children_attributes => { 0 => { :child_attribute => 'value' } }
p.children.first.parent #=> shouldn't be nil anymore