2017-02-06 2 views
1

У меня есть модель CardioExercise с атрибутом продолжительности (Ruby 2.2.4 Time type). Мне нужно написать метод для вычисления общей продолжительности аэробной деятельности участником в течение прошлой недели.Ruby: Как суммировать массив объектов Time?

Вот что у меня до сих пор:

def minutes_cardio_exercise_last_week 
    array = @user.member.cardio_exercises.between_times(1.week.ago.beginning_of_week,   1.week.ago.end_of_week).map { |d| d[:duration] } 
    hour, min, sec = ?? 
    (hour * 60 + min + sec/60).round 
end 

В консоли Rails, массив содержит:

=> [2000-01-01 00:25:00 UTC, 2000-01-01 00:30:00 UTC, 2000-01-01 00:53:20 UTC] 

Те временные объекты, я ожидал, но я могу» t выяснить, как суммировать значения, чтобы получить что-то вроде 108 минут аэробной активности на прошлой неделе?

Во время моего исследования я нашел два сообщения, которые затрагивают проблему с помощью PHP. Третья позиция - Ruby, но я не могу понять, как адаптировать решение для моей цели.
How to Sum Time Value in Array | How to sum time in array? | Ruby: Average array of times

Я ценю любую помощь и понимание.

+0

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

ответ

2
array.inject(0) { |sum, t| sum + ((t.hour * 60 + t.min + t.sec/60).round) } 

или даже лучше, если у вас есть функция для получения минут.

def minutes(t) 
    (t.hour * 60 + t.min + t.sec/60).round 
end 

def minutes_cardio_exercise_last_week 
    array = @user.member.cardio_exercises.between_times(1.week.ago.beginning_of_week,   1.week.ago.end_of_week).map { |d| d[:duration] } 
    array.inject(0) { |sum, t| sum + minutes(t) } 
end 
+0

Спасибо @Manikandan. Это сделал трюк! Я исследовал метод инъекций, но не понял, как его использовать. Я прочитаю документы этого метода, чтобы лучше понять. – codeinspired

Смежные вопросы