2016-10-06 5 views
3

У меня есть некоторые спортивные результаты, которые я хотел бы пропустить и сгруппировать по датам в таблице. Например;Группировка переменных циклов по дате

|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| 

ответ

2

SQL GROUP BY для агрегирования значений: вы можете получить количество матчей на дату, или сумму целей, и так далее. (Read more here.) Но если вам нужен список всех игр в группах, это не очень удобно.

Вы видите ту же дату дважды, потому что вы группируете дату и идентификатор матча.

Если у вас нет много данных, вы могли бы сделать все это в Ruby-коде:

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

Это дает вам хэш с датами в качестве ключей и списков матчей в качестве значений.

Этот ответ предполагает, что matchDate - это время, потому что вы использовали DATE(matchDate) в своем примере. Если это уже дата, вам не нужен бит .to_date.

Также обратите внимание, что DATE(a_time_column) в SQL будет извлекать дату в часовом поясе базы данных. Rails часто имеет базу данных, настроенную на использование внутреннего часового пояса UTC. Поэтому, если вы действительно зайдете с таким запросом базы данных, будьте в курсе этого и убедитесь, что вы получили правильную дату.

+0

Thanks Henrik. У меня есть много данных по всем ассоциациям. – DollarChills

1

Проблема в том, что вы добавляете 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