ActiveRecord 按顺序查询对象子集

Posted

技术标签:

【中文标题】ActiveRecord 按顺序查询对象子集【英文标题】:ActiveRecord query for a subset of objects in order 【发布时间】:2016-01-18 19:07:16 【问题描述】:

我想根据查询返回的对象数量的来源、顺序和限制迭代地查询大型数据库。订单所基于的字段由客户端与先前结果中最后一个对象的 ID 一起传入。

例如,假设一个帖子表。帖子有“views”(查看次数)、“likes”(喜欢的次数)和“touched”(最后一次触摸)字段。客户端需要通过传入 order、limit 和 origin ID(例如,上一次获取中最后一个对象的 ID)来一次获取 20 个帖子。

我知道如何做到这一点,方法是将所有帖子加载到内存中,适当排序,然后找到客户端传入的帖子的原始 ID,然后根据限制返回一些帖子。

我想在数据库中完成这一切,以便客户端按排序顺序传递它收到的最后一个对象的 ID,然后让查询返回下一个 n 个对象,其中 n 是限制。

我在使用 Postgres 的 Rails 4。

谢谢!

【问题讨论】:

你想按什么属性排序? “它收到的最后一个对象”是什么意思?我们在谈论用户的帖子吗?您应该编辑您的问题并进一步解释您的问题。 查看我上面的编辑...客户端应该能够定义要排序的属性。在我的示例中,这将是喜欢、查看或感动。基本思想是允许客户端按限制定义的批量迭代大量对象列表。 你想要一个可排序的表格供用户交互吗? 我确实编辑了文本并认为我澄清了问题。在原始帖子中,我没有明确说明服务器应该能够根据喜欢、查看或触摸的顺序返回对象。如果还不清楚,我深表歉意。 为了更具体,客户端是一个 ios 应用程序,允许用户滚动浏览大量帖子。用户可以根据最近发布的帖子、最喜欢的帖子和查看次数最多的帖子来选择查看帖子。数据库非常大,所以客户一次只要求 20 个帖子。我希望使用客户端收到的最后一篇文章的 ID 为服务器提供根据排序顺序获取下 20 篇文章所需的信息。 【参考方案1】:

鉴于答案是多么简单,我显然是 activerecord(和 SQL)的新手:在我的情况下,使用 offset 和 limit 就可以了:

Post.select("id").limit('20').offset('0').order('views DESC')

此返回 20 来自按视图排序的偏移量零。客户端然后将偏移量增加适当的计数并执行下一个查询:

Post.select("id").limit('20').offset('20').order('views DESC')

【讨论】:

你可以.limit(20).offset(20),数字不需要使用字符串。

以上是关于ActiveRecord 按顺序查询对象子集的主要内容,如果未能解决你的问题,请参考以下文章

Rails,ActiveRecord,在int数组中查询id,保持传递数组的顺序

如何将 DAO 查询转换为 Yii2 ActiveRecord。如何从连接表中选择和使用特定列

实体框架按排序顺序加载子集合

ActiveRecord 更好的、非数字和非顺序的 id

MySQL 查询慢,按限制按顺序分组

Castle.ActiveRecord环境配置