3

このシナリオを箇条書きにしてリストし、問題の説明をできるだけ簡単にします。

私は次のことを達成しようとしています:

  • ユーザーがフォームを送信すると、レコードが保存され、長時間実行される分岐プロセスがトリガーされます
  • ビューでは、ユーザーは (show アクションに) リダイレクトされ、フォークされたプロセスのリアルタイムの進行状況インジケーターが表示されます。
  • フォークされたプロセスはレコード ID を認識しており、レコードが既に保存されているためインスタンス化できます。
  • レコードのモデルには「ステータス」の attr_accessor があります
  • フォークされたプロセスの標準は、選択した増分で完了率を返します

問題:

  • 「self.status」またはインスタンス化された「@record.status」(open4 プロセスで定義) をレコードの (表示) ビューに限定して取得できません。
  • ユーザーがリダイレクトされる「表示」ページで、フォークされたプロセスがそれを更新しているにもかかわらず、「ステータス」フィールドの値は更新されません (これは、値が要求間でのみ保存されるためであると仮定します)
  • 代わりにセッション変数に保存しようとすると、明らかに「セッション」はモデルで定義されているフォークされたプロセスでは利用できません (これに対する解決策は本当にハックに思えます)。

質問: この問題に対処する最善の方法は何ですか? 長時間実行されるプロセスの進行状況インジケーターを実装することはかなり一般的なタスクであると想定していますが、それを実装する最良の方法がわかりません。session[:status] を使用してモデルにスコープするアイデアがいくつかありますが、より良い提案を聞きたいです。また、これらのプロセスの多く (100 の?) が実行されている可能性についても懸念していますが、セッションを介して進行状況を追跡することは良い考えですか? たぶん、問題のコードをモデルの外に移動し、「セッション」がスコープ内にある場所に移動する必要がありますか?

どんなアイデアでも素晴らしいでしょう。参考までに、フロントエンドでは、ajax リクエストから 3 秒ごとに「ステータス」オブジェクトをポーリングする予定です。結果として、DB に値を永続化することは非常に悪い考えです。

4

1 に答える 1

1

まず、長い時間のジョブのプロセスの割合を Rails キャッシュに書き込む必要があります。たとえば、Rail.cache.write("#{record_id}_status", 0.1)ジョブが完了するまで、 do Rail.cache.write("#{record_id}_status", 1)、プロセスの割合を制御できます。次に、ショーページで、record_id を知っています。 、Railsサーバーでrecord_idのステータスをajaxポーリングを使用Rails.cache.read("#{record_id}_status")して、ページの割合を認識します

于 2012-12-12T04:50:53.853 に答える