2010-12-13 75 views
0

J'utilise db: populate pour précharger des exemples de données dans mon projet rails. Par exemple, je suis en utilisant le code suivant pour remplir le db:Utilisation de db: remplissage provoquant une exception nulle

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 

Cependant, ce que je reçois est une erreur quand je lance « rake db: équipez ». Je reçois:

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 

Je reçois cette erreur sur l'appel à puts où j'imprime le nombre d'utilisateurs. Si je réduis le 100.times jusqu'à environ 10 fois, le remplissage fonctionne correctement et l'appel à User.all.count répond avec la valeur correcte de 10. Le meilleur que je peux deviner est que l'appel à "faker" "est surchargé et n'a pas encore retourné une valeur qui provoque l'objet nul. Peut-être cependant, le remplissage tente d'exécuter cela comme une transaction de base de données unique et surcharge un peu de tampon. Existe-t-il un moyen de "vider" l'insertion dans la base de données afin que chaque transaction soit écrite dans la base de données ou en pause pendant que "faker" répond pour que je puisse créer un ensemble de données plus grand?

Thanks 
Steve Woolley 
[email protected] 

Répondre

1

J'ai eu le même problème

peut lancer rake db: graines sur quelques expressions de type console, après avoir fait une trace, il dit: ** environnement Invoke (first_time) ** environnement d'exécution

Maintenant, je n'ai pas un environnement 'first_time' J'ai regardé ce que j'ai changé et il se trouve que j'appelais par défaut un environnement différent dans l'initialiseur lors de la tentative de connexion à la base de données.

Jetez un oeil à votre database.yml ou les fichiers application.rb il pourrait y avoir un conflit

Vive

+0

Merci pour la réponse. J'ai vérifié et il n'y a pas de conflit. Mais je pense que s'il y avait un conflit, je ne serais même pas capable de courir même une fois. En l'état, je peux courir 10 fois, mais pas beaucoup plus gros. –