ruby - rails - なぜループ内のRakeタスクは1回だけ実行されますか?




ruby rake all (2)

私は複数のデータベースに接続するレールアプリケーションを持っています。 私はこのようなカスタムレイクタスクを書いた:

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ソースで答えを見つけました:

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

だから私はレーキカタログを実行する:すべてのループ[some_file]をアップロードします。

お役に立てれば。 https://.com/a/1290119/3082929も参照してhttps://.com/a/1290119/3082929


私は正確な内部構造を忘れていましたが、Rakeが動作する方法は、 invokeことが必要な場合(つまり、一度)、各タスクを実行するというinvokeだけです。

後続の呼び出しでexecuteを呼び出してみてください:

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

初めてループを通過するときには、前提条件を最初にinvokeときに呼び出す必要があります。







rake