Rails has_many清晰的方法

时间:2012-07-03 11:02:29

标签: sql ruby-on-rails ruby activerecord has-many

根据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

这是必要的,因为父对象有很多变化,它们必须全部或全部都没有提交。

3 个答案:

答案 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。一些文章要了解更多信息:

相关问题