0

データベースへの呼び出し回数を最小限に抑えるために、このスニペットをリファクタリングするにはどうすればよいですか?

/Player.rb

def num_matchups
    this_week_appearances = 0
    this_week_appearances += Matchup.where(player_1: self.id).sum("pts_player_1")
    this_week_appearances += Matchup.where(player_1: self.id).sum("pts_player_2")
    this_week_appearances += Matchup.where(player_2: self.id).sum("pts_player_1")
    this_week_appearances += Matchup.where(player_2: self.id).sum("pts_player_2")
end

目標は、プレーヤー (これが呼び出されたプレーヤー) が投票されたマッチアップに参加した回数を見つけることです。プレイヤーは、Matchup.player_1またはMatchup.player_2フィールドで対戦に参加することができました (違いはありません)。私は彼らが勝ったか負けたか (出場回数だけ) を気にしないため、対戦で両方のプレイヤーからのポイントが必要です。

次のようになると思いますが、使用する構文がわかりません。

this_week_appearances = Matchup.where(player_1: self.id OR player_2: self.id).sum("pts_player_1").sum("pts_player_2")

このようなことはできますか?

4

1 に答える 1

2

またはであるすべてのMatchupsを見つけてから、それらの sを合計したいようです。「いずれかまたは一部を一度に実行するのは簡単です。player_1player_2self.idpts_player_1pts_player_2Matchupplayer_1player_2

Matchup.where('player_1 = :id or player_2 = :id', :id => self.id)

しかし、どのようにポイントを合計しますか?さて、SQL 式を に渡すことがsumできるので、次のことができます。

Matchup.where('player_1 = :id or player_2 = :id', :id => self.id)
       .sum('pts_player_1 + pts_player_2')

pts_player_1 + pts_player_2これで発生する可能性のある問題の 1 つは、ActiveRecord がそれが数字であることを認識できるほど賢くなく、to_i呼び出しでそれを整理する必要があることです。

Matchup.where('player_1 = :id or player_2 = :id', :id => self.id)
       .sum('pts_player_1 + pts_player_2')
       .to_i

pts_player_1上記は、またはに NULL がないことを前提としていますpts_player_2

于 2013-10-26T18:14:28.327 に答える