Количество записей, созданных в тот же день - PullRequest
3 голосов
/ 27 февраля 2012

Я пытаюсь создать массив, который должен выглядеть примерно так:

[ [created_at date * 1000, count record for that date],
  [created_at date * 1000, count record for that date], 
  [created_at date * 1000, count record for that date] ]

Дата create_at не совпадает из-за минут, часов и секунд.Я подумал, возможно ли изменить время создания на момент создания на 00:00:00

Я пытался с этим,

@kliks = Klik.all.map{|klik| [(klik.created_at.to_i * 1000), 1]}

Но я не могу вычислить, чтобы суммировать те записи, которые были созданытот же день.Также этот цикл создает массив для каждой записи, я не хочу дубликатов суммы.

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Rails имеет ActiveRecord :: Calculations , которая предназначена именно для такого рода вещей на уровне базы данных.Вы должны использовать это.В этом случае count - это нужный метод:

@kliks = Klik.count( :group => "DATE( created_at )" )

Это эквивалентно следующему SQL:

SELECT *, COUNT(*) FROM kliks
GROUP BY DATE( created_at )

Функция DATE() - MySQL изменяет дату и время (как created_at, например, 2012-02-27 10:08:59) до простой даты (например, 2012-02-27).Нет необходимости конвертировать вещи в целые числа или умножать минуты и секунды, и нет необходимости использовать map или любой другой метод в Ruby.

3 голосов
/ 27 февраля 2012

Согласно справочнику , вам следует попробовать

items = Klik.select("date(created_at) as creation_date, count(*) as count").group("date(creation_date)")
result = items.map { |k| [ k['creation_date'], k['count'] ] }
1 голос
/ 27 февраля 2012

Следующие результаты приведут к запрашиваемому вами результату:

Klik.all.group_by do |k|
  k.created_at.beginning_of_day
end.map do |date, records|
  [date, records.length]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...