Zliczanie czasu

mam takie coś:

<% @gos.each do |go| %> <%=h (go.finish - go.start)/3600 %> <% end %>
, pola w bazie są jako datetime

i chce z tego zliczyć godziny, które wychodza z różnicy i nie wiem jak. Próbowałem z count i sum. Co najwyżej to policzyło ilość rekordów, ale sumy nie udało się. Da się jakoś to uczynić, żeby pokazało to jako sumę godzin które powstają z tej różnicy z wprowadzonych rekordów ?

Chyba że wynik musi być zapisany do bazy i dopiero wtedy ?

jak masz to w bazie to zlicz to w bazie. Kazda baza danych ma zaawansowany mechanizm obslugi czasu.

a tak poza tym to:
http://www.ruby-doc.org/core/classes/DateTime.html
http://www.ruby-doc.org/core/classes/Time.html

wynik tej różnicy nie jest zapisywany w bazie, a to właśnie chce sumować :frowning: te linki mi niestety nie pomagają (już zawartość ich oglądałem wcześniej),

zakładam że z
jednego rekordu (go.finish - go.start)/3600 wyjdzie 2
z drugiego 5
itd.

, ale jak to na końcu posumować do nie mam pojęcia i nie wiem jak mi baza jako taka może w tym pomóc. Raczej to bardziej ruby chyba może się nadać.

@sum = @gos.sum(0) { |go| (go.finish - go.start)/3600) }

albo w modelu zdefiniować:

def duration (finish - start) / 3600 end
a później tylko:

@gos.sum(&:duration)

tylko przy dużej ilości rekordów jest to niewydajne

@sevos, Serdeczne dzięki

Jeżeli chciałbyś, żeby jednak baza liczyła tą różnicę to możesz zrobić tak:

@gos = Go.find :all, :select => 'id, ((finish - start) / 3600) AS time'

Teraz każdy rekord będzie dodatkowo zawierał atrybut time z wynikiem danej operacji. Oczywiście wyrażenie (finish - start) / 3600 nie liczy poprawnie roznicy między datami, więc musiałbyś to sobie już jakoś wykombinować.

Wyświetlanie by było tak:

<% @gos.each do |go| %> <%=h go.time %> <% end %>
A liczenie sumy wszystkich:

@sum = @gos.sum(0) { |go| go.time.to_i }

Czy wtedy

@gos.sum(:time)

nie sprawi, że baza policzy też sumę?

[quote=sevos]Czy wtedy

@gos.sum(:time)

nie sprawi, że baza policzy też sumę?[/quote]
Ten kod odpala metodę sum na tablicy, więc to Ruby już liczy, ale można podać do metody Go.sum podać to samo wyrażenie co w find i wtedy baza policzy sumę.

Go.sum('(finish - start) / 3600')