今天我想尝试从分页列表中显示项目:
users = User.order('name').paginate(:per_page => 10, :page => 1).map{|u| UserPresenter.new(e)}
问题是用户不再(在映射到我的演示者之后)用will_paginate魔术包裹的数组,因此它不包含诸如total_entries,per_page或page之类的东西,那么will_paginate助手在我的视图中不起作用: S。
如何继续对后处理对象列表进行分页?
我尝试过另一种方式,但是如果我的表中有大量的记录,那将非常痛苦,因为它会从已经检索到的大结果集中分页:
users = User.order('name').map{|u| UserPresenter.new(u)}.paginate(:per_page => 10, :page => 1)
提前致谢
答案 0 :(得分:0)
也许我会尝试以这种方式创建UserCollectionPresenter和UserPresenter
class UserCollectionPresenter
include Enumerable
delegate :paginate, to: :collection
attr_reader :collection
def initialize(collection)
@collection = collection
@_presentable_collection = collection.map { |user| UserPresenter.new(user) }
end
def each(&block)
@_presentable_collection.each(&block)
end
def total_count
@collection.limit(nil).offset(nil).count
end
end
和
class UserPresenter
def initialize(user)
@user = user
end
private
attr_reader :user
end
在控制器中你应该发送分页的AR集合,之后你可以使用paginate。不确定will_paginate需要哪些方法,但我会考虑委托,“覆盖”它们或直接从will_paginate中包含它们。
答案 1 :(得分:0)
我建议你仍然使用users
作为will_paginate
,并为演示者添加另一个实例变量。
@users = User.order('name').paginate(:per_page => 10, :page => 1)
@presenters = @users.map { |u| UserPresenter.new(u) }