2017-06-13 8 views
1

私はモデルUser、League、およびTeamを持っています。ユーザーにはhas_manyリーグとhas_manyチームがあり、リーグhas_manyチームとhas_manyユーザーがあり、チームはリーグに属し、ユーザーに所属します。Rails Postgres: "モデルの三角形"で対応するモデルを見つけるためのクエリ

私がしたいのは、そのユーザーに属するすべてのリーグとチームを見つけることですが、各チームが属するチームとペアになるようにペアを組むことです。理想的には、可能な限り少ない数のクエリでこれを実行したいと思います。ペアをサイドバーに行として表示するため、ペア設定も重要です。

def get_user_leagues_and_teams(user) 
    @leagues_teams = Hash.new 
    if (!user.teams.nil?) 
     @teams = user.teams.all 
    end 
    #Creates hash of leagues and teams (assuming one to one) 
    @teams.each do |team| 
     league = team.league 
     @leagues_teams[league] = team 
    end 
    @leagues_teams 
end 

上記作品:

は、ここで(作品)私の現在の試みです。しかし、私はそれが非常に効率的だとは思わない。すべてのユーザーチームを調べ、各チームのリーグを1つずつ見つけて、各ペアをハッシュに格納します。多くのリーグ/チームを持つユーザーにとっては、これはデータベース呼び出しが非常に多くなることになります。さらに、リーグ/チーム(ゲーム、取引など)と一致させる必要があるユーザーと他のモデルを関連付ける場合、これはうまく拡張されません。

もっと良い質問がありますか?

ありがとうございます!

答えて

2

2点:あなたが達成しようとしている何
1.はちょうどグループにある彼らのリーグによってチームは、あなたが車輪の再発明をする必要はありません、あなたが使用することができます#group_by方法がすでにありますこれを達成する。
2.すべてのリーグを1対1で探すのをやめるには、#includesを使用して1回のクエリでメモリに読み込むことができます。

ので、あなたの結果のコードは次のようになります。

@leagues_teams = user.teams.includes(:leagues).group_by(&:league) 

はるかに簡単かつ効率的に!

+0

パーフェクト。ありがとう!! 1 –

関連する問題