destroy_allの挙動が思ったのと違ったのでメモ。
railsでまとめてデータを削除したいときにdestroy_allを使用していたのですが、実際に動いているsql文を見て想定と違ったので調べたのでメモ。
内容としては 数十万件のレコードを舐める時に1000件単位で削除を行おうと思ってコードを書いており、1000件のオブジェクトごとにdestroy_allをかけていました。
想定していた挙動は 1000件まとめてレコードを削除するdelete文が叩かれる事
でしたが、 実際は1レコードずつ削除するdelete文
が叩かれていました。
気になったのでrailsのapidockを見たところdestroy_allの実際の処理は配列のオブジェクトをeachで回して1つずつdestroyを叩いていました。
# File activerecord/lib/active_record/relation.rb, line 398 def destroy_all(conditions = nil) if conditions where(conditions).destroy_all else to_a.each {|object| object.destroy }.tap { reset } end end
勉強になりました。今回はこれで終わりです。