Come impostare un compito rastrello per la semina
-
10-10-2019 - |
Domanda
(Questa è davvero una domanda newbie su Rake & Rails e le dipendenze in generale. Cercando di avvolgere la mia testa intorno a come tutto questo si combina)
In sostanza, voglio un compito Rake che si comporta come seed.rb ma è chiamato a parte. Aggiunge dati di test per l'ambiente di sviluppo, mentre il mio seed.rb fornisce i dati di base per tutti gli ambienti.
Lo script, family_seed.rb, usa factorygirl per generare alcuni record. Ecco come si presenta:
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')
Funziona bene con bundle exec "ruby db/family_seeds.rb"
, ma la mia domanda è come configurarlo con il rastrello. Nel caso il tutto è inserito all'interno di un task Rake? Come potrei, invece, costituire un compito che avrebbe chiamato il copione, garantendo nel contempo che l'ambiente di sviluppo Rails è disponibile quando viene eseguito? Non sto cercando solo per ottenere il lavoro fatto, ma per farlo in un modo "giusto".
Soluzione
Un modo per avvicinarsi a questo sarebbe quello di creare una classe o modulo in lib (questo rende più facile per i test di scrittura per, e rende il codice più riutilizzabile):
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
Come creare il task rake:
require 'family_seed'
namespace :seed do
task :families => :environment do
FamilySeed.seed
end
end
Starei attento con permettendo cose come Family.delete_all e Member.delete_all da usare troppo liberamente. Si potrebbe facilmente spararsi in un piede in seguito chiamando qualcosa che non volevi in ??un db di produzione.
Come eseguire l'attività rake:
Esegui nel vostro comando come con il seguente:
bundle exec rake seed:families
Altri suggerimenti
Creare un compito rastrello e richiede: ambiente
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
Dopo è possibile eseguire questa operazione rake delete_all