Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.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 保存特定操作的请求_Ruby On Rails_Ruby_Visitor Statistic_Impressions - Fatal编程技术网

Ruby on rails 保存特定操作的请求

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

我想在名为Impression的模型中保存有关对某个操作的请求的信息

我认为将此信息保存在后过滤器中有利于访问者的响应时间,例如:

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文档)

请注意,这在您的情况下仅在两种情况下有用:

  • 您的应用程序总是处于重载状态,或者需要特别好的响应时间
  • 在创建或其他回调之前,您需要在Impression中进行大量计算
  • 若不符合这些条件之一,那个么在控制器中过滤您的印象可能会更有效:访问数据库是有成本的,但并不是用户在数据库中进行一次插入时会感觉到的那个么多