Comment mettre en place une tâche Rake pour l'ensemencement
-
10-10-2019 - |
Question
(Ceci est vraiment une question de débutant à propos Rake & Rails et dépendances en général. Essayer d'envelopper la tête autour de la façon dont tout cela va ensemble)
En fait, je veux une tâche Rake qui agit comme seed.rb mais est appelé séparément. Il ajoute des données de test pour l'environnement de développement, alors que mon 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 doit être placé dans une tâche Rake? Comment pourrais-je, au contraire, mettre en place une tâche qui appellerait le script, tout en veillant à ce que l'environnement de développement Rails est disponible quand il fonctionne? J'essaie non seulement de faire le travail, mais de le faire d'une manière « droit ».
La solution
Une façon d'aborder ce serait de créer une classe ou d'un module dans lib (ce qui facilite à des tests d'écriture 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
Comment créer la tâche rake:
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 pouvez facilement vous tirer dans le pied plus tard en appelant quelque chose que vous ne vouliez pas sur une db de production.
Comment faire pour exécuter la tâche rake:
Exécuter dans votre commande comme avec ce qui suit:
bundle exec rake seed:families
Autres conseils
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