gem bulk_insert: неопределенный метод `result_sets 'для nil: NilClass? - PullRequest
0 голосов
/ 30 августа 2018

Я впервые использую gem bulk_insert: https://github.com/jamis/bulk_insert

Я успешно использовал гем для массового копирования записей из одной таблицы в другую. Позже мне нужно было сообщить количество новых записей. В любом случае я не вижу, как вернуть счетчик строк с bulk_insert, поэтому я переключился на return_primary_keys и result_sets, чтобы получить счетчик, как показано в файле Readme.

Я добавил inserted = в строку 3 и добавил последнюю строку ниже:

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.

Я прочитал Readme несколько раз и искал проблему безрезультатно. Также проверил, что у меня последняя версия - 1.7.0

Что мне не хватает? Как я могу добраться до result_sets? Или, что еще лучше, могу ли я получить количество записей без получения всего списка новых первичных ключей?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я нашел ответ в https://github.com/jamis/bulk_insert/issues/35, с благодарностью Бутнаруандреи. Сначала я должен был создать объект bulk_insert, а затем вызвать .add () ... вместо того, чтобы передавать блок в bulk_insert с .add () внутри.

ВАЖНО: Я также должен был добавить 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"
0 голосов
/ 30 августа 2018

Согласно этой проблеме в репо , вам сначала нужно создать 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...