仅按日期对created_at进行分组?

时间:2012-10-20 12:41:52

标签: ruby-on-rails-3 activerecord

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

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

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

非常感谢!

3 个答案:

答案 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}