我的产品型号中有以下内容。
def grouped_created_at
@created_ats = @products.group_by { |c| c.created_at }
end
工作正常,但我想按日期分组。由于这是一个时间戳,我没有得到我需要的结果。任何人都可以建议如何修改它?
非常感谢!
答案 0 :(得分:13)
def grouped_created_at
@created_ats = @products.group_by { |c| c.created_at.to_date }
end
答案 1 :(得分: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日)创建的,而不是&#34;今天&#34; (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
。第一个确认我们的时间戳是UTC,第二个将时间戳转换为gem设置的Time.zone
(例如:&#39; America / New_York&#39;)。
希望这有助于某人。 This answer on the postgres group对我来说也是超级帮助。
答案 2 :(得分:-2)
为我的国家登陆本页 - 替代解决方案
根据您使用的数据库
对于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}