按创建日期的日期跟踪组记录

时间:2012-09-30 00:46:15

标签: ruby-on-rails

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

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

除此之外,如果我希望将上述排列应用于从此模型中检索到的所有记录,我应该怎么做?

2 个答案:

答案 0 :(得分:7)

ActiveRecord group方法可以满足您的需求。在您的情况下,问题将是使用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选择正确的转换语法。

答案 1 :(得分: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