2012-07-03 58 views
1

根據documentation Rails has_many關聯有clear方法。看起來它執行後立即執行sql delete查詢。是否有一種規範的方法來刪除所有的子對象,並只在save方法的時刻更新關聯?例如:Rails has_many清除方法

@cart.container_items.delete_all_example # looks like `clear` execute sql at this line 
if @cart.save 
    # do smth 
else 
    #do smth 
end 

這是必要的,因爲父對象的許多變化,他們必須提交全部或全部都沒有。

回答

2

試試這個:

Cart.transaction do 
    @cart.container_items.delete_all_example # looks like `clear` execute sql at this line 
    if @cart.save 
    # success 
    else 
    # error 
    raise ActiveRecord::Rollback 
    end 
end 

ActiveRecord::Rollback不會傳播事務塊之外。它只是終止交易。

4

你不想delete_all,你想要destroy_all

調用delete_all會執行一個簡單的SQL delete,忽略任何回調和從屬記錄。

使用destroy_all在每個對象上調用destroy方法,允許:dependent => :destroy按預期工作,清理子記錄。

這並不save點摧毀所有對象,並沒有規範的辦法做,因爲你不節省記錄。 Rails在方法調用時持續破壞,而不是在以後的版本save。如果你需要很多破陣是事務性的,它們包裹在一個交易:

Cart.begin do 
    @cart.container_items.delete_all_example 
end 
+0

它在'destroy_all'行執行sql。我想用save方法來做。 – tiktak

+0

這不是Rails破壞對象的方式。摧毀一直是該方法被調用的關鍵點,而不是稍後的「保存」。沒有簡單的方法(或真正的理由)去做你想做的事情。 – meagar