Ruby on rails 保存特定操作的请求
我想在名为Impression的模型中保存有关对某个操作的请求的信息 我认为将此信息保存在后过滤器中有利于访问者的响应时间,例如:Ruby on rails 保存特定操作的请求,ruby-on-rails,ruby,visitor-statistic,impressions,Ruby On Rails,Ruby,Visitor Statistic,Impressions,我想在名为Impression的模型中保存有关对某个操作的请求的信息 我认为将此信息保存在后过滤器中有利于访问者的响应时间,例如: after_filter :save_impression private def save_impression Impression.create!(ip_address: request.remote_ip, controller_name: params[:controller], action_name: params[:act
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
这段代码可以优化吗?或者我做得对吗?这段代码在渲染之前仍将运行。要在渲染/重定向之后运行,需要生成一个单独的线程
一个好的解决方案通常包括使用工人。任何对请求来说不是关键任务的、涉及复杂计算的操作都可以延迟,稍后由后台作业运行 worker的两个常见实现是和 例如,使用resque,您将在
app/jobs/impression\u creation\u 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中加载数据),然后由后台进程处理(有关如何设置和启动Worker的信息,请参阅resque文档)
请注意,这在您的情况下仅在两种情况下有用: