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

我有连接到多个数据库的rails应用程序。 我编写了自定义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]用户(集合中的第一个用户)进行迁移并且没有错误,只是静默地停止…

这是rake –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 (换句话说,一次), invoke将只执行每个任务。

尝试在后续调用中调用execute:

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

第一次通过循环时,您需要先invoke先调用先决条件。

我在耙源中找到了答案:

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