Ruby on rails gem bulk_insert:未定义的方法'result_set';零:零级?
我第一次使用gem bulk_insert: 我成功地使用gem将记录从一个表批量复制到另一个表。后来,我需要报告新记录的数量。我看不到从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
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
行所示。