You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ruby on Rails数组分组中显示正确的索引值?

问题描述

我有一张名为products的表:

|id| |name|
 81   monitor
 82   keyboard
 83   mouse
 84   headphone

控制器products_controller.rb代码如下:

def index
  @products = Product.all
end

期望实现如下显示效果:

|Nº|  |name|         |Nº|   |name|
 1     monitor        3      mouse 
 2     keyboard       4      headphone

我尝试使用each_slice编写如下代码:

<table>
  <tr>
    <td>Nº</td>
    <td>Product</td>
  </tr>
  
  <% @products.each_slice(2).each_with_index do |grouped_array,row_index| %> 
  <tr>
     <% grouped_array.each_with_index do |product, column_index| %>
     <td><%= column_index + 1 %></td>
     <td><%= product.name %></td>
     <% end %>
  </tr>
  <% end %>
</table>

使用each_slice得到的结果为:

|Nº|  |name|         |Nº|   |name|
 1     monitor        1      mouse 
 2     keyboard       1      headphone

我还尝试使用in_groups_of:

<% @products.in_groups_of(2).each_with_index do |grouped_array,row_index| %> 
<tr>
   <% grouped_array.each_with_index do |product, column_index| %>
   <td><%= column_index + 1 %></td>
   <td><%= product.name %></td>
   <% end %>
</tr>
<% end %>

使用in_groups_of得到的结果同样错误,索引值重复。

请问如何修改代码以实现期望的正确索引值显示?


解决方案

问题出在你用的是组内局部索引(column_index),而不是全局的产品序号。可以通过以下两种方式修复:

方法一:计算全局索引

利用行索引和列索引计算出每个产品的全局序号:

<table>
  <tr>
    <td>Nº</td>
    <td>Product</td>
    <td>Nº</td>
    <td>Product</td>
  </tr>
  
  <% @products.each_slice(2).each_with_index do |grouped_array, row_index| %> 
  <tr>
     <% grouped_array.each_with_index do |product, column_index| %>
     <!-- 计算全局序号:行索引*每组数量 + 列索引 + 1 -->
     <td><%= row_index * 2 + column_index + 1 %></td>
     <td><%= product.name %></td>
     <% end %>
  </tr>
  <% end %>
</table>

方法二:先获取全局索引再分组

先给每个产品绑定全局索引,再进行分组渲染,逻辑更直观:

<table>
  <tr>
    <td>Nº</td>
    <td>Product</td>
    <td>Nº</td>
    <td>Product</td>
  </tr>
  
  <% @products.each_with_index.map { |p, i| [i+1, p] }.each_slice(2) do |group| %>
  <tr>
    <% group.each do |index, product| %>
    <td><%= index %></td>
    <td><%= product.name %></td>
    <% end %>
  </tr>
  <% end %>
</table>

说明

  • 方法一通过row_index * 2 + column_index +1计算:第一行(row_index=0)的两个产品序号是0*2+0+1=1和0*2+1+1=2;第二行(row_index=1)的两个是1*2+0+1=3和1*2+1+1=4,正好符合需求。
  • 方法二先把每个产品和它的全局序号(i+1)组成数组,再按每组2个切片,直接取预计算好的序号,可读性更强。

内容的提问来源于stack exchange,提问作者Ezio Auditore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:37:48