实际的项目环境中,我们时常会有一次动作写入多条数据的场景,比如导数据,创建通知、Event 给多个人...
简单做法可能大家会直接循环插入
receiver_ids.each do |user_id|
Event.create(user_id: user_id, event_type: 'test')
end
或者你可能会在外面包个 transaction 来减少 Commit 次数,从而微微的提速,但还是有 N 次数据库的调用
Event.transaction do
receiver_ids.each do |user_id|
Event.create(user_id: user_id, event_type: 'test')
end
end
或者你还知道 SQL 批量插入的方法:
INSERT INTO events (event_type, user_id) VALUES("test", 2),("test", 5),("test", 8) ...;
ref: MySQL, PostgreSQL
关于第三种方式,有 Gem 帮助我们简单来实现:
https://github.com/jamis/bulk_insert
# Gemfile
gem 'bulk_insert'
然后我们就可以用了:
Event.bulk_insert(set_size: 100) do |worker|
receiver_ids.each do |user_id|
worker.add({ user_id: user_id, event_type: 'test' })
end
end