为什么循环中的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
我不知道为什么其他用户不会迁移。
我忘记了确切的内部结构,但是Rake工作的方式是,如果需要invoke
(换句话说,一次), invoke
将只执行每个任务。
尝试在后续调用中调用execute:
Rake::Task["db:migrate"].execute
第一次通过循环时,您需要先invoke
先调用先决条件。
我在耙源中找到了答案:
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]。
希望这可以帮助。 另请参阅https://stackoverflow.com/a/1290119/3082929