ruby-on-rails - 活动记录的 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 循环,但我想知道还有其他方法吗?
解决方案
sum
with 块被委派给 Enumerable 并且如果之前没有加载它总是会命中数据库all_products
,所以你必须确保它没有被延迟加载。
在性能方面,SUM 查询将是获得结果的最快方式,因为它不需要加载所有记录并且在数据库中而不是在内存中进行操作。
在您的情况下,如果您已加载集合并仍在创建查询,则可以使用
total_price = all_products.map(&:price).sum
这将默认为 kindof rockusbacchus 解决方案
.inject { |sum, element| sum + element }
推荐阅读
- javascript - 在 Angular-8 中读取来自 rest-api 的 CSV
- powerbi - 在 Power BI 中将 HTML 表转换为纯文本
- groovy - groovy,我想知道代码的含义
- c# - Serilog MSSqlServer 没有记录错误
- r - 使用“点击”功能以编程方式启动 R 闪亮的动作按钮
- python - Python 中的 Microsoft 翻译器用于翻译整个 JSON 文件
- python - 在 conda install 后导入模块时 jupyter notebook 中的 ModuleNotFoundError
- python - 尝试对文件使用多处理但当我让用户输入路径时冻结
- arrays - JSON Path如何获取具体数据?
- angular - 我们如何使用以下代理配置在 IIS 上部署 Angular 项目?