2016-10-05 2 views
1

Player 모델이 있고, 플레이어 모델에는 PlayerStats가 많습니다. 나는 플레이어의 총 목표를 얻기 위해 원하는 경우레일 : 주문 하위 모델의 통계 합계로 모델링 하시겠습니까?

, 내가 사용하십시오 :

@player.player_stats.sum(:goals) 
내가 컨트롤러에서 가장 목표를 가진 선수 목록을 검색 플레이어 모델을 사용할 수있는 방법

?

내가 좋아하는 뭔가 생각 :

@players = Player.order(:goals).limit(7) 

을하지만 난 플레이어가 직접 목표를 가지고 있지 않기 때문에, 그것은 자신의 목표를 포함하는 많은 PlayerStats을 가지고 할 수 없습니다.

참고 : 저는 MySQL 데이터베이스를 사용하고 있습니다.

답변

1

나는 다음은 그것을해야한다고 생각 :

Player 
    .joins(:player_stats) 
    .group('player_stats.id') 
    .order('SUM(player_stats.goals) DESC') 
    .limit(7) 

당신은 귀하의 경우 범위를 사용할 수 있습니다

class Player 
    scope :by_goals, lambda { 
    joins(:player_stats).group('players.id').order('SUM(player_stats.goals) DESC') 
    } 
end 

및 컨트롤러 :

Player.by_goals.limit(7) 
+0

멋진! 고맙습니다! – Fianite

+0

할거야! 실제로 더 많은 테스트를하고 있었고 해시를 반복하는 플레이어처럼 보입니다. 에서와 같이 가장 많은 목표와 두 번째로 많은 목표를 가진 플레이어는 항상 같은 플레이어 인스턴스입니다. 처음 2 개가 올바르게 작동하기 때문에 왜 그렇게하는지 확신 할 수 없습니다. – Fianite

+0

사실 처음 두 사람이 항상 그런 것은 아니며 다시 실행했기 때문에 제대로 주문하지 않는 것 같습니다. 현재 6 명의 플레이어가 있으며, 제한 (6)을 사용하면 항상 6 명의 고유 플레이어를 얻는 것은 아닙니다. – Fianite

관련 문제