在Rails 4.1中,ActiveRecord的
destroy_all
函数是否将整个操作包装在事务中?例如,如果我对一堆记录执行destroy_all
操作,并且它们对这些单独对象运行一些回调函数,其中一个失败了,那么整个操作会在那一点上回滚吗?destroy_all
函数是否将整个操作包装在事务中?例如,如果我对一堆记录执行destroy_all
操作,并且它们对这些单独对象运行一些回调函数,其中一个失败了,那么整个操作会在那一点上回滚吗?看起来不像:
# 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)
当然,你也可以将其包装在你自己的事务中。
看一下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