【问题标题】:How to group by column on one side of many to many, and be able to .each through matches on other side如何在多对多的一侧按列分组,并能够通过另一侧的匹配进行 .each
【发布时间】:2016-03-01 17:42:24
【问题描述】:

我有 3 张桌子,活动,游戏,活动游戏(加入其他人)。我正在尝试创建一个列出每个事件的页面,以及将在该事件中进行的每个游戏。该页面当前正在运行,但正在对 HTML 表中的每一行进行新的数据库查询。我正在从控制器发送@events = Event.all 并以这种方式访问​​信息。

<% @events.each do |event| %>
    <tr>
        <td><a href="/events/<%= event.id %>"><%= event.title %></a></td>
        <td><a href="/users/<%= event.user.id %>"><%= event.user.username %></a></td>
        <td><%= event.description %></td>
        <td>
        <% event.games.each do |game| %>
            <a href='/games/<%= game.id %>'><%= game.name %></a> 
        <% end %>
        </td>

我试图通过创建一个包含所有信息的新查询来更改从控制器发送的内容。它并没有按照我的预期工作,问题是当我这样做时,@events.each 事件会被重复,但是会有很多游戏出现。

@events = Event.joins("LEFT JOIN eventgames ON events.id = eventgames.event_id")
.select("events.*")
.group("events.id")
.joins("LEFT JOIN games ON eventgames.game_id = games.id")
.select("games.id as gameid, games.name")
.group("games.id")

我试过了,但显然我的分组不正确。我将如何对它进行分组,以便每个事件 ID 只有 1 个事件,同时还能够遍历附加到事件的游戏?

【问题讨论】:

    标签: sql ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    在您的控制器中,请尝试以下操作,而不是 @events = Event.all

    @events = Event.inclues(:games).all
    

    请参阅ActiveRecord::QueryMethods#includes 了解更多信息。

    此外,通过where 条件或至少通过分页限制要加载的@events 的数量总是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2017-04-01
      • 2019-03-19
      • 2021-05-16
      • 2018-01-24
      相关资源
      最近更新 更多