使用 Kaminari 在同一页面上对同一模型的多个对象进行分页

Paginating Multiple Objects of the Same Model on the Same Page with Kaminari

背景

在我的网站中,我试图显示 2 table 的数据,这些数据是我从另一个网站抓取并放入一个名为 Product 的对象中的。 Product 对象有 2 个类别,存储为枚举,已注册和未注册。

问题

当我使用 Kaminari 应用分页时,问题就来了。下面是一些演示问题的图片。

问题前:

当我在已注册产品 table 上单击“2”时,未注册产品 table 也会转到“2”

问题:

我猜这是因为来自两个 table 的数据来自同一个对象?下面是相关文件。

我的模型

class Product < ApplicationRecord
enum product_type: [:registered, :unregistered, :cosmetic]

paginates_per 8
end

我的控制器

class HomeController < ApplicationController
 def index
  @registered_products = Product.where(product_type: 0).page params[:page]
  @unregistered_products = Product.where(product_type: 1).page params[:page]
 end
end 

我的部分注册产品

<table>
  <thead>
    <tr>
      <th scope='col'>Name</th>
      <th scope='col'>Chemical</th>
    </tr>
  </thead>
  <tbody>
    <% @registered_products.each do |product| %>
      <tr>
        <td><%= product.product_name %></td>
        <td><%= product.chemical %></td>
       </tr>
    <% end %>
  </tbody>
</table>
<%= paginate @registered_products %>

我对未注册产品的部分相同,将@registered_products替换为@unregistered产品。

index.html.erb

<h2>Registered Products</h2>
<%= render partial: "registered" %>
<h2>Unregistered Products</h2>
<%= render partial: "unregistered" %>

我试过的

我在浏览 Kaminari 文档时注意到数组可以分页。所以我试过了。下面是修改后的文件。

控制器

class HomeController < ApplicationController
 def index
  registered_products = Product.where(product_type: 0).to_a
  unregistered_products = Product.where(product_type: 1).to_a

  @registered_products_array =  Kaminari.paginate_array(registered_products).page(params[:page]).per(10)
  @unregistered_products_array = Kaminari.paginate_array(unregistered_products).page(params[:page]).per(10)
 end
end

所有其他相关文件都是相同的,只是替换为创建的新全局变量。问题依旧。

所以我的问题是如何解决这个问题,是否因为我在同一页面中对同一对象多次分页而出现问题?

出现此问题的原因是您使用相同的 params[:page] 属性浏览页面。这会导致将相同的数字传递给 Product 模型的两个查询。您需要改为执行此操作才能使其正常工作。

部分注册页面:

...
<%= paginate @registered_products, param_name: :registered_page_no %>

并且在未注册的部分页面中,您将必须执行相同的操作,但使用唯一的名称,例如 unregistered_page_no

在你的控制器中,你需要做的就是:

class HomeController < ApplicationController
 def index
  @registered_products = Product.where(product_type: 0).page params[:registered_page_no]
  @unregistered_products = Product.where(product_type: 1).page params[:unregistered_page_no]
 end
end 

要了解有关 param_name 的更多信息,请阅读文档:https://github.com/kaminari/kaminari#changing-the-parameter-name-param_name-for-the-links