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

Joe*_*sey 4 ruby ruby-on-rails

我有一个控制器方法,通过派生属性对元素进行排序.只要我不尝试分页,我就可以打印到视图.当我打电话时,@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
Run Code Online (Sandbox Code Playgroud)

MrY*_*iji 5

  • .sort_by!方法返回一个没有方法page的数组(无法对ruby数组进行分页,您必须自己实现它或使用外部库).

  • 上的ActiveRecord ::关联对象分页的作品,由像查询返回.where.order

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

    @foos.order(:capacity_available)
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果capacity_available属性是String(不是Integer),则可以将其作为INT进行CAST:

    @foos.order('CAST(capacity_available AS INT) ASC')
    
    Run Code Online (Sandbox Code Playgroud)

(您可能需要编辑该CAST()函数,它应该适用于PostGreSQL,不确定MySQL)