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