私は長いアイテムのリストを持っています。それぞれの横にチェックボックスがあります。 jQueryのcheck-all関数がありますが、それらのすべてを一度に提出すると、クエリの束をして、各アイテムのMySQLデータベースに一連のレコードを挿入するため、リクエストがタイムアウトします。タイムアウトしない場合は、おそらく約20分かかります。代わりに、私は一度に30のように提出するだけです。Ruby on Railsがタイムアウトしました。どのようにプロセスをフォークしますか?
私はすべてをチェックして提出してから、他の仕事をしていきたいと思っています。私の同僚(1)は、私はちょうどレーキの仕事を書くべきだと言いました。私はそれをしましたが、コードの複製が終わってしまいました。私はいくつかのチェックを外したければどうしたらいいですか?レーキタスクはそれらをすべて送信します。
他の同僚(2)が推奨私はフォークを使用します。同氏は、これによりサーバー上で実行される新しいプロセスが生成されるが、サーバーは完了する前に応答できるという。その後、アイテムは送信された後に消えるので、完了したかどうかを確認するためにページを更新することができます。
私はこれを私のローカルで試しましたが、RailsはHTMLフォームによって送信されたPOSTリクエストに応答する前にプロセスが終了するのを待っているようです。私はこのようなルックスを使用したコード:
def bulk_apply
pid = fork do
params[:ids].each do |id|
Item.find(id).apply # takes a LONG time, esp. x 100
end
end
Process.detach(pid) # reap child process automatically; don't leave running
flash[:notice] = "Applying... Please wait... Then, refresh page. Only submit once. PID: #{pid}"
redirect_to :back
end
同僚1は、フォークは、基本的にRailsのプロセスのコピーである子プロセスを作成するため、一般的に、あなたがRailsのをforkしたくないと言いました。彼は、あなたがWeb GUIを通してそれをやりたいのであれば、BackgroundJob(Bj)を使っていると言いました(私たちは既にRailsアプリケーションでこれを使っています)。だから、私は今BackgroundJobを探していますが、何をお勧めしますか?
バックグラウンドジョイントに引数としてハッシュを渡すにはどうすればよいですか? – ma11hew28