如何使用will_paginate对预先排序的记录集合进行分页?

时间:2014-06-03 12:52:43

标签: sql ruby-on-rails sorting pagination will-paginate

如何使用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

1 个答案:

答案 0 :(得分:0)

这是因为Product.all返回ActiveRecord::Relation的实例,而products.sort_by!从数据库中获取所有记录,并使用ruby对它们进行排序。与调用products = products.page(page).per_page(per_page)相比,它会使用新的limitoffset创建新的SQL查询以获取给定页面上的记录。

因此,如果您想使用will_paginate进行分页,则不能使用.sort_by!方法进行数据排序,但您必须使用Products.order订购记录,这些记录将通过数据库中的SQL对记录进行排序。