每次用户访问我的Rails应用程序中的页面时,数据库都需要向他们发送Thingy。当数据库耗尽Thingies时,它必须进行一些昂贵的处理才能生成更多。我想动态添加一个控制器过滤器,以便在将响应发送给用户之后生成,这样它就不会影响页面加载时间。这是我的控制器的样子:
class ThingyController < ApplicationController
def get_a_thingy
if Thingy.count <= 5
# Only five thingies left! we need to generate some more.
# I want to dynamically send a block to an after_filter: here to
# generate thingies after the controller sends the response
# because generating thingies is really slow
end
# Pop the first thingy from the database and return
thingy = Thingy.first
thingy.delete
return thingy.content
end
我可以在get_a_thingy
函数中添加什么来实现这一目标?
答案 0 :(得分:1)
您可以尝试一些后台处理工具(https://www.ruby-toolbox.com/categories/Background_Jobs检查一下),因为我不确定您是否可以在请求处理程序中执行此操作。
您也可以尝试将所有内容返回给用户(通过像http流媒体这样的内容),然后才能做出沉重的事情。
答案 1 :(得分:0)
只需添加if
语句,检查after_filter
代码中的内容数量:
class ThingyController < ApplicationController
after_filter :generate_new_thingies
def get_a_thingy
thingy = Thingy.first
thingy.delete
return thingy.content
end
def generate_new_thingies
if Thingy.count <= 5
# Generate thingies
end
end
end
使用after_filter
是否真的可以防止长页面加载?最好看看Delayed Job或Whenever等内容。
答案 2 :(得分:0)
对于像delayed_job这样的宝石来说,最好的想法可能还有一个railscast。
延迟作业是异步优先级队列系统。
安装并设置delayed_job。 github page上有很好的文档记录。
使用rake jobs:work
现在只需添加.delay
方法
class ThingyController < ApplicationController
after_filter :generate_thingies
.
.
.
def generate_thingies
if Thingy.count <= 5
#change
Thingy.generate_thingies
#to
Thingy.delay.generate_thingies
end
end
end
注意:这是一个小教程,我遗漏了一些你需要它才能使它工作的东西。我建议您查看Github页面以获取完整的文档。