sql - rails Postgres : Query to find corresponding models in a "triangle of models"

标签 sql ruby-on-rails ruby postgresql activerecord

我有模型 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/

相关文章:

sql - 如何查找 Oracle SYSTEMDB 表

mysql - 将 NOT NULL 添加到 SQL 中的列

sql - SQL 中的自引用 CASE WHEN 子句

ruby-on-rails - 确定脚本/服务器是否正在启动

sql - 在 Access 中连接记录和 GROUP BY

ruby-on-rails - 设计超时错误显示 `true`

ruby - 在 ruby​​ 脚本中访问 self.method 中的变量

ruby - 如何在迭代时更改数组的元素部分

ruby - 如何使用 Ruby 将对象推送到数组 x 次?

ruby-on-rails - Flash 无法在 Facebook on Rails 应用程序中的重定向中存活