按日期循环变量分组

我有一些运动成绩,我想循环,并在表格中的日期分组。 例如;

|Sat, 20| |Game 1 Results| |Game 2 Results| |Sun, 21| |Game 3 Results| |Sat, 27| |Game 4 Results| 

我的控制器

 @matches = Match.group([:matchId, 'DATE(matchDate)']).inject([]) do |results, matches| team_names = Match.where(matchId: matches.matchId) results << [matches.id, matches.matchDate, team_names.first.team.name, team_names.last.team.name, team_names.first.points, team_names.last.points] end 

目前我正在做一个基本循环,正在显示。

 |Sat, 20| |Game 1 Results| |Sat, 20| |Game 2 Results| |Sun, 21| |Game 3 Results| |Sat, 27| |Game 4 Results| 

SQL GROUP BY用于聚合值:您可以获取每个日期的匹配数或目标总和,依此类推。 ( 在这里阅读更多内容。 )但是如果你想要一组所有游戏的列表,那就不太合适了。

您将看到相同的日期两次,因为您按日期匹配ID进行分组。

如果您没有大量数据,可以在Ruby代码中完成所有操作:

 Match.all.group_by { |match| match.matchDate.to_date } 

这将为您提供一个哈希,其中日期为键,匹配列表为值。

这个答案假设matchDate是一个时间,因为你在你的例子中使用了DATE(matchDate) 。 如果它已经是日期,则不需要上面的.to_date位。

另请注意,SQL中的DATE(a_time_column)将提取数据库时区中的日期。 Rails通常将数据库配置为在内部使用UTC时区。 因此,如果您确实使用这样的数据库查询,请注意这一点并确保获得正确的日期。

问题是您要将matchId添加到group子句中。 另一种选择是查找所有不同的日期并迭代它们以显示您的表格。 我假设matchDate是一个Datetime,如果不是,它可能更干净。

 distinct_dates = Match.pluck('DATE(matchDate)').uniq.compact distinct_dates.each do |date| date = DateTime.parse(date_string) roles = Role.where( :created_at => (date)..(date + 1.day) ) p date p roles.map(&:matchId) end