我想在名为Impression的模型中保存有关特定操作的请求的信息。
我认为访问者在after_filter中保存此信息的响应时间是有益的,例如:
after_filter :save_impression
private
def save_impression
Impression.create!(ip_address: request.remote_ip, controller_name: params[:controller], action_name: params[:action], referer: request.referer)
end
这段代码可以优化还是我做得对?
答案 0 :(得分:3)
一个好的解决方案通常是使用工人。任何对请求不重要且涉及复杂计算的任何事情都可以推迟并由后台工作运行。
两种常见的工作实现是delayed_job和resque。
例如,使用resque,您将拥有app/jobs/impression_creation_job.rb
中的工作类,其中包含类似的内容:
class ImpressionJob
@queue = :impression
def self.perform( attrs )
Impression.create!( attrs )
end
end
你可以在你的控制器中调用它:
after_filter :save_impression
private
def save_impression
Resque.enqueue( ImpressionJob, ip_address: request.remote_ip, controller_name: params[:controller], action_name: params[:action], referer: request.referer)
end
这将确保快速处理请求部分(它只是以redis加载数据),然后由后台进程处理(请参阅resque文档,了解如何设置和启动工作程序)。
请注意,仅在两种情况下,这对您的情况有用:
Impression#before_create
或其他回调中进行了大量计算如果不匹配其中一个条件,那么在印刷控制器过滤器中创建印象可能更有效:访问数据库会产生成本,但用户在数据库中进行单次插入时感觉不会太多。
答案 1 :(得分:2)
这仍然会在渲染之前运行。要在渲染/重定向之后运行,您需要生成一个单独的线程。