2010-12-15 71 views
3

(Ceci est vraiment une question de débutant à propos Rake & Rails & dépendances en général. Essayer d'envelopper la tête autour de la façon dont tout cela va ensemble)Comment mettre en place une tâche Rake pour l'ensemencement

Fondamentalement, je veux un Rake tâche qui agit comme seed.rb mais est appelée séparément. Il ajoute des données de test pour l'environnement de développement, tandis que seed.rb fournit des données de base pour tous les environnements.

Le script, family_seed.rb, utilise FactoryGirl pour générer des enregistrements. Il ressemble à ceci:

require File.expand_path('../../config/environment', __FILE__) 
require './spec/factories' 

Family.delete_all 
Member.delete_all 
zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500') 
blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501') 

Il fonctionne très bien avec bundle exec "ruby db/family_seeds.rb", mais ma question est de savoir comment le configurer avec râteau. Le tout devrait-il être placé dans une tâche de Rake? Comment pourrais-je, à la place, configurer une tâche qui appelle le script, tout en s'assurant que l'environnement de développement Rails est disponible quand il s'exécute? J'essaie non seulement de faire le travail, mais de le faire d'une «bonne» manière.

Répondre

5

Une façon d'aborder ce serait de créer une classe ou d'un module dans lib (cela rend plus facile d'écrire des tests pour, et rend le code plus réutilisable):

require '../spec/factories' 

class FamilySeed 

    def self.seed 
    raise "Don't run this in production!" if Rails.env.production? 

    Family.delete_all 
    Member.delete_all 
    zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500') 
    blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501') 
    end 

end 

Ensuite, créer une tâche de râteau tel comme:

require 'family_seed' 

namespace :seed do 
    task :families => :environment do 
    FamilySeed.seed 
    end 
end 

Je serais prudent avec permettant d'être trop librement utilisé des choses comme Family.delete_all et Member.delete_all. Vous pourriez facilement vous tirer dans le pied plus tard en appelant quelque chose que vous ne vouliez pas faire sur un db de production.

+0

C'est un excellent avertissement! Est-il possible de garantir qu'une tâche s'exécute uniquement dans un environnement donné? L'objet tel que la classe FamilySeed peut-il inspecter l'environnement pour voir s'il s'agit d'un test ou d'une production? –

+0

J'ai mis à jour le code pour lever une exception si les rails env sont en production. – idlefingers

2

Créer une tâche de râteau et nécessitent: environnement

task :delete_all => :environement do 
    require Rails.root.join('spec/factories') 
    Family.delete_all 
    Member.delete_all 
    zinsser = Factory.create(:family, :last_name=>'Zinsser', :first_name=>'Carl', :sim_id => '500') 
    blackburn = Factory.create(:family, :last_name=>'Blackburn', :first_name=>'Greg', :sim_id => '501') 
end 

Une fois que vous pouvez exécuter cette tâche rake delete_all

+1

Ceci est bon pour montrer comment faire tout en une seule tâche. La clé qui me manquait est le ... =>: bit d'environnement. J'aime le "delete_all" comme le nom de la tâche - le rend moins susceptible de l'exécuter par accident. –