1

根据文档Railshas_many协会有clear方法。看起来它在执行delete后立即执行 sql 查询。是否有一种规范的方法来删除所有子对象并仅在save方法时更新关联?例如:

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

这是必要的,因为父对象的许多更改必须全部提交或不提交。

4

3 回答 3

4

你不想delete_all,你想destroy_all

调用delete_all执行一个简单的 SQL delete,忽略任何回调和相关记录。

Usingdestroy_all调用destroy每个对象上的方法,允许:dependent => :destroy按预期工作,清理子记录。

这不会破坏点处的所有对象save,并且没有规范的方法可以做到这一点,因为您没有保存记录。Rails 在方法调用时持续销毁,而不是在稍后的save. 如果您需要许多销毁是事务性的,请将它们包装在一个事务中:

Cart.begin do
  @cart.container_items.delete_all_example
end
于 2012-07-03T11:05:43.487 回答
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不会在事务块之外传播。它只是终止事务。

于 2012-07-03T15:17:12.840 回答
0

看起来我正在尝试做一个transaction. 一些文章可以进一步了解它:

于 2012-07-03T11:41:37.223 回答