ruby-on-rails 如何在Rails中检索所有项目时优化总值计算

ndasle7k  于 2023-05-08  发布在  Ruby
关注(0)|答案(1)|浏览(185)

我正在开发一个Rails应用程序,需要显示所有项以及这些项的总值。目前,在我的ItemsController#index中,我检索了所有具有@items = current_user.items的项目,并希望计算总值。
我考虑了两种方法:
1.使用类似@total_value = @items.sum(:value)的查询
1.在Ruby中使用@total_value = @items.sum(&:value)计算总和
我想了解这些方法在性能和效率方面的优缺点。
是使用额外的查询来求和值更好,还是在Ruby中计算总和更好?
是否有任何最佳实践或替代解决方案来优化此流程?
我会很感激任何答案。谢谢!

bq3bfh9z

bq3bfh9z1#

欢迎来到SO!
我认为,考虑到你问的问题,你应该后退一步。
@items = current_user.items在查询数据库后将所有item记录加载到内存中。
一旦它们都在内存中,您正在考虑两个非常相似的选项:重新查询或循环。
这两个选项在大O符号方面本质上是相同的。您已经获取了所有记录,现在您希望对所有记录执行操作。
如果你只需要从@items得到value的和,你最好的方法是只得到它:
current_user.items.sum(:value)是一个SQL调用:

> current_user.items.sum(:value).to_sql
=> SELECT SUM("items."value") FROM "items" where "items"."user_id" = 1

就这两种选择而言,起作用的因素是:

  • 您的数据库以及它在SUM与Ruby在#sum上有多快。
  • 在部署中,还需要考虑服务器和数据库之间的往返调用的额外开销,以及这是否超过了SUM带来的速度提升
  • 正在加载到内存中的记录数,因为这将对#sum(以及以后的垃圾收集)产生影响

相关问题