バッチ処理などで大量のレコードを処理するときは、少しづつ取得して処理するためにページネーションを用いるのが一般的だが、このときオフセットベースページネーション(一般的なページネーション)を使ってはいけない。 たとえば以下のように有効期限の切れたファイルの情報を格納するレコードを削除するときを考える。 i = 0 n = 100 now = Time.zone.now loop do records = UploadedFile.where('expired_at <= ?', now) records = records.limit(n).offset(n * i) records = records.to_a break if records.empty? records.each do |record| record.file.delete # S3等にアップロードしてあるファイルを削