我第一次使用gem bulk_insert:https://github.com/jamis/bulk_insert
我成功地使用了gem将记录从一个表批量复制到另一个表。稍后,我需要报告新记录的数量。无论如何,我看不到要从bulk_insert
获得行计数,所以我转向return_primary_keys
和result_sets
来获得计数,如自述文件所示。
我在第3行中添加了inserted =
,并在下面添加了最后一行:
columns = %i[first_name, last_name, email, referal]
inserted = User.bulk_insert(*columns, ignore: true, return_primary_keys: true) do |bulk|
bulk.set_size = BATCH_SIZE
registrants.select(:fname, :lname, :email).find_in_batches(batch_size: BATCH_SIZE) do |batch|
batch.each do |reg|
bulk.add [reg.fname, reg.lname, reg.email, 'self-registered']
end
end
end
puts "added #{inserted.result_sets.count} self-registered users"
现在,我在NoMethodError: undefined method 'result_sets' for nil:NilClass
行上看到了puts
。
我已经阅读了几次自述文件,并搜索了没有结果的问题。还检查了我是否有最新版本-1.7.0
我想念什么?我怎么去result_sets
?还是更好,是否可以在不检索新主键的整个列表的情况下获得记录计数?
答案 0 :(得分:1)
根据this issue on the repo,您需要首先创建一个bulk_insert
工作者。所以,在您的情况下,我认为它看起来像这样:
columns = %i[first_name, last_name, email, referal]
insert_worker = User.bulk_insert(*columns, ignore: true, return_primary_keys: true)
insert_worker.set_size = BATCH_SIZE
registrants.select(:fname, :lname, :email).find_in_batches(batch_size: BATCH_SIZE) do |batch|
batch.each do |reg|
insert_worker.add [reg.fname, reg.lname, reg.email, 'self-registered']
end
end
puts "added #{insert_worker.result_sets.count} self-registered users"
答案 1 :(得分:0)
我在https://github.com/jamis/bulk_insert/issues/35中找到了答案,这归功于butnaruandrei。我必须先创建bulk_insert对象,然后再调用.add()……而不是在内部使用.add()将块传递给bulk_insert。
重要提示:我还必须在全部添加完之后添加inserter.save!
。没有这个,最后半个批处理将永远不会被保存...在传递块时它确实会保存在什么地方。起初这并不明显,因为所有似乎都在起作用...但是没有它,最后几条记录就无法保存。
此代码正常工作:
columns = %i[first_name, last_name, email, referal]
inserter = User.bulk_insert(*columns, ignore: true, return_primary_keys: true)
inserter.set_size = BATCH_SIZE
registrants.select(:fname, :lname, :email).find_in_batches(batch_size: BATCH_SIZE) do |batch|
batch.each do |reg|
inserter.add [reg.fname, reg.lname, reg.email, 'self-registered']
end
end
inserter.save!
count = inserter.result_sets.map(&:rows).flatten.count
puts "added #{count} self-registered users"