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 中测试模型实例是不是为“空”的最佳方法是啥?