使用Bullet和RSpec gems减lessn + 1个查询
使用RSpec的Bullet Gem有效的方法是什么? 现在,我觉得如果我使用它与我目前的unit testing框架,我得到了很多的通知或testing失败,因为在testing本身n + 1查询是不相关的发生在我的生产应用程序,如检查价值或联想。 因此,修复n + 1故障并不需要在我的控制器或模型上设置任何东西,而是需要在我的testing设置中设置一些东西来避免发生特定的错误,而且我的应用程序没有真正的性能改进。
最有效的方法根本不是。 减lesstesting中的n + 1查询可能有一些合理的优势,最明显的是加快整个执行时间。 然而,很可能你要么testing得太多,要么获得的收益不如可能 。 我通常也发现编写额外的代码来帮助支撑testing,而不是为应用程序的总体价值做贡献是没有吸引力的。
请允许我提议另外使用你的时间。 只有单位testing的绝对最低限度的舒适水平。 我个人喜欢专注于涉及validation相关问题和金钱或其他math的复杂方法,您可能会有不同的优先级。 绘制线将释放一大堆时间来编写testing套件中最无用和最脆弱的部分,这将占用大部分维护预算。
现在,要做什么,你所有的额外时间? 不要担心,我们会find一些东西给你做…你可以从写一些验收testing开始,特别是对于那些使用你刚才丢弃了一大堆unit testing的对象的区域。 现在,您的n + 1个警告实际上来自用户点击该页面时的相同位置。 现在,您可以继续删除所有的n + 1个查询。
可是等等! 不要那样做。 相反,花更less的时间设置你的关系来使用触摸选项 。 然后,当一个子对象被更新时,父对象也会被更新。 这和n + 1个查询有什么关系,你可能想知道。 好像我们只是添加查询…
这就是俄罗斯娃娃caching的地方。添加这个,并正确地testing它,将消耗释放的unit testing和n + 1淘汰时间(如果你不小心,那么一些消除时间)。 好的是,它更像是“现实世界”,对你的模型中的微不足道的或不相关的实现变化更有弹性,而且对你的应用程序有巨大的性能提升,远远超过了通过急切地加载所有东西来消除每个n + 1查询前面可能已经提供了。 您将尽可能地移动到嵌套caching中,并尽可能延迟地载入所有内容,以充分利用此方法。
万岁n + 1!