我可以在限制范围查询后添加where子句吗?

时间:2012-09-03 23:08:11

标签: ruby-on-rails activerecord

我有一个名为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)返回结果的结果进行后续查询?

1 个答案:

答案 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

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