在我的应用程序中,因为记录创建频繁,所以我不想使用标准的分页机制,因为记录并不总是在同一页面上(今天在第2页上的记录,明天可能在第3页上)。相反,我要执行的操作是在特定ID之后请求记录。
假设我的帖子表中有100条记录,范围从ID 1-100,一次显示10条记录。
我要使用的params[:after]
是该ID之后的请求帖子。
因此,如果有,params[:after] == 10
我想获取记录11-21
(尽管可能不存在21条记录,所以实际上是从ID开始按created_at
顺序排列的表中有10条记录desc
。
在我的控制器中,我有类似以下内容:
if params[:after].present?
start_id = params[:after]
end_id = start_id+10
@posts = Post.where(:id => start_id..end_id).order('created_at desc').limit(10)
else
@posts = Post.order('created_at desc').limit(10)
end
我的问题是end_id
会返回,start_id+10
但是在数据库中接下来的10条记录ID可能不是,所以我最终会得到不正确的ID。
因此,理想情况下,我需要知道此帖子的第10个帖子的ID是什么。我怎样才能做到这一点?
如果params[:after]
给出的话,我将执行以下操作:
Post.where('table_name.id > ?', start).order('id desc').limit(10)
如果您不对created_at
列作弊,则列created_at
和id
列的顺序应该相同,并且列中的排序要快得多id
(它具有数字索引和类似的索引)
在开始条件中包括表名是可选的,但在要联接多个表的情况下将帮助您避免模棱两可的SQL。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句