2016-04-21 50 views
0

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)返回falsechildren有一些重複的鍵。但它引起了ActiveRecord::RecordNotSaved的異常,而parenterrors字段與Couldn't save Parent

我很遺憾地使用begin rescue來捕捉這個錯誤。

有什麼辦法可以避免引發異常,在這種情況下parent.update返回false

回答

0

聽起來就像在這種情況下,您想要在事務中包裝parent.update,以便如果任何子記錄驗證失敗,整個事務將被回滾。你最終仍要處理異常

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

如果你最終的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