我正在尝试对activerecord查询中的列中的最后n行进行平均,如下所示:
Points.where(player_id: <player_id>).limit(5).average(:points)
但它给了我相同的答案,好像我把限制一样:
Points.where(player_id: <player_id>).average(:points)
如果我在没有.average(:points)的情况下进行测试,那么我只得到五行,但似乎平均值忽略了这一行。
非常感谢任何帮助!
答案 0 :(得分:0)
首先,您需要确保获得最后5个。
Points.where(player_id: <player_id>).order("created_at desc").limit(5)
然后将点弹出一个数组......
points = Points.where(player_id: <player_id>).order("created_at desc").limit(5).pluck(:points)
然后平均(如How do I create an average from a Ruby array?)
points = Points.where(player_id: <player_id>).order("created_at desc").limit(5).pluck(:points)
ave = points.reduce(:+).to_f / points.size
编辑:寻找没有积分的玩家,因为points.size等于零,结果将是NaN。
另一个编辑:在其他链接中进一步阅读,您可以简化:
points = Points.where(player_id: <player_id>).
order("created_at desc").
limit(5).
pluck(:points).
instance_eval { reduce(:+) / size.to_f }