2013-10-26 6 views
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, который ставится на голосование. Игрок мог быть в матче в поле 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") 

Может что-то подобное можно сделать?

ответ

2

Похоже, вы хотите, чтобы найти все Matchup S, где либо player_1 или player_2 является self.id, а затем просуммировать pts_player_1 и pts_player_2 для тех Matchup с. «Либо player_1 или player_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 

Вышеизложенное предполагает, что у вас не будет никаких NULL в pts_player_1 или pts_player_2.

Смежные вопросы