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".

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top