2010-04-13 12 views
38

Mam zadanie Rake, które ładuje dane konfiguracyjne do pliku DB z pliku, czy istnieje poprawny sposób na ruby ​​/ szyny, aby wywołać go podczas migracji w górę?Wykonaj zadanie rake z poziomu migracji?

Moim celem jest, aby zsynchronizować mojego zespołu DB configs, bez muszą nadawać następnie uruchomić zadanielalala

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 Jak mam teraz zrobić i działa:

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

To jest propozycja od @Ryan Bigg, a nd to wyjątek:

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' 

Gdzie poszło nie tak?

+2

Dlaczego chcesz podać słowo "rake"? Wypróbuj bez niego. Wie, że to zadanie rake. – ryeguy

+0

@Fabiano: Zaktualizowano odpowiedź. –

Odpowiedz

72

Tak istnieje sposób, aby to zrobić:

Rake::Task['your_task'].invoke 

Aktualizacja

Nie wkładać grabie wewnątrz nawiasów, tylko nazwa zadania . należy ustawić zmienną ENV przy uruchamianiu tego:

W konsoli

FILE=somefile.text rake db:sistema:load_data 

Wywołanie go osobno

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

To będzie dostępny w swoich zadań ENV['file']

+0

Wprowadziłem aktualizację z twoją odpowiedzią, cieszę się, jeśli mógłbyś pomóc więcej. –

+1

Wypróbuj bez "rake" .. – ryeguy

+3

Co jeśli zadanie jest w przestrzeni nazw? Mam system początkowy, który można uruchomić z 'rake semi: seed [89]' (uruchomi plik .rb zaczynając od '89_'), ale nie mogę go wywołać z' Rake :: Task ['semi: seed [89] '] 'Czy masz pomysł, w jaki sposób mogę wywołać zadanie seed w pliku migracji? – MrYoshiji

9

Pamiętaj, że jeśli wywołasz zadanie Rake z "system", y musisz sprawdzić status procesu i podnieść wyjątek, jeśli zadanie Rake nie powiodło się. W przeciwnym razie migracja się powiedzie, nawet jeśli zadanie Rake nie powiedzie się.

Można sprawdzić stan procesu takiego:

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

Wywoływanie zadanie natarcia jest ładniejszy opcję - spowoduje to migracja na niepowodzenie, jeśli zadanie Rake zawiedzie.

Powiązane problemy