Parent
有很多children
,我希望(批量)插入使用parent.update(children: children)
的儿童,就像这样
parent = Parent.find(id)
if parent.update(children: children)
# render OK
else
# render Error
end
Child
由validates_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
?
答案 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