如何在多对多的一侧按列分组,并且能够通过另一侧的匹配进行分组

时间:2016-03-01 17:42:25

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

我有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个事件,同时还可以遍历事件附带的游戏?

1 个答案:

答案 0 :(得分:0)

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

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

有关详细信息,请参阅ActiveRecord::QueryMethods#includes

此外,最好通过@events条件或至少通过分页来限制您要加载的where的数量。