我有一个名为Game的模型,我在其中构建了一个范围查询。
类似的东西:
games = Game.scoped
games = games.team(team_name) if team_name
games = game.opponent(opponent_name) if opponent_name
total_games = games
然后我计算了几个子集,如:
wins = games.where("team_score > opponent_score").count
losses = games.where("opponent_score > team_score").count
一切都很棒。然后我决定我想限制原始范围以显示最后X个游戏数。
total_games = games.limit(10)
如果有100个游戏符合我想要的total_games,然后我添加.limit(10) - 它获得最后10个。很棒。但现在打电话给
total_games.where("team_score > opponent_score").count
将超过最后10个,并进入不属于total_games的结果。自从添加.limit(10)以来,我总会得到10场比赛,但也有10场胜利和10场失利。
在输入全部内容之后,我意识到我想要使用限制的情况是显示较小的结果集 - 所以我可能最终只是循环结果来计算诸如胜负之类的东西(而不是像我上面的子集中那样进行单独的查询)。
当total_games有数百或数千个结果时,我尝试了这一点,并且循环显着慢于仅对子集进行单独查询。
所以,现在我必须知道 - 限制范围查询的最佳方法是什么,然后对那些限制自己原始.limit(x)返回结果的结果进行后续查询?
答案 0 :(得分:0)
我认为如果不将查询分为两个步骤,首先从total_games
获取10个游戏并使用all
进行数据库查询,我认为你无法做你想做的事情:
last_10_games = total_games.limit(10).all
然后从结果数组中选择并获得结果的大小:
wins = last_10_games.select { |g| g.team_score > g.opponent_score }.count
losses = last_10_games.select { |g| g.opponent_score > g.team_score }.count
我知道这不是你要求的,但我认为这可能是解决这个问题最直接的方法。