2015-11-04 35 views
2

在Rails 4.1中,ActiveRecord destroy_all是否包含事務中的整個函數?例如,如果我有一堆記錄,我在其上執行了一個destroy_all操作,並且它們對這些單個對象運行一些回調,並且其中一個回調失敗,那麼整個操作在該點回滾?ActiveRecord destroy_all

回答

4

它看起來並不像它:

# 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

查看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