Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 按日期分组日期并计算行数_Ruby On Rails_Postgresql_Rails Activerecord - Fatal编程技术网

Ruby on rails 按日期分组日期并计算行数

Ruby on rails 按日期分组日期并计算行数,ruby-on-rails,postgresql,rails-activerecord,Ruby On Rails,Postgresql,Rails Activerecord,我有一张日志表。 我想生成一个奇特的图表,在这里我们可以看到每天的日志总数 我想要的输出= 2014-01-05 => 1 2014-01-06 => 6 如果第一个是日期,则总计记录在该日期内 我现在有这个 Log.order('created_at desc').limit(60).group('created_at') 不明白,如果你们能帮我:) 日志示例: #<Log id: 33533, user_id: 94, category: 19, sub_categor

我有一张日志表。 我想生成一个奇特的图表,在这里我们可以看到每天的日志总数

我想要的输出=

2014-01-05 => 1
2014-01-06 => 6
如果第一个是日期,则总计记录在该日期内

我现在有这个

Log.order('created_at desc').limit(60).group('created_at')
不明白,如果你们能帮我:)

日志示例:

#<Log id: 33533, user_id: 94, category: 19, sub_category: 15147, data: {}, created_at: "2014-12-14 11:40:32", updated_at: "2014-12-14 11:40:32">
#

试试这个。这将为您提供过去7天的日志记录哈希。这里的键是日期,值是该日期的日志记录数组。您可以根据需要获取前几天的记录

Log.where('created_at >= ?', 7.day.ago).group_by{|m| m.created_at.day }
您可以通过数组的
count
方法在需要的任何位置获取单个数组的计数。此外,如果您需要钥匙的完整日期,请尝试以下内容

Log.where('created_at >= ?', 7.day.ago).group_by{|m| m.created_at.to_date.strftime("%Y-%m-%d") }
你也可以用gem


希望能有所帮助。

如果您想按日期分组,只需告诉数据库并让它完成以下工作:

Log.group('created_at::date').count
::date
是用于将时间戳转换为日期的PostgreSQL语法。您还可以使用标准SQL转换语法:

Log.group('cast(created_at as date)').count
这应该在UTC中完成所有操作,如果需要不同的时区,则调整GROUP BY子句


您不必按照正确的顺序得到散列,您可以在Ruby中对散列进行排序,如果需要数据库进行排序,也可以使用子查询。

如果该查询返回大量行,会发生什么?为什么你想用Ruby做一些在数据库中做得更好的事情?@muistooshort:你可能是对的。我在某处也有类似的要求,我也需要记录的细节。所以这个解决方案适合我的要求,但也许这里有更好的解决方案。我已经编辑了答案。我怎么才能只获取过去30天的日志呢?添加一个
where
来限制
created\u at
,类似
where('created\u at>:threed\u days',:three\u days=>30.days.ago)
应该可以做到这一点。