Rails +将paginate分页列表演示者

时间:2016-06-14 01:25:49

标签: ruby-on-rails ruby will-paginate

今天我想尝试从分页列表中显示项目:

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)

提前致谢

2 个答案:

答案 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) }