我们正在为这个项目使用 postgres。
目标是获得一个散列,将每个玩家与他们的点值总和配对。
我有一个 Point
对象数组,看起来像这样:
(注意:这里的每个散列实际上是来自Points.where
的数据库对象。数组实际上是一个ActiveRecord:Relation
实例)
[
{ value: 3, player_id: 55 },
{ value: 1, player_id: 21 },
{ value: 2, player_id: 55 },
{ value: 6, player_id: 23 },
{ value: 2, player_id: 78 },
{ value: 2, player_id: 55 },
{ value: 5, player_id: 80 },
{ value: 7, player_id: 21 },
{ value: 2, player_id: 23 },
{ value: 1, player_id: 78 },
{ value: 4, player_id: 80 }
]
预期的输出是这样的:
{
55: 7,
21: 8,
23: 8,
78: 3,
80: 9
}
其中key是player_id,value是他们所有积分值的总和。
我想出的一个 ruby 解决方案使用 activerecord 对集合中每个 ID 的点求和。
points = get_the_points()
point_map = {}
ids = points.pluck(:player_id)
player_ids.each do |id|
points_for_id = points.where(player_id: id).pluck(:value)
sum_of_points = points_for_id.sum
point_map[id] = sum_of_points
end
return point_map
但我知道这可以用 SQL 来完成,而且我知道它会更快。
因为我只处理一个模型,所以我不必使用连接或其他任何东西,对吗?
最佳答案
在一个 SQL 查询中尝试
Point.group(:player_id).sum(:value)
关于sql - 在 Rails 中,给定一个 Point 对象数组,我如何对每个玩家的点值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44054304/