Railsで条件に一致するレコードを1000件づつ取得して処理するやつなんだっけ
Railsで条件に一致するレコードを1000件づつ取得して処理するやつなんだっけ
結論
#find_each
find_each - リファレンス - - Railsドキュメント
仕組みとよもやま
ソース
詳しく読んでないけど、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 ...