8

我的产品模型中有以下内容。

def grouped_created_at
  @created_ats = @products.group_by { |c| c.created_at }
end

工作正常,但我只想按日期分组。由于这是一个时间戳,我没有得到我需要的结果。谁能建议如何修改它?

非常感谢!

4

3 回答 3

14
def grouped_created_at
  @created_ats = @products.group_by { |c| c.created_at.to_date }
end
于 2012-10-20T13:48:53.963 回答
3

如果您想按客户的时区对记录进行分组,请阅读此内容!

我已经花了大约一天的时间,所以我希望这篇文章对某人有所帮助。我试图计算过去 10 天中每一天的用户活动。够容易吧?这是我尝试过的,但没有奏效:

不工作

Activity.select("user_id", "id", "created_at")
  .where(user_id: @user.id)
  .where("created_at >= ?", DateTime.now.beginning_of_day - 10.days) 
  .group("user_id", "DATE(created_at)") # <- POSTGRES' DATE FUNCTION
  .count("id")

上面的问题是此查询将按 UTC 时间对活动进行分组。例如,在多伦多(UTC - 4 小时),如果我在 4 月 1 日晚上 8 点之后创建一个活动,Postgres 会认为它是在第二天(4 月 2 日)而不是“今天”(4 月 1 日)创建的。这不好,因为我想按用户的时区对这些活动进行分组。

使用方便的browser_timezone_rails gem(使用 javascript 将用户的时区附加到请求),并将我的.group线路切换到这最终是有效的:

在职的

.group("user_id", "DATE(created_at AT TIME ZONE 'UTC' AT TIME ZONE '#{Time.zone.name}')")

您会看到实际上AT TIME ZONE需要两个 s。第一个确认我们的时间戳是 UTC,第二个将时间戳转换为Time.zonegem 的设置(例如:'America/New_York')。

希望这可以帮助某人。postgres 组的这个答案对我也很有帮助。

于 2017-04-03T12:35:12.163 回答
-3

对于登陆此页面的我的朋友 - 替代解决方案

基于您使用的数据库

对于 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")

会结果你

ActiveSupport::OrderedHash喜欢

{Sun, 13 Sep 2015=>2,
 Fri, 11 Sep 2015=>1,
 Tue, 01 Sep 2015=>1,
 Mon, 31 Aug 2015=>2,
 Wed, 26 Aug 2015=>1,
 Tue, 11 Aug 2015=>2,
 Sun, 09 Aug 2015=>2,
 Thu, 30 Jul 2015=>3,
 Tue, 07 Jul 2015=>3,
 Mon, 06 Jul 2015=>1,
 Sun, 05 Jul 2015=>2,
 Thu, 02 Jul 2015=>5}
于 2015-11-24T15:03:35.827 回答