2014-06-10 12 views
7

È sorprendente che gli inizializzatori di Rails vengano eseguiti durante l'esecuzione di qualsiasi attività rake, tra cui db:migrate e db:seed.Gli inizializzatori dei rails sono in esecuzione durante la migrazione del database

Un inizializzatore nella mia app avvia un thread in background (una sorta di processo di lavoro) e deve essere eseguito solo quando l'applicazione è in esecuzione in modalità di debug e produzione.

Come impedire l'esecuzione di un inizializzatore specifico quando si esegue rake db:migrate o come rilevare nell'inizializzatore che è in esecuzione un'attività di rake?

+2

Le migrazioni devono caricare il proprio ambiente, gli inizializzatori sono parte integrante di un ambiente. Se è necessario che un inizializzatore non venga eseguito durante la migrazione, probabilmente si trova nel posto sbagliato. – Matt

risposta

4

Ecco una soluzione come evitare un inizializzatore esecuzione nel task Rake:

unless (File.basename($0) == 'rake') 
    # Initializer code 
end 
+1

Questo _obviously_ dipende dal richiamo con "rake". Se stai iniziando a usare "rail" per il comando 'rails db: migrate' o alcuni di questi, questo non funzionerà. – traday

1

Le migrazioni devono caricare l'ambiente, gli inizializzatori sono parte integrante di un ambiente. Se è necessario che un inizializzatore non venga eseguito durante la migrazione, probabilmente si trova nel posto sbagliato.

Se non riesci a spostarlo altrove, forse questa risposta (create a 'fast migrate' rake task) sarà di aiuto.

+4

Matt, cos'è questo "altrove"? Requisiti: ho bisogno di eseguire un thread all'avvio dell'applicazione e non ne ho bisogno durante la migrazione. Dove posizionare il thread start NON deve occuparsi di parametri aggiuntivi della riga di comando, come in quella risposta sulla migrazione veloce? – Paul

1

Se l'inizializzatore dipende dalla CREATON di una tabella specifica, un'alternativa è quello di verificare con ActiveRecord::Base.connection.table_exists? :mytable.

Problemi correlati