下級エンジニアの綴

新しく発見したことを綴っていこうと思っています。夢はでっかく上級エンジニアになることです。

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

勉強になりました。今回はこれで終わりです。