有没有destroy_all!/ delete_all!在Rails?

时间:2015-10-03 23:20:45

标签: ruby-on-rails-4

我们正在寻找删除Rails transaction中的多个记录的命令。为了在transaction内触发,我们使用destroy_all!delete_all!并收到method not defined错误。在Rails事务中触发的多条记录的正确删除命令(或正确方法)是什么?

4 个答案:

答案 0 :(得分:9)

不,没有名为delete_all!destroy_all!的方法。请参阅the documentation

改为使用delete_alldestroy_all。如果删除失败,这些方法将引发ActiveRecord错误。这意味着如果出现错误,您的事务将被回滚。

答案 1 :(得分:1)

没有名为delete_all!destroy_all!的方法,但请查看destroy_all!源代码:

def destroy_all(conditions = nil)
    find(:all, :conditions => conditions).each { |object| object.destroy }
end

它调用方法destroy,所以我在这里看不到任何异常。你可以用它。

records.each &:destroy!

答案 2 :(得分:0)

Rails中没有delete_all!destroy_all!,但Rails有delete_alldestroy_all方法。这两种方法之间的差异是:delete_all仅删除具有给定条件的匹配记录,但不删除依赖/关联记录,其中destroy_all删除所有匹配记录及其依赖/关联记录。因此,请根据您的需要明智地在delete_alldestroy_all之间进行选择。

答案 3 :(得分:0)

destroy_all的源代码为:

def destroy_all(conditions = nil)
 find(:all, :conditions => conditions).each { |object| object.destroy }
end 

object.destroy仅在删除失败时返回false而不引发错误以触发事务。

所以,也许我们需要像这样使用它:

ActiveRecord::Base.transaction do 
  records.each(&:destroy!) 
end

对吗?