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

时间:2011-01-27 21:22:19

标签: ruby 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 

我不知道为什么其他用户不会迁移。

2 个答案:

答案 0 :(得分:21)

我在耙源中找到答案:

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

它说你必须

重新启用任务,允许在再次调用任务时执行其任务。

e.g。我最近在这个项目中使用了这个:

# 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

答案 1 :(得分:18)

我忘记了确切的内部结构,但是Rake工作的方式是invoke只会在需要时执行每个任务(换句话说一次)。

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

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

第一次循环你需要invoke,因为它首先调用先决条件。