使用Rails,如何查询数据库以获取总数并按周分组?

给出一个像这样的表格:

日志:

id, user_id, points, created_at 

使用Rails,我如何通过user_id查询数据库,然后通过created_at逐周查询GROUPED,然后我可以使用以下内容:

  WEEK of X/XX/XXXX - 3011 total points WEEK of X/XX/XXXX - 320 total points WEEK of X/XX/XXXX - 31 total points WEEK of X/XX/XXXX - 30330 total points 

谢谢

 points_by_week = Log.where(user_id: user_id).group("DATE_TRUNC('year', created_at)", "DATE_TRUNC('week', created_at)").sum(:points) 

会产生像这样的结果

 {[2014, 4]=>3, [2014, 8]=>7, [2015, 4]=>26, [2015, 6]=>19, [2015, 12]=>50, [2015, 32]=>48, [2016, 2]=>78, [2016, 3]=>45, [2016, 4]=>49, [2016, 5]=>110, [2016, 45]=>30, [2017, 4]=>130, [2017, 11]=>185} 

密钥是[年,周],那么你可以使用Date.commercial来获得周

 points_by_week.each do |(year, week), count| date = Date.commercial(year, week) puts "Week of #{date.strftime('%d/%m/%Y')} - #{count} total points" end 

并且(因为我可以),查询的mysql版本看起来像这样

 points_by_week = Log.where(user_id: user_id).group("year(created_at)", "week(created_at)").sum(:points) 

默认情况下,假设星期一开始,一年的第一周从一年的第一个星期一开始

就像是:

 points_by_week = Log.select("DATE_TRUNC('week', created_at) as week, sum(points) as total_points").group("week").where(user_id: x) points_by_week.each do |pw| puts "Week of #{pw.week.strftime('%d/%m/%Y')} - #{pw.total_points} total points" end 

编辑

根据Michael Gorman的评论,上述内容不会区分年份(2017年,2016年等),因此您可能需要根据您的要求按周和年分组:

 Log.select("DATE_TRUNC('week', created_at) as week, DATE_TRUNC('year', created_at) as year, sum(points) as total_points").group("week, year") 

你可以继续使用上面的循环来显示它;)

像这样的东西:

 select 'WEEK of ' || TO_CHAR(date_trunc( 'week', created_at ), 'dd/mm/yyyy') || ' - ' || sum(points) || ' total points' FROM clients WHERE id < 100000 GROUP BY date_trunc( 'week', created_at ); 

|| 用于连接字符串。

TO_CHAR用作数据类型格式化函数。