如何在Rails中动态高效地从数据库(通知)中提取信息

时间:2014-04-22 08:05:23

标签: ruby-on-rails ruby dynamic notifications

我正在使用Rails应用程序,下面是需要解决方案的场景。

我在后台使用Sidekiq做一些耗时的过程并将相关信息保存在数据库中。现在,当每个流程完成后,我们希望在单独的区域中显示notifications,说process has been completed

因此,通知区域确实需要从后端提取内容(此通知区域将在每个页面中提供)并动态显示。所以,我认为Ajax必须是一个选择。但是,我不知道如何仅针对特定区域触发它。或者,客户端是否可以有效地从服务器获取动态内容而不会产生大量流量。

我知道这将是一个广泛的话题。但任何相关信息将不胜感激。谢谢:))

2 个答案:

答案 0 :(得分:1)

你正在寻找一个永久的连接(使用SSE或Websockets),Rails已开始用ActionController::Live

查看

<强>活

您正在寻找“实时”连接:

  

“实时”功能通过保持连接打开来工作   你的应用程序和服务器之间。 Rails是基于HTTP请求的   框架,意味着它只发送对请求的响应。通往的方式   发送实时数据是为了保持响应打开(使用永久连接),这允许您将更新的数据发送到您的页面上   自己的时间表

执行此操作的方法是使用前端方法保持连接“实时”,并使用后端堆栈来提供更新。前端需要SSE'swebsocket,您将使用JS连接

SEE和websockets基本上允许您在“正常”请求范围之外访问服务器(它们使用text/event-stream内容/ mime类型)


<强>建议

我们使用名为pusher

的服务

这基本上创建了第三方websocket服务,您可以将更新推送到该服务。一旦服务收到更新,它就会将其发送到与其连接的任何通道。您可以使用pub/sub pattern

拆分广播的频道

我建议直接使用此服务(他们有Rails gem)(我不隶属于他们),以及提供超级简单的API

除此之外,您应该查看Rails的ActionController::Live功能

答案 1 :(得分:0)

@ h0lyalg0rithm在评论中提出的答案是可以选择的。

然而,原始选项是。

  1. 在javascript中使用setinterval每隔x秒执行一次任务。说投票。

  2. 使用jQuery或native ajax通过路由轮询控制器/操作的信息,并让控制器将数据推送为JSON。

  3. 使用document.getElementById或jQuery更新页面上的数据。