Почему задача 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 

Я понятия не имею, почему остальные пользователи не переносятся.

Ответы

Ответ 1

Я забыл точную внутренность, но способ, которым работает Rake, заключается в том, что invoke выполнит только каждую задачу, если это необходимо (другими словами, один раз).

Попробуйте выполнить выполнение при последующих вызовах:

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

В первый раз через цикл вам понадобится invoke, поскольку он сначала запрашивает предварительные условия.

Ответ 2

Я нашел ответ в источнике 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: загружайте [some_file] каждый цикл.

Надеюсь, это поможет. Также см. fooobar.com/info/18206/...