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_1Matchup.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 其中player_1orplayer_2self.id然后pts_player_1pts_player_2那些Matchups 求和。“其中一个player_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')

您可能遇到的一个问题是 ActiveRecord 不够聪明,无法知道这pts_player_1 + pts_player_2是一个数字,但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_1or中没有任何 NULL pts_player_2

于 2013-10-26T18:14:28.327 回答