查找Rails视图中使用的非渴望加载的关系

时间:2015-06-06 17:22:43

标签: ruby-on-rails ruby activerecord

所以,我继承了一个中等规模的遗留应用程序,该应用程序可以快速构建以满足客户的需求。幸运的是,它在大多数情况下都写得很好,但因为它很匆忙,所以很多地方都没有ActiveRecord关系。随着网站的流量开始增加,这些n + 1漏洞真正开始出现。

我的问题是如何轻松找到这些问题并在日志中写一些内容或生成报告,以及在开发过程中提醒我和其他开发人员的事情?

到目前为止,我所拥有的是一个可以包裹正在呈现的任何视图或模板的对象:

class EagerLoadIssueLogger
  def track(&block)
    # Start tracking eager load issues
    result = block.call
    # Stop tracking eager load issues
    result
  end
end

然后调用布局或视图:

<body>
   <%= @eager_load_tracker.track { yield } %>
</body>

我的问题是我无法弄清楚如何确定何时调用尚未加载的关联。我知道有一种方法loaded?可以用来检查任何一个关系,如:

@team.users.loaded? # returns true or false

但我想检查在我的跟踪器块中加载的任何关系,如果没有加载,请记录它,否则,好工作,只是忽略。我知道我可以通过猴子修补到ActiveRecord::Relation或其他ActiveRecord类/模块来实现这一点,但是却一直在寻找从哪里开始。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

bullet gem可用于记录n + 1个查询。它对我来说非常好。