有效地在同一模型上执行多个查询
我已经绕圈子试了几天试图解决我过去一直在努力解决的问题。 基本上它是理解在模型上执行多个查询的最佳(或有效)方法的问题,因为我经常查找我的页面加载非常慢。
考虑一下你有一个名为Everything
的模型的情况。 最初,您执行查询,在Everything
查找符合特定条件的记录
@chosenrecords = Everything.where('name LIKE ?', 'What I want').order('price ASC')
我想记住@chosenrecords
的内容,因为我会将它们作为列表呈现给用户,但是,我还想了解更多@chosenrecords
的属性,例如
@minimumprice = @chosenrecords.first @numberofrecords = @chosenrecords.count
当我在我的控制器中使用上面的代码并检查本地服务器上的命令历史记录时,我很惊讶地发现三个查询中的每一个都涉及原始Everything
模型上的SQL查询,而不是记住@chosenrecords
返回的记录。对此执行查询。 这对我来说效率非常低,实际上三个查询中的每一个都需要相同的时间来处理,从而使页面执行缓慢。
我在使用MATLAB等软件编写代码时更有经验,一旦你计算了变量的值,就可以在本地存储并快速查询,而不是在每次想要了解更多信息时重新计算该变量。 请问你能指导一下我是否完全走错了轨道,而且我发现的问题只是“它是如何在Rails中”,或者我是否可以做些什么来改进它。 我已经研究过像使用作用域,定义不同的变量类型和缓存这样的概念,但我不太清楚我在每种情况下做了什么,并且最终会陷入类似的漏洞。
谢谢你的时间
你部分走错了路。 Rails 3附带Arel,它将查询推迟到需要数据时。 在您的情况下,您已生成Arel查询,但使用.first然后使用.count执行它。 我在这里做的是运行第一个查询,获取数组中的所有结果,然后在接下来的两行中处理该数组。
像这样执行查询: –
@chosenrecords = Everything.where('name LIKE ?', 'What I want').order('price ASC').all @minimumprice = @chosenrecords.first @numberofrecords = @chosenrecords.size
它将解决您的问题。