2011-01-27 12 views
15

Mam aplikację szyny, która łączy się z wieloma bazami danych. Pisałem niestandardowe zadanie nachylenia, który wygląda tak:Dlaczego zadanie Rake w pętli wykonuje się tylko raz?

task :migrate_accounts_schema => [:environment] do |t| 
    users = User.find :all, :conditions => ["state = 2"], :order => "id asc" 
    users.each do |user|    
    if user.state == 2 
     ActiveRecord::Base.establish_connection(
     :adapter => "postgresql", 
     :host  => user.database_host, 
     :port  => user.database_port, 
     :username => user.subdomain, 
     :password => "#{user.database_password}", 
     :database => user.database_name 
    ) 
     Rake::Task["db:migrate"].invoke 
    end 
    end 
end 

Problem polega na tym, że zadaniem który zaciągnął db: migrować tylko dla użytkowników [0] użytkownika (pierwszego użytkownika w kolekcji) i nie ma błędów, po prostu stoppes cicho .. .

Oto wyjście z prowizji --trace

** Invoke app:migrate_accounts_schema (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute app:migrate_accounts_schema  
** Invoke db:migrate (first_time) 
** Invoke environment 
** Execute db:migrate 
** Invoke db:schema:dump (first_time) 
** Invoke environment 
** Execute db:schema:dump 
** Invoke db:migrate 

nie mam pojęcia, dlaczego reszta użytkowników nie dostać migracji.

Odpowiedz

17

Zapomniałem dokładnie, jakie są wewnętrzne elementy, ale sposób działania Rake'a polega na tym, że invoke wykona każde zadanie tylko w razie potrzeby (innymi słowy raz).

Spróbuj zadzwonić wykonać na kolejnych połączeń:

Rake::Task["db:migrate"].execute

Za pierwszym razem przez pętlę trzeba invoke gdyż wywołuje przesłanki pierwszy.

+0

sprawdzić źródło [tutaj] (http://rake.rubyforge.org/classes/Rake/Task.html) – lebreeze

+0

to zadziałało :) Dziękuję :) –

+2

na ten wydaje się bardzo intuicyjne do mnie. Jakieś pomysły, dlaczego tak to zrobili? – marcovtwout

18

znalazłem odpowiedź w źródle Zgrabiarka:

http://rake.rubyforge.org/classes/Rake/Task.html#M000115

Mówi, że trzeba

ponownie włączyć zadanie, pozwalając jej zadania do wykonania, jeśli zadanie jest ponownie wywoływany.

np. Używałem tego ostatnio na moim projekcie w ten sposób:

# db/seed.rb 
Rake::Task['catalog:destroy'].invoke 

files = Dir.glob("private/catalog/*").sort 
files.each do |file| 
    next unless File.extname(file) == '.xlsx' 
    puts file.split('/').last 
    Rake::Task['catalog:upload'].invoke(file) 
    Rake::Task['catalog:upload'].reenable 
    puts 
end 

Tak więc uruchamiam katalog rake: upload [some_file] każdej pętli.

Mam nadzieję, że to pomoże. zobaczyć również https://stackoverflow.com/a/1290119/3082929

+0

Jestem prawie pewien, że jest to poprawna pod względem technicznym odpowiedź ('# reenable', a nie tylko' # execute') –

Powiązane problemy