Ruby on rails gem bulk_insert:未定义的方法'result_set';零:零级?

Ruby on rails gem bulk_insert:未定义的方法'result_set';零:零级?,ruby-on-rails,ruby,bulkinsert,Ruby On Rails,Ruby,Bulkinsert,我第一次使用gem bulk_insert: 我成功地使用gem将记录从一个表批量复制到另一个表。后来,我需要报告新记录的数量。我看不到从bulk\u insert返回行计数,因此我转向return\u primary\u keys和result\u set获取计数,如自述文件所示 我在第3行添加了inserted=,并在下面添加了最后一行: columns = %i[first_name, last_name, email, referal] inserted = User.bulk_ins

我第一次使用gem bulk_insert:

我成功地使用gem将记录从一个表批量复制到另一个表。后来,我需要报告新记录的数量。我看不到从
bulk\u insert
返回行计数,因此我转向
return\u primary\u keys
result\u set
获取计数,如自述文件所示

我在第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"
现在,我在
put
行上为nil:NilClass获取
NoMethodError:undefined方法'result\u set'

我已经读了几遍自述文件,并搜索了这个问题,但没有结果。还检查了我的最新版本-1.7.0

我错过了什么?我如何才能访问
结果集
?或者更好的是,我可以在不检索新主键的整个列表的情况下获取记录计数吗?

根据,您需要首先创建一个
批量插入工作程序。因此,在你的情况下,我认为它会像这样:

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"
我在中找到了答案,这要归功于butnaruandrei。我必须先创建bulk\u insert对象,然后再调用.add(),而不是在其中使用.add()将块传递给bulk\u 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"

与问题不太相关,但要获得记录的实际计数,您必须深入每个结果集并对每个结果集中的行进行计数,如
count=inserter.result\u sets.map(&:rows).flatten.count
行所示。