2010-04-13 16 views
38

Ho un'attività Rake che carica i dati di configurazione nel DB da un file, esiste un modo corretto per ruby ​​/ rails per richiamarlo durante una migrazione?Esegui un'attività Rake dalla migrazione?

Il mio obiettivo è quello di sincronizzare mio team DB file di configurazione, , senza aver per trasmettere poi a eseguire l'operazionelalala

def self.up 
    change_table :fis_situacao_fiscal do |t| 
     t.remove :mostrar_endereco 
     t.rename :serie, :modelo 
    end 

    Faturamento::Cfop.destroy_all() 
    #perform rake here ! 
    end 

UPDATE Come faccio ora, e funziona:

system('rake sistema:load_data file=faturamento/cfop') 

E questo è il suggerimento da @Ryan Bigg, un e fa eccezione:

Rake::Task['rake sistema:load_data file=faturamento/cfop'].invoke() 

.

== AlterSituacaoFiscalModeloEndereco: migrating ==================== 
-- change_table(:fis_situacao_fiscal) 
    -> 0.0014s 

rake aborted! 
An error has occurred, this and all later migrations canceled: 

Don't know how to build task 'rake sistema:load_data file=faturamento/cfop' 

Dove è andato storto?

+2

Perché dovresti passare la parola "rake" in? Provalo senza. Sa che è un compito rake. – ryeguy

+0

@Fabiano: aggiornata la risposta. –

risposta

72

Sì c'è un modo per farlo:

Rake::Task['your_task'].invoke 

Aggiornamento

Non mettere rake all'interno delle parentesi, solo il nome del compito. È necessario impostare una variabile ENV quando si esegue questo:

Nella console

FILE=somefile.text rake db:sistema:load_data 

Calling separatamente

FILE=somefile.text rake some:other:task:that:calls:it 

Questo sarà disponibile nei vostri compiti ENV['file']

+0

Ho fatto un aggiornamento con la tua risposta, felice se potessi aiutare ancora un po ' –

+1

Provalo senza "rake" .. – ryeguy

+3

Cosa succede se l'attività è in un namespace? Ho un sistema di seed che può essere eseguito con 'rake semi: seed [89]' (eseguirà il file .rb che inizia con '89_'), ma non posso richiamarlo con' Rake :: Task ['semi: seed [89] '] 'Hai un'idea su come posso richiamare l'attività seed in un file di migrazione? – MrYoshiji

9

Si noti che se si chiama l'attività Rake con 'system', y È necessario controllare lo stato del processo in seguito e generare un'eccezione se l'attività Rake non è riuscita. In caso contrario, la migrazione avrà esito positivo anche se l'attività Rake non riesce.

È possibile controllare lo stato del processo come questo:

if !($?.success?) 
    raise "Rake task failed" 
end 

Invocare il compito rake è un'opzione più bello - causerà la migrazione a fallire se l'operazione non riesce Rake.

Problemi correlati