ActiveRecord で行数を指定して delete_all したかった

たとえば、100件レコードがあり、最新10件を残して削除したかったので、直感的に以下のように書いてみた。

Model.limit(10).order('created_at').delete_all

すると、エラーが出て動作しない。

ActiveRecord::ActiveRecordError: delete_all doesn't support limit scope

エラーの内容から、limit が挟まると delete_all できないようだ(destroy_all はできましたが、件数が多いときは delete_all で消したいものです)

StackOverFlow で以下のようなコードを見つけたので抜粋。

Model.delete(Model.order(:id).limit(10).map(&:id))

一旦 id のリストをとってきて、Model.delete に配列で渡すと、

DELETE FROM "models" WHERE "models"."id" IN (1, 2, 3)

結果的に delete_all のような処理が発行される。

やってはみたものの、コールバックが必要だったので結局 destroy_all を使いましたがメモっときます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする