为什么循环中的Rake任务只执行一次?

为什么循环中的Rake任务只执行一次?

问题描述:

我有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 

我不知道为什么其余用户没有得到迁移。

我忘了确切的内部结构,但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

我发现在瑞克源回答:

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://*.com/a/1290119/3082929