所以,我继承了一个中等规模的遗留应用程序,该应用程序可以快速构建以满足客户的需求。幸运的是,它在大多数情况下都写得很好,但因为它很匆忙,所以很多地方都没有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
类/模块来实现这一点,但是却一直在寻找从哪里开始。
有什么想法吗?