Rails Pagination - 从实例 id 中查找页码

Posted

技术标签:

【中文标题】Rails Pagination - 从实例 id 中查找页码【英文标题】:Rails Pagination - find page number from instance id 【发布时间】:2011-07-22 07:45:13 【问题描述】:

如果我有分页项目的 id,我怎样才能找到它的页码?

我正在使用 rails 3 和 kaminari。

不幸的是,将页码作为参数传递不是一种选择。分页项是由用户生成的内容维护的图像库的图像,这些内容随着时间的推移而演变。这意味着图像可能会在第一周出现在第一页,但随后一周出现在第二页。

另一种选择是保持图像的数字顺序 (acts_as_list),这在我的情况下也是不可能的,因为照片可能出现在不同范围的多个画廊中。

编辑:

为此增加了赏金,因为我多年前在各个地方都看到了同样的问题,但没有解决方案。如果没有出现活动记录解决方案,我很乐意接受 sql 查询。

【问题讨论】:

这可能效率很低,但我它可以工作gist.github.com/885484(还没有测试过),使用查询获得结果会很好,但它似乎是一个难题,我很乐意看到没有该循环的另一种方法。 您好,感谢您的回答。这会起作用,但我希望更多的查询,因为这在大型集合上会很慢。 【参考方案1】:
# Your "per_page" count
per_page = 30
# Your Image instance:
@image = Image.find_your_image
# SQL. If you're ordering by id, how many lower IDs are there?
position = Image.where("id <= ?", @image.id").count
# Your page
page = (position.to_f/per_page).ceil

现在你可以把它包装成一个类方法

class Image < ActiveRecord::Base
  def page(order = :id, per_page = 30)
    position = Image.where("#order <= ?", self.send(order)).count
    (position.to_f/per_page).ceil
  end
end

用法

@image.page
@image.page(:created_at)
@image.page(:title, 10)

【讨论】:

感谢您的回复。我相信这会很好,但还没有机会测试它,因为忙于其他事情。 再次嗨,很抱歉耽搁了这一点。您的答案经过一次更正即可;要获得该职位,必须有一个 一个改进。如果按非 uniq 列排序,结果可能是错误的。什么对我有用 - 是gist.github.com/pironim/5975256 对于类似的解决方案,请检查***.com/questions/13365089/… 以及【参考方案2】:

如果您找到页面 id 意味着它将需要一些 sql 查询。相反,您可以将页面值作为参数传递。这也会提高你的表现。

【讨论】:

谢谢拉马纳维尔。我的问题是分页实例可能并不总是出现在其关联记录的同一页面上。我将对此问题进行澄清。【参考方案3】:

我有同样的问题,但有多个订单。我只能用一个小坏把戏来让它工作。

@model = Model.find(params[:id])
page = 1
  if params[:page]
  page = params[:page]
else
  page = (Model.some_scope.order(some_attribute: :desc, updated_at: :desc).pluck(:id).index(@model.id).to_f / per_page).ceil
end

只有当你在pluck的结果中没有太多记录时它才有效,否则它会变慢。

【讨论】:

以上是关于Rails Pagination - 从实例 id 中查找页码的主要内容,如果未能解决你的问题,请参考以下文章

未定义属性:Illuminate\Pagination\LengthAwarePaginator::$id

在 Ruby on Rails 中测试模型实例是不是为“空”的最佳方法是啥?

如何使用 rails 和 jquery 优化 ajax 搜索

Rails - 从视图中的索引操作访问实例变量属性

Rails websocket 连接ID存储

Python+Selenium 自动化实现实例-处理分页(pagination)