【问题标题】:How to separate ActiveRecord collection into multiple collections by group?如何按组将 ActiveRecord 集合分成多个集合?
【发布时间】:2015-02-26 00:15:54
【问题描述】:

我有一个游戏,它会创建日志。在显示日志时,我想将它们依次分组以创建一个整体表格,其中每个回合都有一个嵌套表格。为了实现这一点,我尝试按轮流对日志进行分组,这样我就可以使用每轮运行一次的外循环和该轮内每个日志项的内循环来迭代它们。

现在,我有:

# logs_controller.rb
@logs = @game.logs.order("created_at ASC").group(:turn)

在视图中:

# logs/index.html.erb
<% @logs.each do |turn_logs| %> <table class="table">
    <tr>
        <td><%= turn_logs.first.turn%></td>
        <td>
            <table class="table table-striped">
                <% turn_logs.each do |log| %>
                    <tr><td><%= log.text %></td></tr>
                <% end %>
            </table>
        </td>
    </tr>
</table>

这不起作用,因为 Postgres 抱怨:

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR:  column "logs.id" must appear in the GROUP BY clause or be used in an aggregate function

我确信有一种我忽略的简单方法可以做到这一点,当有人指出时我会拍拍我的头,但现在它正在躲避我。

【问题讨论】:

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord group-by


【解决方案1】:

好的,我想我有一个很好的解决方案。它涉及到使用 group_by 来制作一个 log 对象数组的数组,以 turn 为 key:

控制器:

# logs_controller.rb
@logs_by_turn = @game.logs.order("created_at ASC").group_by {|log| log.turn}

在视图中:

# logs/index.html.erb
<table class="table">
<%  @logs_by_turn.each do |turn, turn_logs| %>  

        <tr>
            <td><%= turn_logs.first.turn %></td>
            <td>
                <table class="table table-striped">
                    <% turn_logs.each do |log| %>
                        <tr><td><%= log.text %></td></tr>
                    <% end %>
                </table>
            </td>
        </tr>
<% end %>

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2021-05-26
    • 2011-03-16
    相关资源
    最近更新 更多