我有连接到多个数据库的 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/