2012-08-28 10 views
17

L'app My Rails dispone di un crawler del sito Web che carica le credenziali di autenticazione utilizzate dal crawler in un inizializzatore di rotaie in config/initializers. L'inizializzatore carica l'autenticazione chiamando un metodo modello nel modello SiteLogin.Come saltare il caricamento degli inizializzatori Rails durante l'esecuzione di un'attività rake?

Quando eseguo rake db:migrate per creare la tabella di modello SiteLogin, non riesce perché l'inizializzatore si aspetta che la tabella di database esista già. Posso semplicemente commentare il codice nel mio inizializzatore, eseguire la migrazione per creare la tabella, quindi decommentare il codice inizializzatore e non preoccuparti del problema.

Il problema è che sto utilizzando Capistrano per la distribuzione e questo significherebbe che dovrei eseguire il deploy prima senza il codice di inizializzazione per eseguire la migrazione, quindi distribuire di nuovo con il codice di inizializzazione. C'è un modo migliore per farlo o il mio approccio è totalmente sbagliato in questo caso.

Ecco qualche esempio di codice per spiegare meglio il mio 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 

risposta

18

Il suo forse non è la soluzione migliore, ma è possibile controllare se la tabella esiste:

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

Ma il suo genere non basta, perché potrebbero esserci migrazioni in sospeso.

Ora, si potrebbe anche verificare se si è in un task rake:

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

e potrebbe essere ancora sufficiente al momento del lancio i test, perché non vengono eseguiti in un compito rastrello, così si potrebbe anche controllare se l'ambiente Rails è test (Rails.env.test?).

8

Avevo un problema simile in cui avevo bisogno di saltare un particolare inizializzatore (per il lavoro in ritardo, che richiede una tabella delayed_job presente), quando si esegue una specifica attività rake - in questa istanza db: migrate.

ho aggiunto il seguente al mio Rakefile:

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

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

E poi quanto segue nella mia initialiser problematico:

unless defined?(is_running_migration?) && is_running_migration? 
    ... do whatever 
end 
Problemi correlati