LoginSignup
14
14

More than 5 years have passed since last update.

ActiveRecordのブルクアップデート(bulk update)で悩みました

Last updated at Posted at 2014-11-14

ある日、突然ぶつかったActiveRecordの大量Update問題

Rails4で大量レコード(数10万件)のUpdate処理を書いています。しかも似たような処理を70回前後繰り返す必要があります。
1行ずつupdateすると、アップデート文だけで日が暮れちゃいます。

Insertなら、軽い軽いですが

insertするときは、bulk insertのgemがあって助かりました。

  gem 'activerecord-import'

bulk updateで調べよう

activerecord-import gemで"bulk update"が実現できますが、ON DUPLICATE KEY UPDATEを使っているため、MySql限定サービスらしいです。

ネットで「ActiveRecord bulk update」を調べてもいい回答がなく、もう降参だ!、と思いました。

ひらめき

そのとき、update_all関数が目に留まりました。なるほど、だからbulk updateのgemがないわけですね。そもそもupdate_allがあるから。

  conditions.each_slice(1000) do |sliced_conditions|
    SomeModel.where(condition_field: sliced_conditions).update_all(field_to_be_update: value_to_set)
  end

で悩んでいたbulk updateを実現できました。
each_sliceを使うのがSQLでINリストの上限オーバーを回避するため

独り言

なるほど、そもそも、bulk updateって必要ないわけないですね。

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14