代码之家  ›  专栏  ›  技术社区  ›  Jack Smith

按集合中的列对多个条目进行分组

  •  0
  • Jack Smith  · 技术社区  · 6 年前

    我在视图文件中的表中显示了一组记录,如下所示:

    || user || sport || # of victories || # of losses ||  
    || Jane || foo   ||       1        ||      1      ||  
    || Jane || foo   ||       2        ||      3      ||  
    || Jane || bar   ||       1        ||      1      ||  
    || Jane || bar   ||       2        ||      3      ||
    

    在上面的例子中,我试着根据运动项目对结果进行分组,所以我没有2个记录

    || Jane || foo   ||       1        ||      1      ||  
    || Jane || foo   ||       2        ||      3      || 
    

    将有一个分组,它当前根据我不在此视图中显示的另一列分成多个条目。

    || Jane || foo   ||       3        ||      4      ||  
    

    我一直在尝试。分组和分组来完成这项工作,但似乎做得不正确。有人能提供一些提示吗?

    其他信息,如果需要:

    表架构

    create_table "records", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
     t.integer "victories"
     t.integer "losses"
     t.bigint "user_id"
     t.bigint "sport_id"
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
     t.integer "opposition_id"
     t.index ["opposition_id"], name: "index_records_on_category_id"
     t.index ["user_id"], name: "index_records_on_user_id"
    end
    

    控制器

      def board
        @summary = Record.all.sort_by{ |i| i.user_id }
      end
    

    视图

       <% @summary.each do |record| %>
         <tr>
          <td><%= record.user.name %></td>
          <td><%= record.sport_id %></td>
          <td><%= record.victories %></td>
          <td><%= record.losses %> </td>
        </tr>
       <% end %>
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   iGian    6 年前

    或者使用一个查询,就像我将所有内容都放在视图中的例子一样,但是使用控制器来获取数据。

    <% sport_records = SportRecord.group(:user_id).select(:user_id, :sport_id, "sum(victories) as total_victories", "sum(losses) as total_losses") %>
    <% sport_records.each do |sr| %>
      <p><%= sr.sport.name %> | <%= sr.user.name %> | <%= sr.total_victories %> | <%= sr.total_losses %></p>
    <% end %>
    

    如果您还需要按运动分组,请改为

    SportRecord.group(:user_id, :sport_id).select(:user_id, :sport_id, "sum(victories) as total_victories", "sum(losses) as total_losses")