8

所以我有一个模型,我想检索记录并按 created_at 字段的日期对它们进行分组。但是 created_at 是一个日期时间字段,我只对日期部分感兴趣。所以我正在寻找类似二维数组的东西,第一层是一个以日期字符串为键的散列,第二层是带有记录的数组。我该怎么做?

{
"9/28/2012" => [记录,记录,记录],
"9/29/2012" => [记录,记录,记录],
"9/30/2012" => [记录,记录,记录]
}

最重要的是,如果我希望将上述安排应用于从此模型中检索到的所有记录,我应该怎么做?

4

2 回答 2

13

ActiveRecordgroup方法将满足您的需求。在您的情况下,问题将created_at在于使用哪个日期时间,以及您对按日期分组的约束。由于将日期时间转换为日期是特定于数据库的,因此代码也需要特定于数据库。

对于 MySql,你可以这样做:

Model.group("date(table_name.created_at)")

对于 SQLite,您可以执行以下操作:

Model.group("strftime('%Y-%m-%d', table_name.created_at)")

对于 PostgreSQL:

Model.group("table_name.created_at::date")

不幸的是,此代码不可移植,但这对您来说可能无关紧要。如果是这样,您始终可以构建一个包装方法,根据您的 DBMS 选择正确的转换语法。

于 2012-09-30T01:51:28.380 回答
0

在 ActiveRecord 上,您可以这样做:

2.6.4 :036 > User.group('created_at::date').count

   (5.3ms)  SELECT COUNT(*) AS count_all, created_at::date AS created_at_date FROM "users" GROUP BY created_at::date
 => {Sat, 27 Feb 2021=>5865

于 2021-05-21T12:53:25.500 回答