2017-06-13 52 views
1

我有模型用戶,聯盟和團隊。用戶擁有多個聯賽和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 

上述作品。但是,我不認爲這是非常有效的。我查找所有用戶團隊,然後逐個查找每個團隊的聯盟,並將每個團隊存儲在一個哈希中。對於擁有許多聯賽/團隊的用戶來說,這將是太多的數據庫調用。此外,如果我想將其他模型與需要與聯盟/團隊匹配的用戶(例如遊戲,交易等)關聯起來,那麼這不會很好地擴展。

是否有更好的查詢?

謝謝!

回答

2

兩點:
1.你正在努力實現是隻按他們的聯賽球隊,你不需要重新發明輪子,已經有一個#group_by方法,你可以用它來做到這一點。
2.要停止查找每個聯盟一個接一個,您可以使用#includes通過單個查詢將其加載到內存中。

所以最後的代碼會是這個樣子:

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

更簡單,更高效!

+0

完美。謝謝!! 1 –