在我的应用中,由于记录经常被创建,我不想使用标准的分页机制,因为记录不会总是在同一页面上(今天第2页的记录,明天可能在第3页) )。相反,我想做的是在某个ID之后请求记录。
所以,让我说我的帖子表中有100条记录,范围是ID 1-100,我一次显示10条记录。
我想要做的是使用params[:after]
作为该ID之后的请求帖子。
所以如果我有params[:after] == 10
我想要获得记录11-21
(虽然21可能不存在,所以它在表created_at
中排序{{1从ID开始。
在我的控制器中,我有类似的东西:
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
,但在数据库中,接下来的10个记录ID可能不是那样,所以我最终会返回错误的ID
理想情况下,我需要知道这个帖子的第10个帖子的ID是什么。我怎么能这样做?
答案 0 :(得分:4)
如果给出params[:after]
,我会执行以下操作:
Post.where('table_name.id > ?', start).order('id desc').limit(10)
如果您不在created_at
列上作弊,created_at
和id
列上的订单应该相同,id
的订单会更快列(它有一个数字索引和那些东西)
在开始条件中包含表名是可选的,但是如果您想要连接多个表,可以帮助您避免模糊SQL。
答案 1 :(得分:2)
你可以试试这个
Post.where('id > ?', start_id).order('created_at').limit(10)
希望这对你有用