我的产品模型中有以下内容。
def grouped_created_at
@created_ats = @products.group_by { |c| c.created_at }
end
工作正常,但我只想按日期分组。由于这是一个时间戳,我没有得到我需要的结果。谁能建议如何修改它?
非常感谢!
我的产品模型中有以下内容。
def grouped_created_at
@created_ats = @products.group_by { |c| c.created_at }
end
工作正常,但我只想按日期分组。由于这是一个时间戳,我没有得到我需要的结果。谁能建议如何修改它?
非常感谢!
def grouped_created_at
@created_ats = @products.group_by { |c| c.created_at.to_date }
end
我已经花了大约一天的时间,所以我希望这篇文章对某人有所帮助。我试图计算过去 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.zone
gem 的设置(例如:'America/New_York')。
希望这可以帮助某人。postgres 组的这个答案对我也很有帮助。
对于登陆此页面的我的朋友 - 替代解决方案
基于您使用的数据库
对于 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}