首页 > 解决方案 > 活动记录的 sum 方法替代方案

问题描述

我在一个遗留的 Ruby on Rails 项目中。导轨 v2.3.9。

我有一个模型类product,在数据库中有products表。

class Product < ActiveRecord::Base

  ...
end

price一个整数类型的属性。

我在某个时候得到了所有产品(ActiveRecords)。我需要计算我得到的所有产品的总价格。我知道我可以做到:

total_price = all_products.sum(&:price)

有用。

但它也会触发数据库查询SELECT sum(...)。是否有另一种方法可以在不触发任何数据库查询的情况下计算所有产品的价格总和?我知道我可以使用 for 循环,但我想知道还有其他方法吗?

标签: ruby-on-railsruby-on-rails-3

解决方案


sumwith 块被委派给 Enumerable 并且如果之前没有加载它总是会命中数据库all_products,所以你必须确保它没有被延迟加载。

在性能方面,SUM 查询将是获得结果的最快方式,因为它不需要加载所有记录并且在数据库中而不是在内存中进行操作。

在您的情况下,如果您已加载集合并仍在创建查询,则可以使用

total_price = all_products.map(&:price).sum

这将默认为 kindof rockusbacchus 解决方案

.inject { |sum, element| sum + element }

推荐阅读