[ActiveRecord kalkulacja] suma - banalne pytanie

Witam, mam tabele statistic_players, w niej kolumne(pole) time,
teraz chcialbym zliczyc wszystkie time(minuty)

w modelu StatisticPlayer.rb dalem

def sumuj @wynik = StatisticPlayer.sum('time') end
a teraz chcialbym otrzymac wynik w widoku i robie tak

<%= @wynik %>
Nie mam zadnego efektu, a co gorsza nie wyswietla bledu;/

Prosze o pomoc

wydaje mi się, że jeśli już to w modelu powinieneś napisać:

def self.sumuj sum('time') end
a w kontrolerze @wynik = Statisticplayer.sumuj
wtedy w widoku <%= @wynik %>
wyświetli to co potrzebujesz.

ew. od razu w kontrolerze możesz wrzucić @wynik = Statisticplayer.sum('time')
Widok nie zmieni się wtedy.

Dzieki za odpowiedz, ladnie dziala:)
Ale mam pytanie do tego, bo rails’y ogolnie mowi, o tym, aby czesc biznesowa zalatwiac w modelu. Ale patrzac na to wystarczy to zrobic w kontrolerze
i wtedy zawsze to mniej kodu.
Pytanie - która metodyke stosowac? (model, kontroler, widok), czy (kontroler, widok) ?

Thin controller, fat model :wink:

OK rozumiem, ze w modelu.
A pytanie drugie, jak mam wiecej pol do dodania

np time i point
to w modelu moge zrobic tak

[code]def self.sumujTime
sum(‘time’)
end

def self.sumujPoint
sum(‘point’)
end[/code]
a w kontrolerze wywolywac sumujPoint i sumujTime

A nie mozna tego jakos polaczyc(aby 1 metoda liczyla mi odzielnie pkt i time) ?
Bo zaluzmy bede mial 20 pol to model i kontroler mi sie bardzo rozrosnie:)

Najlepiej zrobic tak:

model:

def self.sum(item) sum(item) end
controller:

@result = Statisticplayer.sum('time') @result = Statisticplayer.sum('point')

ciekawe rozwiaznie co do modelu,
w controlerze 2 zmiennej dalbym tylko inna nazwe bo teraz rezultatem = suma time + suma point. (tak mysle)
i teraz wyszlo thin model, fat controller;p

ale dzieki za dobre rady

tusla: eee, z
@wynik = StatisticPlayer.sum(‘time’)
znowu wyszło
@wynik = Statisticplayer.sum(‘time’)
W którym miejscu jest ta oszczędność :P?

witam,
pisze tutaj bo nie bede zasmiecal forum;)

Mam w akcji show

@statisticHome = StatisticPlayer.find(:all, :select => 'statistic_players.*', :from => ['statistic_players, games, players'] , :conditions => ['statistic_players.game_id = games.id AND statistic_players.player_id = players.id AND games.home_team_id = players.team_id AND games.id = ? ', @game.id ])
oraz @statisticAway, teraz w widoku

<% @statisticHome.each do |statistic_player| %> <%= statistic_player.point %></td> <%= statistic_player.time %></td>
to samo dla druzyny przeciwnej, teraz chcialbym zrobic sume np. ‘point’ dla 1 druzyny, a nastepnie dla 2ej.

Jak napisac ta metode w modelu?
przykladowo jakbym dal tak

def self.sumujPoint sum('point') end
a w kontrolerze tak

@point = StatisticPlayer.sumujPoint

to otrzymam sume point dla obydwu druzyn. (jednak to mnie nie interesuje)

najbardziej prymitywne rozwiazanie (tez mi sie nie podoba):

jest takie, ze w widoku daje zmienna @suma = 0, nastepnie
@suma += statistic_player.point, a pozniej moge wywolywac ta @suma.

Ps. wiem musze przeczytac ksiazke z kolofem i bedzie mniej banalnych pytan;)
Z gory dzieki za sugestie.

sumujPoint to ciekawa nazwa dla metody, łączy w sobie prostotę zrozumienia (sumuj vs. sum - przecież nie chodzi o suma - rybę) oraz dobrze brzmiący angielski Point (sumujPunkt brzmiałoby lamersko :wink: Lepiej przeczytaj “Agile”, w książce z kilofem nie znajdziesz odpowiedzi ani wskazówek jak rozwiązać powyższy problem

no tak, ale nazwa metody nie naprawde nie ma znaczenia :wink:
Poza tym, tam jest napisane 'przykladowo jakbym dal def… ’

ps. a moze ktos mi podpowie, jak rozwiazac ten problem;) -> zanim przeczytam ‘Agile’…
ps2. ale jak ktos nie wie, albo chce sobie nabijac tylko ilosc posow (typu przeczytaj Agile = biblia) to niech nawet nie odpowiada;)

dobra mam juz pod 1 pole, teraz optymalizacja(mile widziane wasze wskazowki i rozwiazania;) )

[code]
def self.sumPoints
find(:all, :select => ‘statistic_players.*’, :from => [‘statistic_players, games, players’] ,
:conditions => ['statistic_players.game_id = games.id AND statistic_players.player_id = players.id
AND games.home_team_id = players.team_id AND games.id = ? ', @game.id ])

sum('points')

end[/code]
czy metoda sumPoints dalej brzmi lamersko?

[quote=666bialy666]no tak, ale nazwa metody nie naprawde nie ma znaczenia :wink:
Poza tym, tam jest napisane 'przykladowo jakbym dal def… '[/quote]
Uwierz, naprawdę ma znaczenie.

[quote=666bialy666]ps. a moze ktos mi podpowie, jak rozwiazac ten problem;) -> zanim przeczytam ‘Agile’…
ps2. ale jak ktos nie wie, albo chce sobie nabijac tylko ilosc posow (typu przeczytaj Agile = biblia) to niech nawet nie odpowiada;)[/quote]

@statisticHome.collect(&:time).sum

pozdrawiam

dziekuje