2012-08-28 15 views
17

Mi aplicación de rieles tiene un rastreador de sitio web que carga las credenciales de autenticación que el rastreador utiliza en un inicializador de rieles en config/initializers. El inicializador carga la autenticación llamando a un método modelo en el modelo SiteLogin.¿Cómo omito la carga de los inicializadores de Rails al ejecutar una tarea de rake?

Cuando ejecuto rake db:migrate para crear la tabla de modelo SiteLogin, falla porque el inicializador espera que la tabla de la base de datos ya exista. Simplemente puedo comentar el código en mi inicializador, ejecutar la migración para crear la tabla, luego descomentar el código del inicializador y no preocuparme por el problema.

El problema es que estoy usando Capistrano para implementar y esto significa que tendría que implementar primero sin el código de inicializador para ejecutar la migración y luego implementar de nuevo con el código de inicializador. ¿Hay una mejor manera de hacerlo o mi enfoque es totalmente incorrecto en este caso?

He aquí algunos ejemplos de código para explicar mejor mi caso:

# config/initializers/site_crawler_init.rb 
SiteCrawler.setup do |config| 
    config.hostname = "www.example.com" 
end 

# model/site_crawler.rb 
class SiteCrawler 
    ... 
    class << self 
    attr_accessor :configuration 

    def setup 
     self.configuration ||= Configuration.new 
     yield(configuration) 
    end 
    end 

    class Configuration 

    attr_accessor :hostname, :login_credentials 

    def initialize 
     @login_credentials = SiteLogin.admin_user 
     ... 
    end 
    end 
end 

Respuesta

18

Su quizá no sea la mejor solución, pero se puede comprobar si la tabla existe:

if ActiveRecord::Base.connection.tables.include?('your_table_name') 
    # your code goes here 
end 

Pero su general no es suficiente, porque podría haber migraciones pendientes.

Ahora, también se puede comprobar si se encuentra en una tarea rake:

if ActiveRecord::Base.connection.tables.include?('your_table_name') and !defined?(::Rake) 
    # your code goes here 
end 

y podría ser aún insuficiente al iniciar las pruebas, ya que se ejecutan en una tarea de rastrillo, por lo que también podría compruebe si el entorno Rails es prueba (Rails.env.test?).

8

Tuve un problema similar en el que necesitaba saltear un inicializador en particular (para el trabajo retrasado, que requiere una tabla de retraso de trabajo), cuando se ejecuta una tarea de rake específica, en este caso db: migrate.

que añade lo siguiente a mi Rakefile:

def running_tasks 
    @running_tasks ||= Rake.application.top_level_tasks 
end 

def is_running_migration? 
    running_tasks.include?("db:migrate") 
end 

Y a continuación, el siguiente en mi initialiser problemática:

unless defined?(is_running_migration?) && is_running_migration? 
    ... do whatever 
end 
Cuestiones relacionadas