ActiveRecord destroy_all

时间:2015-11-04 23:49:40

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

在Rails 4.1中,ActiveRecord destroy_all是否在事务中包装整个函数?例如,如果我有一堆记录,我执行destroy_all操作,并且他们在这些单个对象上运行一些回调,其中一个失败会导致整个操作在那时回滚吗?

2 个答案:

答案 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