たとえば、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で消したいものです。もちろんdestroy_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を使いました。