機略戦記

Maneuver warfare

Railsで条件に一致するレコードを1000件づつ取得して処理するやつなんだっけ

Railsで条件に一致するレコードを1000件づつ取得して処理するやつなんだっけ

結論

#find_each

find_each - リファレンス - - Railsドキュメント

仕組みとよもやま

ソース

github.com

詳しく読んでないけど、primary_keyでsortしたあとoffsetとlimitを指定してレコードを取得するのを繰り返しているっぽい。

ちなみに1000件以外の件数も指定できる。
ちなみに読み込み開始位置も指定できる。

# 指定したbatch_size件づつselectされる
pry(main)> User.all.find_each(batch_size: 10).to_a
 User Load (1.0ms)  SELECT  `users`.* FROM `users`   ORDER BY `users`.`id` ASC LIMIT 10
 User Load (4.5ms)  SELECT  `users`.* FROM `users`  WHERE (`users`.`id` > 10)  ORDER BY `users`.`id` ASC LIMIT 10
 User Load (0.6ms)  SELECT  `users`.* FROM `users`  WHERE (`users`.`id` > 20)  ORDER BY `users`.`id` ASC LIMIT 10
...

# 指定したbatch_size件づつselectされる。start: 50を指定したのでid: 50以降が取得される。
pry(main)> User.all.find_each(batch_size: 10, start: 50).to_a
  User Load (0.7ms)  SELECT  `users`.* FROM `users`  WHERE (`users`.`id` >= 50)  ORDER BY `users`.`id` ASC LIMIT 10
  User Load (0.6ms)  SELECT  `users`.* FROM `users`  WHERE (`users`.`id` > 59)  ORDER BY `users`.`id` ASC LIMIT 10
  User Load (0.6ms)  SELECT  `users`.* FROM `users`  WHERE (`users`.`id` > 69)  ORDER BY `users`.`id` ASC LIMIT 10
...