在rails中存储临时数据的位置

时间:2010-01-26 12:56:28

标签: ruby-on-rails

在Ruby中,我有一个控制器动作,可立即启动计算密集型任务,需要几秒钟。我希望客户端轮询我的服务器并获取状态更新。

在我的控制器中:

def complex_task
  Thread.new do
    loop do
      one_part_of_the_computationally_intensive_task
      # Note how much progress we've made, in case the client asks.
      save_progress
    end
  end
  # returns to client straightaway, but task continues in background.
end

def check_status
  # Retrieve state in here.
  get_progress
end

注意check_status如何拉出由单独线程存储的状态。

如何撰写save_progressget_progress功能?我在哪里存储状态?似乎将它存储在session中并不是一个好主意,因为这会被发送到客户端,但是我还在哪里存储它?

(与this question相关,但更为一般。我希望答案完全不同。)

2 个答案:

答案 0 :(得分:3)

看看delayed_job。您可以轻松地对此进行扩展,以便作业可以将进度写入delayed_jobs表,以便通过check_status()方法进行后续提取(或者甚至可以将set_status()check_status()添加到delayed_job ...)

请注意,delayed_job最初是从Shopify中提取的;我猜这意味着它有一些可靠的真实曝光。除非我有一个非常令人信服的理由,否则我宁愿从这样的基础开始而不是自己开始。

答案 1 :(得分:1)

您可以将状态存储在模型中,并将status_id放入会话中。或者,您可以使用数据库会话存储而不是基于cookie的存储,这将使您在服务器端放入会话的数据以牺牲会话速度为代价。