Rails一个接一个地分页数组项而不是逐页

时间:2010-06-07 20:32:07

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

我有一组资产,我们称之为“从业者”。 我在日历界面的标题中显示这些从业者。 日历有7列。 7列=每个视图/页面7个从业者。 现在:

如果第一页显示从业者1-7,当您进入下一页时,您将看到从业者8-15,下一页16-23等等。

我想知道如何寻找从业者,以便如果第一页显示从业者1-7,下一页将显示从业者2-8,然后3-9等等。

我非常感谢您提供的任何帮助。 这是我正在使用的rails代码。

最好的问候,

哈里斯诺维克

# get the default sort order
sort_order = RESOURCE_SORT_ORDER

# if we've been given asset ids, start our list with them
unless params[:asset_ids].blank?
  params[:asset_ids] = params[:asset_ids].values unless params[:asset_ids].is_a?(Array)
  sort_order = "#{params[:asset_ids].collect{|id| "service_provider_resources.id = #{id} DESC"}.join(",")}, #{sort_order}"
end

@asset_set = @provider.active_resources(:include => {:active_services => :latest_approved_version}).paginate(
  :per_page => RESOURCES_IN_DAY_VIEW,
  :page => params[:page],
  :order => sort_order
)

2 个答案:

答案 0 :(得分:1)

好问题!我想这是WillPaginate没有真正考虑的一件事。我将在这里查看WillPaginate的代码,但我实际上没有测试过这个解决方案。如果您打算尝试一下,请告诉我它是否适合您。

WillPaginate::Collection中,逻辑分离得很好。您需要更改offsettotal_entries=方法的行为。您可以使用子类化来完成此操作,但这意味着您不能再使用特殊的paginate查找程序。 (它有WillPaginate::Collection硬编码。)

您可以在lib/

中使用以下内容
class SlidingWindowCollection < WillPaginate::Collection
  def offset
    current_page - 1
  end

  def total_entries=(number)
    @total_entries = number.to_i
    @total_pages   = [@total_entries - per_page, 1].max
  end
end

然后,您的示例代码如下所示:

@asset_set_scope = @provider.active_resources(:include => {:active_services => :latest_approved_version})
@asset_set = SlidingWindowCollection.create(params[:page], RESOURCES_IN_DAY_VIEW, @asset_set_scope.count) do |pager|
  pager.replace(@asset_set_scope.all(:offset => pager.offset, :limit => pager.per_page, :order => sort_order))
end

我想,用法有点复杂。所有额外的东西通常由特殊的查找器paginate处理,例如计算条目的总数并选择正确的条目。我想你可以创建一个帮助器,如果它是你打算经常做的事情。

答案 1 :(得分:0)

我认为LIMIT会对你有用。我不知道使用分页但你可以试试

LIMIT params[:page], 7

其中params [:page]是页面的编号, 因此对于第1页,它将显示来自1的7行,即1-7 Smilarly, 对于第2页,它将显示来自2的7行,即2-8