-1

我有一个 RoR 应用程序,例如发布问题的答案。如果用户回答了问题,则通知消息将发送给所有用户,这些用户将问题列入观察名单、跟踪问题的人以及问题的所有者。我正在使用延迟作业来创建通知消息。因此,在创建答案时,有许多插入到延迟的作业表中,这会减慢页面加载速度。创建答案后,重定向到问题显示页面需要更多时间。

目前我正在使用 AJAX 请求插入答案表。AJAX 请求完成后,有没有办法在后台插入延迟作业表?

4

3 回答 3

3

正如我们一直试图在评论中说的:

听起来你有类似的东西:

User.all.each do |user|
  user.delay.some_long_operation
end

这最终会在延迟作业中插入大量行。我们建议将代码重构为延迟的作业本身,大致如下:

def delayed_operation
  User.all.each do |user|
    user.some_long_operation
  end
end

self.delay.delayed_operation

显然,您必须适应它,并且可能将其delayed_operation放入模型库的某个地方,可能作为类方法......但关键是将delay调用放在大查询和循环之外。

于 2012-08-17T15:08:52.703 回答
0

我真的建议在一个单独的过程中这样做。为什么用户要等待这些元操作?坚持提供结果页面,只通知你的服务器必须做的事情。

创建一个单独的模型 PostponedAction 以构建“待办事项”操作列表。如果您发布答案,请向此数据库添加一个 PostponedAction,并带有答案 ID 的参数。然后将结果返回给用户。

使用单独的进程(cron 作业)来读取 PostponedAction 项并处理这些项。将它们标记为“已处理”或在成功处理时删除。这样,用户就不会被缓慢的服务器进程所困扰。

于 2012-08-17T12:32:00.857 回答
0

除了您目前拥有的电子邮件工作之外,还可以发明另一种类型的工作来处理这些工作的创建。

def email_all
  User.all.each do |user|
    user.delay.email_one()
  end
end

def email_one
  # do the emailing
end

self.delay.email_all()

这样,用户操作只会在他们看到响应之前触发一次插入。您还可以跟踪单个作业。

于 2012-09-19T06:42:32.153 回答