2011-01-27 181 views
15

我有rails應用程序連接到多個數據庫。我寫了自定義的rake任務,看起來像這樣:爲什麼循環中的Rake任務只執行一次?

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 

的問題是,執行任務DB:只能遷移用戶[0]用戶(第一用戶集合)並沒有錯誤,只是默默地stoppes .. 。

下面是從耙輸出--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 

我不知道爲什麼其餘用戶沒有得到遷移。

回答

17

我忘了確切的內部結構,但Rake的工作方式是invoke只會在需要時執行每個任務(換句話說就是一次)。

嘗試調用執行,在後續調用:

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

第一次循環,你需要invoke,因爲它首先調用的先決條件。

+0

檢查源[這裏](http://rake.rubyforge.org/classes/Rake/Task.html) – lebreeze 2011-03-14 17:59:04

+0

它的工作:)感謝的:) – 2011-03-23 12:02:37

18

我發現在瑞克源回答:

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

它說,你必須

重新啓用任務,允許如果任務再次調用要執行的任務。

例如我最近在我的項目中使用了這種方式:

# 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 

所以我運行rake目錄:每循環上傳[some_file]。

希望這會有所幫助。 也看到https://stackoverflow.com/a/1290119/3082929