Railsのデフォルトで大量のデータをinsertすると、1レコードずつinsertするのでDBが悲鳴をあげる可能性がある。それを防ぐgemとして activerecord-import があるのでそれを使う。
このgemはupdateも一気に出来るのでそれも紹介する。
環境
rails (5.1.5) activerecord-import (0.23.0)
インストール
以下を Gemfile
に追加
gem "activerecord-import", "~> 0.23.0"
使い方
素のActiveRecordに使う場合はgemがインストールしてれば使えるので特に設定等の追記は必要なし。
一応色々やり方はあるんですが、割とシンプルな方法を今回はご紹介。
bulk insert
{{テーブルのモデル}}.import {{insertしたいモデルを持つ配列}}
みたいな感じなので、実際は以下の感じ。(動作未検証)
names = ["Taro","Ziro","Sato"] users = [] names.each do |name| users << User.new(name: name) end User.import users
bulk update
{{テーブルのモデル}}.import {{updateしたい値に差し替えたモデル}} on_duplicate_key_update: {{アップデートしたいカラムのシンボルの配列}}
みたいな感じなので、これも実際は以下の感じ。(動作未検証)
no_name_users = User.where(name: nil) update_users = [] no_name_users.each do |users| users.name = "NoName" update_users << users end # nameだけUpdate User.import update_users, on_duplicate_key_update:[:name]