Рассчитать средний возраст предметов в рубине на рельсах - PullRequest
0 голосов
/ 24 октября 2018

Я хочу узнать средний возраст Ticket.opened.Открыта область на моей модели билета.Это возвращает хороший результат для одного билета.

time_ago_in_words(Ticket.last.created_at.to_time)

Я хочу сделать что-то вроде этого

age = []    
Ticket.opened.each do |t|
    age = time_ago_in_words(t.created_at.to_time)+[]
end
average_age = age/Ticket.opened.count

Я знаю, что этот код ужасен, но это мойЛучшая попытка объяснить, что я ищу.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Если вы используете PostgreSQL, вы можете получить среднее created_at время в одном запросе SQL:

avg_created_at = Ticket.opened.average('extract(epoch from tickets.created_at)')
time_ago_in_words(Time.at(avg_created_at))

EXTRACT (EPOCH FROM ...) функция возвращает created_atзначение в виде количества секунд с 1970-01-01 00:00:00 UTC.Это можно использовать в статистической функции, такой как среднее

Я уверен, что MySQL также разрешает такие запросы.

0 голосов
/ 24 октября 2018

Я полагаю, что вы можете получить это, конвертируя время в целые числа и вычисляя среднее.Грубо говоря:

times = [2.days.ago, 3.days.ago, 4.days.ago]
average_ticket_time = Time.at(times.map(&:to_i).sum / times.count) # convert to ints and get average
time_ago = Time.now - average_ticket_time # time ago from now
readable_time_ago = (time_ago / 60 / 60).round # divide by 60 secs then 60 mins; round to get closest hour
# => 72 (hours ago)

Или в одной строке:

((Time.now - (Time.at(times.map(&:to_i).sum / times.count))) / 60 / 60).round

Итак, в среднем 72 часа назад.

Вы также можете разделить на дополнительные 24 чтобы получить время в днях: в этом случае 3 дня, что вы и ожидаете в этом простом примере.

В вашем примере ваш массив times будет выглядеть следующим образом:

times = Ticket.opened.map { |ticket| ticket.created_at.to_i }
# or perhaps the following, check the performace:
times = Ticket.opened.pluck(:created_at).map(&:to_i)

Надеюсь, это поможет - дайте мне знать, как вы поживаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...