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

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

问题是任务只为 users[0] 用户(集合中的第一个用户)执行 db:migrate 并且没有错误,只是静静地停止...

这是 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 源代码中找到了答案:

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 catalog:upload[some_file]。

希望这对您有所帮助。 另见 https://stackoverflow.com/a/1290119/3082929

关于ruby - 为什么循环中的 Rake 任务只执行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4822020/

相关文章:

rake - JRuby + minitest 由于 ObjectSpace 失败

ruby-on-rails - 只进行一次迁移

ruby-on-rails - 在 InheritedResources 上成功创建或更新操作后运行操作

ruby - 为 mac ruby​​ 开发设置 .emacs 文件

ruby-on-rails - rake - rake 构建不适用于 tripit/slate 文档

ruby-on-rails - Rails -- 可以在通用 rake 任务中运行迁移方法吗?

ruby-on-rails - 在不编辑源代码的情况下调用方法并从 Rails 控制台启动调试?

ruby-on-rails - 本地 yaml key 的 i18n 同步

Ruby 以编程方式生成 lambda

ruby - 在 Ruby 中正确转义 shell 参数