保存特定操作的请求

时间:2013-09-09 11:07:24

标签: ruby-on-rails ruby visitor-statistic impressions

我想在名为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

这段代码可以优化还是我做得对?

2 个答案:

答案 0 :(得分:3)

一个好的解决方案通常是使用工人。任何对请求不重要且涉及复杂计算的任何事情都可以推迟并由后台工作运行。

两种常见的工作实现是delayed_jobresque

例如,使用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文档,了解如何设置和启动工作程序)。

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

  1. 您的应用总是处于高负荷状态或需要特别好的响应时间
  2. 您在Impression#before_create或其他回调中进行了大量计算
  3. 如果不匹配其中一个条件,那么在印刷控制器过滤器中创建印象可能更有效:访问数据库会产生成本,但用户在数据库中进行单次插入时感觉不会太多。

答案 1 :(得分:2)

这仍然会在渲染之前运行。要在渲染/重定向之后运行,您需要生成一个单独的线程。

See this question