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)

total_games に必要なゲームが 100 ある場合、.limit(10) を追加すると、最後の 10 が取得されます。でも今は呼んでいる

total_games.where("team_score > opponent_score").count

最後の 10 を超えて、total_games の一部ではない結果に到達します。.limit(10) を追加してから、常に合計 10 のゲームが得られますが、10 勝 10 敗も得られます。

これをすべて入力した後、制限を使用したい場合は、結果の小さなセットを表示するためであることに気付きました。そのため、結果をループして、勝敗などを計算することになるでしょう (代わりに上記のサブセットのように個別のクエリを実行します)。

total_games に数百または数千の結果があったときにこれを試してみましたが、サブセットに対して個別のクエリを実行するよりも、ループスルーの方が大幅に遅くなりました。

だから、今私は知っておく必要があります - 範囲指定されたクエリを制限し、元の .limit(x) によって返される結果を制限するそれらの結果の将来のクエリを実行する最良の方法は何ですか?

4

1 に答える 1

0

クエリを 2 つのステップに分けずにやりたいことを実行できるとは思いません。最初に から 10 ゲームを取得total_gamesし、DB クエリを次のように作成します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 に答える