[英]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.