Cómo configurar una tarea Rake para la siembra
-
10-10-2019 - |
Pregunta
(Esto es realmente una pregunta sobre novato Rake y rieles y dependencias en general. Tratando de envolver mi cabeza alrededor de cómo funciona todo esto encaja)
Básicamente, quiero una tarea Rake que actúa como seed.rb pero se llama por separado. Se añade datos de prueba para el entorno de desarrollo, mientras que mi seed.rb proporciona datos básicos para todos los entornos.
El guión, family_seed.rb, utiliza factorygirl para generar algunos registros. Se ve así:
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')
Se ejecuta bien con bundle exec "ruby db/family_seeds.rb"
, pero mi pregunta es cómo configurarlo con el rastrillo. En caso de que todo el asunto se coloca dentro de una tarea Rake? ¿Cómo podría, en cambio, establecer una tarea que llamar a la secuencia de comandos, asegurando al mismo tiempo que el entorno de desarrollo de rieles está disponible cuando se ejecuta? Estoy intentando no sólo para hacer el trabajo, sino para hacerlo de una manera "correcta".
Solución
Una manera de abordar esto sería la creación de una clase o módulo en lib (esto hace que sea más fácil para las pruebas de escritura para, y hace que el código sea más reutilizable):
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
Cómo crear la tarea rake:
require 'family_seed'
namespace :seed do
task :families => :environment do
FamilySeed.seed
end
end
Yo tendría cuidado con lo que permite cosas como Family.delete_all y Member.delete_all para ser utilizado con demasiada libertad. Desde aquí se puede disparar en el pie más adelante llamando a algo que no quería decir que en una base de datos de producción.
Cómo ejecutar la tarea rake:
Ejecutar en su comando como con la siguiente:
bundle exec rake seed:families
Otros consejos
Crear una tarea rastrillo y requiere: medio 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
Después puede ejecutar esta tarea rake delete_all