0

几天来,我一直在兜圈子,试图解决一个我过去也遇到过的问题。本质上,这是一个理解在模型上执行多个查询的最佳(或有效)方法的问题,因为我经常发现我的页面加载速度非常慢。

考虑您有一个名为 的模型的情况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 中的情况”,或者我是否可以做些什么来改进它。我已经研究过使用范围、定义不同的变量类型和缓存等概念,但我不太确定在每种情况下我在做什么,并且一直陷入类似的困境。

谢谢你的时间

4

1 回答 1

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

它将解决您的问题。

于 2013-09-15T11:16:43.363 回答