我想找到Ticket.open的平均年龄。已打开是我的票证模型的作用域。 对于一张票,这将返回不错的结果。
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
我知道这段代码很糟糕,但这是我尽最大努力解释我要寻找的内容。
答案 0 :(得分:3)
如果使用PostgreSQL,则可以在单个SQL查询中获取平均created_at
时间:
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以来的秒数。可以在聚合函数中使用它,例如average
我确定MySQL也允许此类查询。
答案 1 :(得分:1)
我相信您可以通过将时间转换为整数并计算平均值来实现。粗略地说:
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)
希望有帮助-让我知道您的生活。