繁体   English   中英

在对数组进行排序后如何对数组元素进行分页?

[英]How to paginate elements of an array after sorting on it?

我有一个控制器方法,该方法按派生属性对元素进行排序。 只要不尝试分页,就可以打印到视图。 当我调用@foos = @foos.page params[:page] ,出现以下错误: undefined method 'page' for #<Array:...>

有人可以在这里提供一些指导吗? 谢谢。

这是整个控制器方法:

def index_by_capacity
    if current_user.is_view_major?
      @foos = Foo.major_attr(:name)
    else
      @foos = Foo.order(:name)
    end


  @foos = @foos.sort_by! {|a| a.capacity_available.to_i }
  @total_foos = @foos.count

  @foos = @foos.page params[:page]

  respond_to do |format|
    format.html
    format.json { render json: @foos }
  end
end
  • .sort_by! method 返回一个Array ,它没有方法page (ruby Array无法分页,您必须自己实现或使用外部库)。

  • 分页适用于ActiveRecord :: Relation对象 ,由.where.order类的查询返回

  • 在这种情况下 ,您应该在数据库级别下订单(比通过Ruby进行排序更快):

     @foos.order(:capacity_available) 
  • 如果capacity_available属性是字符串(不是整数),则可以将其作为INT进行转换

     @foos.order('CAST(capacity_available AS INT) ASC') 

(您可能需要编辑CAST()函数,它应可在PostGreSQL上运行,不确定MySQL)

如果要继续使用数组而不是活动记录关系对象,则可以简单地包含WillPaginate::Collection

从WillPaginate文档

以前,从分页方法返回的所有对象均为WillPaginate :: Collection类型。 这不再是事实; 在Active Record 3中,分页和分页方法返回一个Relation,该关系被扩展为类似于WillPaginate :: Collection。 类似地,DataMapper返回一个常规的DataMapper :: Collection,它也得到了扩展。

ActiveRecord :: Relation和DataMapper :: Collection都是惰性数组,它们直到需要数据时才执行任何SQL查询。 这使它们比普通数组更好。

但是,WillPaginate :: Collection类仍然可用,并且几乎没有变化。

Array#paginate方法也仍然存在,但是默认情况下不加载。 如果需要对静态数组进行分页,请首先在代码中要求它:

需要'will_paginate / array'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM