根据documentation Rails has_many
关联有clear
方法。看起来它在执行后立即执行sql delete
查询。是否有规范方法删除所有子对象并仅在save
方法时更新关联?例如:
@cart.container_items.delete_all_example # looks like `clear` execute sql at this line
if @cart.save
# do smth
else
#do smth
end
这是必要的,因为父对象有很多变化,它们必须全部或全部都没有提交。
答案 0 :(得分: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
答案 1 :(得分: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
不会在事务块之外传播。它只是终止了交易。
答案 2 :(得分:0)
看起来我正在尝试transaction
。一些文章要了解更多信息: