2

我有一组资产,我们称他们为“从业者”。我在日历界面的标题中显示这些从业者。日历有 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
)
4

2 回答 2

1

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

逻辑分离得很好,在WillPaginate::Collection. 您需要更改offsetandtotal_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

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

于 2010-06-08T09:00:55.940 回答
0

我认为 LIMIT 会为你工作。我不知道使用分页,但你可以尝试以下

LIMIT params[:page], 7

其中 params[:page] 是页码,因此对于第 1 页,它将显示从 1 开始的 7 行,即 1-7 Smilarly,对于第 2 页,它将显示从 2 开始的 7 行,即 2-8

于 2010-06-08T04:43:29.183 回答