我有模型 User、League 和 Team。一个用户有_多个联赛,有_多个球队,一个联赛有_多个球队,有_多个用户,一个球队属于一个联赛,属于一个用户。
给定当前用户,我想做的是找到属于该用户的所有联赛和球队,但是将它们配对,这样每个球队都与它所属的联赛配对。理想情况下,我希望在尽可能少的查询中执行此操作 - 配对也很重要,因为我将在侧边栏中将每一对显示为一行。
这是我目前的尝试(有效):
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. 你想要实现的是只按联赛对球队进行分组,你不需要重新发明轮子,已经有一个 #group_by
方法可以用来实现这一点。
2. 要停止逐个查找每个联赛,您可以使用 #includes
通过单个查询将它们加载到内存中。
所以你的结果代码看起来像这样:
@leagues_teams = user.teams.includes(:leagues).group_by(&:league)
更简单、更高效!
关于sql - rails Postgres : Query to find corresponding models in a "triangle of models",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511559/