所以我有一个模型,我想检索记录并按created_at字段的日期对它们进行分组。但created_at是一个日期时间字段,我只对日期部分感兴趣。所以我正在寻找类似2D数组的东西,第一层是以日期字符串为键的哈希,第二层是带记录的数组。我该怎么办?
{ "9/28/2012" => [record, record, record], "9/29/2012" => [record, record, record], "9/30/2012" => [record, record, record] }
除此之外,如果我希望将上述排列应用于从此模型中检索到的所有记录,我应该怎么做?
答案 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