Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在后台运行延迟的作业插入而不影响页面加载-Rails_Ruby On Rails_Ruby_Delayed Job - Fatal编程技术网

Ruby on rails 如何在后台运行延迟的作业插入而不影响页面加载-Rails

Ruby on rails 如何在后台运行延迟的作业插入而不影响页面加载-Rails,ruby-on-rails,ruby,delayed-job,Ruby On Rails,Ruby,Delayed Job,我有一个RoR申请,比如发布问题的答案。如果用户回答了某个问题,则会向所有用户发送通知消息,这些用户查看列出的问题、跟踪问题以及问题的所有者。我正在使用延迟作业创建通知消息。所以,在创建应答时,有许多插入延迟作业表的操作正在进行,这降低了页面负载。创建答案后,重定向到问题显示页面需要更多时间 目前,我正在使用AJAX请求将其插入到应答表中。在AJAX请求完成后,有没有办法在后台插入延迟作业表 我真的建议在单独的过程中这样做。为什么用户要等待这些元操作?坚持交付结果页面,只通知服务器必须完成的事情

我有一个RoR申请,比如发布问题的答案。如果用户回答了某个问题,则会向所有用户发送通知消息,这些用户查看列出的问题、跟踪问题以及问题的所有者。我正在使用延迟作业创建通知消息。所以,在创建应答时,有许多插入延迟作业表的操作正在进行,这降低了页面负载。创建答案后,重定向到问题显示页面需要更多时间


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

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

创建一个单独的模型延迟操作,以生成“待办”操作列表。如果发布答案,请向该数据库添加一个带有答案id参数的延迟操作。然后将结果返回给用户


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

正如我们在评论中所说:

听起来你有点像:

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\u操作
放入某个模型库中,可能作为类方法。。。但关键是要将
delay
调用置于大查询和循环之外。

除了您当前拥有的电子邮件作业之外,再发明一种处理这些作业创建的作业类型

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()

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

那么,为什么您要从观察列表中为每个人创建工作,而不是创建一个为观察列表中的所有人执行所有通知的工作呢。这样会更有意义!我正在开发已经存在的应用程序,在这个过程中我也在学习rails。目前我需要一个快速修复我的问题,所以我正在寻找一个插件或宝石,这将有助于我。延迟_工作是这方面的宝石。这个问题听起来像是你需要将呼叫移动到“延迟”位置,以便只输入一个延迟的作业,而查找所有信息和创建消息的作业将在延迟的作业中进行。谢谢。。。在MyRails应用程序中,delayed jobs gem查找delayed_jobs表以执行所有消息发送插入。这是一个后台过程。我的问题是延迟就业创业板本身。也就是说,创建一个应答包括许多插入到延迟的jobs表本身的内容,延迟的jobs gem稍后使用该表来传递通知。我想知道我是否可以在后台执行对延迟的_作业表的插入,而不会让用户等待很长时间,等待插入延迟的_作业表,然后再重新加载页面。我希望我说得很清楚,你没有抓住重点。重写调用delayed_job的代码,使其只在delayed_jobs表中插入一行。然后让延迟的作业整理出多个动作。这就是延迟作业的全部内容,这不是延迟作业的目的吗?您建议如何将这些值插入延迟数据模型?有没有一个后台程序?