微妙に書いてなかったので自分用にメモ
update_users = []
users.each do |user|
user.name = "John"
user.email = "test@mail.com"
update_users << user
end
# ここのon_duplicate_key_updateに更新したい列名を渡す
User.import update_users, on_duplicate_key_update: [:name, :email]
GemのデフォルトはINSERTをする用途でon_duplicate_key_update
オプションで列名を指定してあげることでキーが被ったときに指定した列が更新される(Upsertされる)という理解をした。
なので元々あるユーザーだけを更新して渡せばUpdateだけされるという感じ。
ちなみにDBによってこのオプションの指定の仕方は違うらしい
https://github.com/zdennis/activerecord-import/#duplicate-key-update
# MySQL version
Book.import [book], on_duplicate_key_update: [:title]
# PostgreSQL version
Book.import [book], on_duplicate_key_update: {conflict_target: [:id], columns: [:title]}