如何在嵌套属性无法保存时避免引发异常

时间:2016-04-21 14:29:23

标签: ruby-on-rails

Parent有很多children,我希望(批量)插入使用parent.update(children: children)的儿童,就像这样

parent = Parent.find(id)
if parent.update(children: children)
    # render OK
else
    # render Error
end

Childvalidates_uniqueness_of :parent_id, scope: :number验证,并且还有约束UNIQUE (parent_id, number)

parent.update(children: children)有一些重复的密钥时,我希望false返回children。但它引发了ActiveRecord::RecordNotSaved的例外,而parent的{​​{1}}字段带有errors

我很遗憾地使用Couldn't save Parent来捕获此错误。

有没有办法避免引发异常,让begin rescue在这种情况下返回parent.update

1 个答案:

答案 0 :(得分:0)

听起来在这种情况下,您希望将parent.update包装在事务中,以便在任何子记录验证失败时,将回滚整个事务。您仍将最终处理异常

parent = Parent.find(id)
parent.transaction do
   begin
     parent.update(children: children)
     # render OK
   rescue
     # render Error
   end
end

如果最终得到的值为false,那么您可以将更新事务放在自己的函数中并返回true或false

def update_children(parent, children)
  parent.transaction do
  begin
    parent.update(children: children)
  rescue
    false
  end
end

并根据该结果决定要渲染的内容:

parent = Parent.find(id)
if update_children(parent, children)
  # render OK
else
  # render Error
end