Techioz Blog

配列上のグループの正しいインデックス値を表示するにはどうすればよいですか?

概要

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

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 |array, column_index| %>
     <td><%= column_index + 1 %></td>
     <td><%= array.name %></td>
     <% end %>
  </tr>
  <% end %>
</table>

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 |array, column_index| %>
     <td><%= column_index + 1 %></td>
     <td><%= array.name %></td>
     <% end %>
  </tr>
  <% end %>

in_groups_of を使用した結果は次のようになりました。

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

解決策

IN_GROUPS_OF コードの場合、要素のインデックスは次のように計算できます。

コントローラーの変更

@half_size = (@products.size / 2.0).round

ビューの変更

<% @products.in_groups_of(@half_size).transpose.each_with_index do |grouped_array, row_index| %>
  <tr>
    <% grouped_array.each_with_index do |item, column_index| %>
      <% if item.present? %>
        <td><%= row_index + column_index * @half_size + 1 %></td>
        <td><%= item.name %></td>
      <% end %>
    <% end %>
  </tr>
<% end %>

要素の量に関係なく機能します