【问题标题】:Performing multiple queries on the same model efficiently高效地对同一模型执行多个查询
【发布时间】:2013-09-15 11:13:49
【问题描述】:

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

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

感谢您的宝贵时间

【问题讨论】:

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


    【解决方案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
    

    它会解决你的问题。

    【讨论】:

    • 谢谢,这真的很有用,并且节省了大量的处理时间:) 作为一个小的扩展(对不起),我也有几个@products_in_pricerange1 = @chosenrecords.select("price").where('price BETWEEN ? and ?', 0 , @max_pricerange1).count 形式的查询。您的修复解决了countfirstlast 类型的查询,这真的很有用,我能做些什么来以类似的方式加快使用where 的查询吗?理想情况下,我希望计算四个价格范围内的产品数量,因此我当前的方法需要在 Everything 上执行四次查询
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多