2015-08-30 46 views
0

我有一个情况(解析),我需要从子记录开始,添加它们的逻辑父项,然后在验证子项和父项的同时保存。如何防止在父项无效时保存ActiveRecord子对象?

有没有一个标准的方式来处理这与Rails?

考虑以下关系:

  • has_many儿童,validates :child, presence: true
  • 儿童belongs_to

我看到类似以下内容:

p = Parent.new # with a missing required attribute 
c = Child.new 
c.parent = p # or c.parents << p, this isn't important 
p.valid? # false 
c.valid? # true 
c.save # true 

所以这让我拯救小孩d而新关联的父对象有错误。

有没有一种常规的方法来解决这个问题?我相信这在交换对象时可以正常工作,正如他们之间的关系所期望的那样。

但是,在这种情况下,我不能从父母开始,因为它可能已经存在,并且我为此单独做了find_or_create。在这种情况下,从儿童记录开始更合乎逻辑。

Google/SO搜索没有帮助。

回答

1

您可以在子模型中添加custom validator类似如下:

validate parent_model_validate 

而且,然后添加parent_model_validate方法相同(子)模型:

def parent_model_validate 
    unless self.parent.valid? 
     errors.add(:child_model, 'Parent is not valid') 
    end 
    end 

这个验证将使确定,如果父模型无效,那么子模型将不会被保存。

1

看看validates_associatedhere。 (请注意不要在两端都使用它)

相关问题