Я использую db:populate для предварительной загрузки некоторых образцов данных в мой проект rails. Например, я использую следующий код для заполнения базы данных:
require 'faker'
namespace :db do
task :populate => :environment do
Rake::Task['db:reset'].invoke
100.times do |u|
User.create!(
:name => Faker::Name.name,
:email => Faker::Internet.email
)
end
puts "The count of user(s) is #{User.all.count}"
User.all.each do |u|
# Add some more info based for each user
end
end
end
Однако я получаю сообщение об ошибке, когда запускаю "rake db:populate". Я получил:
rake aborted!
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
Я получаю эту ошибку при вызове puts, где я распечатываю количество пользователей. Если я уменьшу 100 раз примерно до 10 раз, заполнение будет работать правильно, и вызов User.all.count ответит правильным значением 10. Лучшее, что я могу предположить, это то, что вызов «faker» получает перегружен и еще не вернул значение, вызывающее нулевой объект. Однако, возможно, populate пытается запустить это как единую транзакцию базы данных и перегружает какой-то буфер.
Есть ли способ «сбросить» вставку в базу данных, чтобы каждая транзакция записывалась в базу данных или приостанавливалась, пока «мошенник» отвечает, чтобы я мог создать больший набор данных для работы?
Thanks
Steve Woolley
[email protected]