【发布时间】:2014-08-12 07:23:53
【问题描述】:
我需要实现对分页之间的数据变化具有半弹性的分页。标准分页依赖于 SQL 的 LIMIT 和 OFFSET,但是随着新数据点的创建或它们在排序中的排名发生变化,偏移量可能会变得不准确。
一个想法是保留从 API 请求的最后一个数据点并获取以下元素。我真的不知道 SQL(我们正在使用 postgres),但这是我(当然有缺陷)尝试做类似的事情。我正在尝试将最后一个元素的位置存储为“rownum”,然后在以下查询中使用它。
WITH rownum AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY rank ASC, id) AS rownum
WHERE id = #{after_id}
FROM items )
SELECT * FROM items
OFFSET rownum
ORDER BY rank ASC, id
LIMIT #{pagination_limit}
我可以看到一些问题,例如最后一项的排名是否发生了显着变化。如果有人能想到另一种方法来做到这一点,那就太好了。但如果可能的话,我想将其限制为单个数据库查询,因为这是应用程序最常使用的 API。
【问题讨论】:
-
考虑使用标准分页 gem 之一 - ruby-toolbox.com/categories/pagination
-
不确定这些能否解决问题。看到这个未解决的问题:stackoverflow.com/questions/23973931/…
标签: sql ruby-on-rails postgresql pagination sql-order-by