有效地在同一模型上执行多个查询

时间:2013-09-15 11:13:49

标签: ruby-on-rails ruby-on-rails-3 sqlite activerecord

我已经绕圈子试了几天试图解决我过去一直在努力解决的问题。基本上它是理解在模型上执行多个查询的最佳(或有效)方法的问题,因为我经常找到我的页面,加载速度很慢。

考虑一下你有一个名为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中是怎么回事”,或者我是否能做些什么来改进它。我已经研究了使用范围,定义不同变量类型和缓存等概念,但我不太清楚我在每种情况下做了什么,并且最终会陷入类似的漏洞。

感谢您的时间

1 个答案:

答案 0 :(得分:1)

你部分走错了路。 Rails 3附带Arel,它将查询推迟到需要数据时。在您的情况下,您已生成Arel查询但使用.first&执行它。然后用.count。我在这里做的是运行第一个查询,在数组中获取所有结果并在接下来的两行中处理该数组。

执行以下查询: -

@chosenrecords = Everything.where('name LIKE ?', 'What I want').order('price ASC').all

@minimumprice = @chosenrecords.first
@numberofrecords = @chosenrecords.size

它将解决您的问题。