如何使用will_paginate
对预先排序的记录集合进行分页环境:Ruby 2.0.0,Rails 4.0.3,Windows 8.1,PostreSQL,Datatable 1.12.2,Will_Paginate 3.0.5
使用Railscast 340代码,我试图完成我的数据表实现。我有几个列需要独立排序,因为它们存在于关联中,无法直接访问。为简单起见,我只在一个方向上显示了一列。
排序适用于标准情况和“product_location”情况。记录集合中提供了正确的记录,在这两种情况下它们的顺序都是正确的。
在“product_location”的情况下,当我尝试对结果进行分页时,will_paginate似乎从表中检索记录而不是使用我的记录集合。我以错误的顺序结束了错误的记录。这个动作对我来说没有意义,所以我必须遗漏一些东西。
标准排序在所有列的两个方向上都有效。
我的代码如下,之后是Railscast 340的原始代码:
def products
@products ||= fetch_products
end
def fetch_products
case sort_column
when "product_location"
products = Product.all
products.sort_by!{|product| product.readable_loc} # product_location sort
else
products = Product.order("#{sort_column} #{sort_direction}") # standard sort
end
# products is correctly sorted in both cases at this point
products = products.page(page).per_page(per_page)
# At this point, products is correctly sorted in the standard case but not in the "product_location" case
# In "product_location" case, pagination seems to be accessing the table directly again, not using the record collection?
if params[:sSearch].present?
products = products.where("stock_number like :search", search: "%#{params[:sSearch]}%")
end
products
end
原始代码是:
def products
@products ||= fetch_products
end
def fetch_products
products = Product.order("#{sort_column} #{sort_direction}")
products = products.page(page).per_page(per_page)
if params[:sSearch].present?
products = products.where("name like :search or category like :search", search: "%#{params[:sSearch]}%")
end
products
end
答案 0 :(得分:0)
这是因为Product.all
返回ActiveRecord::Relation
的实例,而products.sort_by!
从数据库中获取所有记录,并使用ruby对它们进行排序。与调用products = products.page(page).per_page(per_page)
相比,它会使用新的limit
和offset
创建新的SQL查询以获取给定页面上的记录。
因此,如果您想使用will_paginate进行分页,则不能使用.sort_by!
方法进行数据排序,但您必须使用Products.order
订购记录,这些记录将通过数据库中的SQL对记录进行排序。