1

我有一个名为 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 负。

全部输入后,我意识到我想使用 limit 的情况是为了显示一组较小的结果 - 所以我可能最终只是循环遍历结果来计算诸如赢和输之类的东西(而不是像我上面的子集中那样做单独的查询)。

当 total_games 有数百或数千个结果时,我尝试了这一点,并且循环比仅对子集进行单独查询要慢得多。

所以,现在我必须知道 - 限制范围查询的最佳方法是什么,然后对那些限制自身结果的结果进行未来查询,这些结果由原始 .limit(x) 返回?

4

1 回答 1

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

我知道这不完全是您所要求的,但我认为这可能是解决问题的最直接的方法。

于 2012-09-04T00:32:40.580 回答