在Rails 4.1中,ActiveRecord destroy_all
是否在事务中包装整个函数?例如,如果我有一堆记录,我执行destroy_all
操作,并且他们在这些单个对象上运行一些回调,其中一个失败会导致整个操作在那时回滚吗?
答案 0 :(得分:7)
它看起来不像:
# 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)
当然,您可以将其包装在您自己的交易中。
答案 1 :(得分:1)
查看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
。来自doc:
通过实例化每条记录来销毁记录匹配条件 并调用其销毁方法。
但是,如果您希望在一个事务中实现它,您可以将destroy_all
代码包装在一个事务中,以确保它在一个事务中发生:
ActiveRecord::Base.transaction do
YourModel.destroy_all(:conditions => conditions)
end