ActiveRecord destroy_all

6
在Rails 4.1中,ActiveRecord的destroy_all函数是否将整个操作包装在事务中?例如,如果我对一堆记录执行destroy_all操作,并且它们对这些单独对象运行一些回调函数,其中一个失败了,那么整个操作会在那一点上回滚吗?
2个回答

8

看起来不像:

# File activerecord/lib/active_record/relation.rb, line 386
def destroy_all(conditions = nil)
  if conditions
    where(conditions).destroy_all
  else
    to_a.each {|object| object.destroy }.tap { reset }
  end
end

(来自http://apidock.com/rails/v4.1.8/ActiveRecord/Relation/destroy_all

当然,你也可以将其包装在你自己的事务中。


2

看一下destroy_all的文档,似乎没有在事务内完成。以下是源代码:

  # activerecord/lib/active_record/base.rb, line 879
  def destroy_all(conditions = nil)
    find(:all, :conditions => conditions).each { |object| object.destroy }
  end

它找到所有的记录并在每个记录上调用.destroy。从文档中可以看出:

通过实例化每个记录并调用其销毁方法来销毁匹配条件的记录。

但是,如果您想在一个事务中完成它,您可以将destroy_all代码包装在一个事务中,以确保它在一个单独的事务中进行:
ActiveRecord::Base.transaction do
  YourModel.destroy_all(:conditions => conditions)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接