4

我有一个控制器方法,它按派生属性对元素进行排序。只要我不尝试分页,我就可以打印到视图。当我打电话时,@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
4

2 回答 2

5
  • .sort_by!方法返回一个 Array,它没有方法page(ruby Array 不能分页,您必须自己实现它或使用外部库)。

  • 分页适用于 ActiveRecord::Relation objects,由查询返回,例如.whereor.order

  • 在您的情况下,您应该在 DB 级别进行排序(比通过 Ruby 进行排序更快):

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

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

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

于 2013-06-14T14:07:35.273 回答
1

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

来自 WillPaginate 文档

以前,从分页方法返回的所有对象都是 WillPaginate::Collection 类型。这不再是真的;在 Active Record 3 中,paginate 和 page 方法返回一个 Relation,该 Relation 被扩展为类似于 WillPaginate::Collection。同样,DataMapper 返回一个常规的 DataMapper::Collection,它也是扩展的。

ActiveRecord::Relation 和 DataMapper::Collection 都是惰性数组,它们在需要数据之前不会执行任何 SQL 查询。这使它们比普通数组更好。

但是,WillPaginate::Collection 类仍然可用,并且大部分未更改。

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

需要'will_paginate/array'

于 2013-06-14T14:11:47.460 回答