+5

Đánh số thứ tự cho các bản ghi bằng each_with_index

Giới thiệu

Mình xin giới thiệu về cách đánh số thứ tự bằng each_with_index cho các bản ghi mà mình có tìm hiểu và sử dụng trong quá trình bắt đầu học về lập trình Ruby On Rails. Cách hoạt động của each_with_index:

a = [11, 22, 31, 44, 224].each_with_index { |val, index| puts "index: #{index} for #{val}" }

Kết quả:

index: 0 for 11
index: 1 for 22
index: 2 for 31
index: 3 for 44
index: 4 for 223

=> [11, 22, 31, 224, 44]

Sử dụng trong project

Ở đây ta sử dụng gem phân trang là kaminari để kết hợp với each_with_index, ta cài đặt trong Gemfile:

gem "kaminari"

Sau đó chạy

bundle install

Tiếp theo ta tạo dữ liệu với 1 model product với các trường dữ liệu là picture, name, quantity, price và category rồi thêm 6 bản ghi.

Sau đó ở product_controller.rb trong Controller, thêm phương thức Index:

class ProductsController < ApplicationController
  def index
    @products = Product.page(params[:page]).per 5
  end
end

Ở trên ta có hiển thị 5 product trên 1 trang và trongIndex.html.erbviews/products ta có:

List product
<div>
  <table class="table">
    <thead>
       <tr>
          <th>No.</th>
          <th>Picture</th>
           <th>Name</th>
           <th>Quantity</th>
           <th>Price</th>
           <th>Category</th>
        </tr>
    </thead>
       <tbody id="list-product">
         <% @products.each_with_index do |product, index| %>
            <tr>
              <td><%= index %></td>
              <td class="th-product"><%= image_tag product.picture.url %></td>
              <td><%= product.name %></td>
              <td><%= product.quantity %></td>
              <td><%= product.price %></td>
              <td><%= product.category_name %></td>
            </tr>
          <% end %>
       </tbody>
  </table>
</div>
<%= paginate @products, theme: "twitter-bootstrap-3" %>

Kết quả ta có:

Trang 1

Trang 2

Như ta thấy kết quả ở trên đánh index được bắt đầu từ 0 và khi ta chuyển đến trang 2 nó cũng được đánh lại bắt đầu từ 0. Để giải quyết vấn đề này ta thêm phương thức page_index trong product_helper.rbapp/helpers.

module ProductHelper
  def page_index params_page, index, per_page
    params_page ||= 1
    (params_page.to_i - 1) * per_page.to_i + index.to_i + 1
  end
end

Ở đây params_page là số trang hiện tại(params[:page]), index là chỉ số được lấy each_with_index và per_page là số bản ghi được hiển thị trên 1 trang.

Tiếp theo ở Index.html.erb ta viết:

list product
<div>
  <table class="table">
    <thead>
       <tr>
          <th>No.</th>
          <th>Picture</th>
          <th>Name</th>
          <th>Quantity</th>
          <th>Price</th>
          <th>Category</th>
        </tr>
     </thead>
       <tbody id="list-product">
         <% @products.each_with_index do |product, index| %>
            <tr>
              <td><%= page_index params[:page], index, 5 %></td>
              <td class="th-product"><%= image_tag product.picture.url %></td>
              <td><%= product.name %></td>
              <td><%= product.quantity %></td>
              <td><%= product.price %></td>
              <td><%= product.category_name %></td>
            </tr>
          <% end %>
       </tbody>
  </table>
</div>
<%= paginate @products, theme: "twitter-bootstrap-3" %>

Ta nhận được kết quả:

Trang 1 Trang 2

Như vậy ta có thể đánh số thứ tự cho các bản ghi.

Link tham khảo : https://apidock.com/ruby/Enumerator/each_with_index


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.