3

我将以项目符号的形式列出这个场景,希望尽可能简单地描述问题。

我正在尝试完成以下任务:

  • 用户提交表单,记录被保存,然后触发一个长时间运行的分叉进程
  • 在视图中,用户被重定向(到显示操作),并且用户应该看到所述分叉进程的实时进度指示器。
  • 分叉的进程知道记录 id 并且可以实例化它,因为记录已经保存
  • 记录的模型有一个“状态”的 attr_accessor
  • 分叉过程的标准以我选择的任何增量返回完成百分比

问题:

  • 我无法将“self.status”甚至实例化的“@record.status”(在 open4 进程中定义)限定为记录的(显示)视图
  • 在用户被重定向到的“显示”页面上,尽管分叉进程对其进行了更新,但“状态”字段值并未更新(假设这是因为该值仅跨请求保存)
  • 相反,在尝试保存到会话变量时,显然“会话”不适用于模型中定义的分叉进程(对此的解决方案似乎真的很hacky)。

问题:解决这个问题的最佳方法是什么?我假设为长时间运行的进程实现进度指示器是一项非常常见的任务,我只是不确定实现它的最佳方法。我有一些使用 session[:status] 并将其范围限定为模型的想法,但我想听听一些更好的建议。我还担心许多(100 个?)这些进程正在运行的可能性,通过会话跟踪它们的进度是一个好主意吗?也许我应该将有问题的代码移出模型,并且某个“会话”在范围内?

任何想法都会很棒。仅供参考,在前端我只是计划从 ajax 请求中每 3 秒左右轮询一次“状态”对象。因此,将值保存在数据库中将是一个非常糟糕的主意。

4

1 回答 1

1

首先,你应该将长时间工作的进程百分比写入 Rails 缓存,例如,Rail.cache.write("#{record_id}_status", 0.1)直到工作完成,做Rail.cache.write("#{record_id}_status", 1),你可以控制你的进程的百分比,然后,在你的显示页面中,你知道 record_id , 在 Rails 服务器中使用 ajax 轮询 record_id 的状态Rails.cache.read("#{record_id}_status"), 所以它会知道你页面中的百分比

于 2012-12-12T04:50:53.853 回答