我有两个模型,一个是另一个模型的父模型,父模型是accept_nested_attributes_for和validates_associated孩子。
但是,我的一些验证有:如果需要检查父项的一个属性。
我在想我可以这样做:
validates_presence_of :blah, :if => Proc.new{|thing| thing.parent.some_value.present?}
但是,验证时似乎没有设置“父”关系(我会假设孩子们首先进行实例化和验证。
因此有什么方法可以做我正在考虑的事情?有可能吗?
答案 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