如何通过Rails模型在Postgres上按日期分组

时间:2014-08-19 04:59:00

标签: sql ruby-on-rails postgresql activerecord arel

我正在使用带有Ruby on Rails的Postgres,并希望在我的posts表中查询返回按created_at日分组的所有帖子,每个组按时间顺序排列。< / p>

我的目标的一个完美示例是任何博客的索引按日期列出所有帖子。

我希望得到的伪代码对象结构与此类似:

posts_grouped_by_date = {
  "1/2/2014" => [post1, post2, post3],
  "1/15/2014" => [post5, post6,post7],
  etc..
}

我的表名为posts,看起来像这样:

 id |                               title                               |         created_at
----+-------------------------------------------------------------------+----------------------------
 13 | Eaque hic tenetur at quam quibusdam eveniet veritatis.            | 2014-08-18 02:40:31.329665
  9 | The only thing i want to say.                                     | 2014-08-18 02:40:31.329665
 16 | Est sunt cumque rerum nam nobis consequuntur aut.                 | 2014-08-19 02:58:26.817936
 18 | Fuga assumenda facilis aut mollitia eum soluta.                   | 2014-08-19 02:58:26.837839
  8 | The only thing i want to say.                                     | 2014-08-18 02:40:31.329665
 12 | Laudantium dolores odit sed veritatis in et vel deserunt.         | 2014-08-18 02:40:31.329665
 10 | The only thing i want to say.                                     | 2014-08-18 02:40:31.329665
 20 | Rem laboriosam ipsam sunt maxime quia adipisci et voluptatem.     | 2014-08-19 02:58:26.837839
 19 | Laudantium sit explicabo et quia eligendi ipsam.                  | 2014-08-19 02:58:26.837839
 21 | Repellat qui eos dolorem.                                         | 2014-08-19 02:58:26.837839
  6 | The only thing i want to say.                                     | 2014-08-18 02:40:31.329665
 17 | Error voluptatem architecto distinctio impedit iste dolores enim. | 2014-08-19 02:58:26.829968
 15 | Vero modi voluptate deleniti labore quis est.                     | 2014-08-19 02:58:26.808126
 14 | Et neque porro qui animi facilis numquam.                         | 2014-08-19 02:58:26.800474

我如何使用ActiveRecord或Arel语法执行此操作?代码背后的解释也非常有用。我正在使用它进行学习/练习,而不仅仅是寻找复制/粘贴。

1 个答案:

答案 0 :(得分:0)

我想你想要这样的东西:

Post.order(:created_at).group_by {|p| p.created_at.to_date}

1 - Post.order(:created_at)按增量顺序按created_at属性对帖子进行排序。

2 - 然后,一旦您订购了所有帖子,您就可以使用块中的代码对它们进行分组。由于您不希望分组中包含时间戳(每秒都会有不同的记录,那么重点是什么?),您将时间戳转换为日期。