gem bulk_insert:nil:NilClass的未定义方法`result_sets'?

时间:2018-08-30 17:01:49

标签: ruby-on-rails ruby bulkinsert

我第一次使用gem bulk_insert:https://github.com/jamis/bulk_insert

我成功地使用了gem将记录从一个表批量复制到另一个表。稍后,我需要报告新记录的数量。无论如何,我看不到要从bulk_insert获得行计数,所以我转向return_primary_keysresult_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?还是更好,是否可以在不检索新主键的整个列表的情况下获得记录计数?

2 个答案:

答案 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"