【发布时间】:2016-02-05 19:58:43
【问题描述】:
考虑这个模型:
User:
id: int
Valuable:
id: int
user_id: int
value: int
用户有很多有价值的东西。
现在是这样。我想使用 ActiveRecord 选择多个用户进行任何查询,之后我希望能够看到他们所有有价值的总和,无需进行 N+1 查询。
所以,我希望能够做到这一点:
# @var ids [Array] A bunch of User IDs.
User.where(id: ids).each do |u|
puts "User ##{u.id} has total value of #{u.total_value}
end
它应该做 1 个(或最多 2 个)查询,而不是实例化所有的 Valuables。我试着玩select('*, SUM(valuables.value) as total_value).joins(valuables),但没有运气。我正在使用 PostgreSQL
如果可能的话,我希望这能自动发生(例如使用default_scope)并且我仍然希望能够使用includes。
更新:抱歉,我还不清楚这一点。 (其实是我写的)。我不希望所有贵重物品都被实例化。我想让 PostgreSQL 为我做计算。
更新: 我的意思是,我想依靠 PostgreSQL 的 SUM 方法来获得结果集中的总和。我认为我使用SELECT 和GROUP BY 所做的努力已经说明了这一点。我不希望 Valuables 表中的任何数据或记录对象成为结果的一部分,因为它消耗太多内存并且使用 Ruby 计算字段只会占用太多 CPU 并且花费太长时间。
【问题讨论】:
-
任意 100 个随机用户?
-
任何查询。 :) 我只是以 100 个用户为例。我希望 SUM 包含在查询中。更新了问题,谢谢。
-
酷,
total_value是什么? -
total_value将是与该用户相关的所有贵重物品的“价值”字段的总和。请参阅我尝试使用的“选择”语句,我在那里定义了它。 :) -
您正在寻找的实际输出是什么。
.includes是fie,内部也是postgresql查询。
标签: ruby-on-rails postgresql rails-activerecord aggregate-functions