使用 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
背景
在我的网站中,我试图显示 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