首页 > 解决方案 > ActiveRecord 为每个日期选择前 10 个项目,持续 30 天

问题描述

模型是 Posts,每个帖子都有 upvotes:integer。每天都会创建数百个帖子,我想通过一个查询返回过去 30 天中每天投票最多的 10 个帖子。(300 个结果)

按时间顺序排列

我想返回过去 30 天的结果,并在同一查询中显示每天前 10 个帖子。

预期的结果应该是:

今天的前 10 个帖子,昨天的前 10 个帖子...... 30 天前的前 10 个帖子。

有什么方法可以在不每天进行循环和单独查询的情况下进行此查询?

标签: ruby-on-railsactiverecordrails-activerecord

解决方案


  1. 原始 SQL 如下所示:
SELECT (array_agg('id => ' || id || ', ' || 'body => ' ||  body || ', ' || 'upvotes => ' || upvotes order by upvotes desc))[1:10] AS posts, date FROM posts GROUP BY date;

它返回具有 2 个值的哈希,第一个是具有帖子数组的关键帖子,第二个值是日期

sql = "select (array_agg('id => ' || id || ', ' || 'body => ' ||  body || ', ' || 'upvotes => ' || upvotes order by upvotes desc))[1:
10] as posts, date from posts group by date;"

records = ActiveRecord::Base.connection.execute(sql)
records[0] = {"posts"=> "{\"id => 8, body => atis atis animatis, upvotes => 9\",\"id => 11, body => Fuga enim sit aliquam., upvotes => 8\",\"id => 20, body => Vel vero fugiat explicabo., upvotes => 8\",\"id => 18, body => Nesciunt dolor voluptatibus ad., upvotes => 7\",\"id => 17, body => Laboriosam qui nam esse., upvotes => 6\",\"id => 13, body => Earum est temporibus odio., upvotes => 6\",\"id => 16, body => Autem qui nam omnis., upvotes => 4\",\"id => 7, body => Facilis aut non aut., upvotes => 4\",\"id => 15, body => Voluptatem non asperiores vero., upvotes => 4\",\"id => 12, body => Nihil facere aut natus., upvotes => 3\"}",
 "date"=>2019-11-24 14:41:34 UTC}

然后你可以解析结果。希望能帮助到你


推荐阅读