Sumowanie danych z bazy

Witam w jaki sposób najlepiej wykonać sumowanie danych z bazy?
Tzn. Mam bazę w której znajduję się komórka Price chciałby na końcu wyświetlić sumę wszystkich “postów” które mają wartośc price.
Czy należy dopisac kod na końcu w szablonie index ?

Mam tabele klients gdzie mam komórkę price.
w Kontrolerze klients_controller.rb
Dopisałem

def self.sumuj sum('price') end
w modelu klients.rb

@wynik = Klients.sumuj

W widoku
<%= @wynik %>
Ale jest jakiś problem

Error message:
uninitialized constant Klient::Klients

Post.sum( :price )

najzgrabniejszy znany mi sposób:

@posts.inject(0){|sum, post| sum+= post.price }

gdzie posts to pobrane wszystkie “posty”

Trochę pozmieniałem
w kontrolerze wpisałem coś takiego:

@wynik = Klient.sum('price')

No i widoku

<%= @wynik %>

Ale nic nie wyświetla :frowning:

[quote=krzyzak]najzgrabniejszy znany mi sposób:

@posts.inject(0){|sum, post| sum+= post.price }

gdzie posts to pobrane wszystkie “posty”[/quote]
Brzydkie :stuck_out_tongue: Jak już w pamięci sumować, to tak:

@posts.sum( &:price )

[quote=qertoip][quote=krzyzak]najzgrabniejszy znany mi sposób:

@posts.inject(0){|sum, post| sum+= post.price }

gdzie posts to pobrane wszystkie “posty”[/quote]
Brzydkie :stuck_out_tongue: Jak już w pamięci sumować, to tak:

@posts.sum( &:price )


TheSingularity.pl - łobuz bloguje o technologii[/quote]
W widoku wpisałem coś takiego:

<%=h @klients.sum( &:price ) %>

Niestety nie dodaje liczb, tylko np jak mam 100 i następna ma wartość 26 to ten kod daje wynik 10026

bo to stringi a nie liczby, zrzutuj to na INT przed dodaniem.

[quote]Brzydkie Jak już w pamięci sumować, to tak:
Kod: ruby
@posts.sum( &:price )

–[/quote]
…tak to jest, jak odłączy mi się kawałek mózgu - faktycznie, Twoje rozwiązanie jest o wiele lepsze :wink:

Niestety nie wiem jak to zrobić. Chciałem rozwiązać problem analogicznie jak w poście http://rubyonrails.pl/forum/p10214-2009-05-11-19:55:25 ale niestety nic nie wyświetla.
Mam tabele klients
W niej mam komórkę price

W kontrolerze klients_controller.rb dałem

@wynik = Klient.sum('price')

W widoku

<%= @wynik %>

Dlaczego nic nie jest wyświetlane?

[quote=qertoip][quote=krzyzak]najzgrabniejszy znany mi sposób:

@posts.inject(0){|sum, post| sum+= post.price }

gdzie posts to pobrane wszystkie “posty”[/quote]
Brzydkie :stuck_out_tongue: Jak już w pamięci sumować, to tak:

@posts.sum( &:price )


TheSingularity.pl - łobuz bloguje o technologii[/quote]
mozna tez tak

@post.map(&:price).inject(:+)

lol :wink:

[quote=nikos]W widoku

<%= @wynik %>

Dlaczego nic nie jest wyświetlane?[/quote]
Może zmień na @wynik.inspect i sprawdź co tak naprawdę jest zwracane. Bo koledzy jak widzę bawią się w Ruby Most Obfuscated Code Contest :stuck_out_tongue:

[quote=katafrakt][quote=nikos]W widoku

<%= @wynik %>

Dlaczego nic nie jest wyświetlane?[/quote]
Może zmień na @wynik.inspect i sprawdź co tak naprawdę jest zwracane. Bo koledzy jak widzę bawią się w Ruby Most Obfuscated Code Contest :P[/quote]
Po tym co radziłeś wyświetla: nil

rzutowanie na INT robisz przez .to_i

dodać stringi jako int możesz tak:

[code=ruby]=> [“1”, “2”, “3”]

a.inject(0){|sum, post| sum+= post.to_i }
=> 6

[/code]
Ja lubię co się da na bazę pchać. Tak więc możesz dać jak chcesz

Post.all(:select => “SUM(price) AS razem”)

Coś takiego powinno być ok, wtedy masz dodatkowe pole razem z sumą i tyle

[quote=gotar]rzutowanie na INT robisz przez .to_i

dodać stringi jako int możesz tak:

[code=ruby]=> [“1”, “2”, “3”]

a.inject(0){|sum, post| sum+= post.to_i }
=> 6

[/code]
Ja lubię co się da na bazę pchać. Tak więc możesz dać jak chcesz

Post.all(:select => “SUM(price) AS razem”)

Coś takiego powinno być ok, wtedy masz dodatkowe pole razem z sumą i tyle[/quote]
W AR Model.sum(‘column’) przetlumaczy sie dokladnie na SELECT SUM(column).

No to strzelam, że kolumna w bazie danych nie jest typu numerycznego.

Tak było zmieniłem w bazie typ danych w kolumnie price na int(255) i dalej wyświetla nil

Tak czy siak powinno coś się pojawiać. Prześledź to w konsoli:

coś w stylu

Model.all{ |a| puts a.price }

I tak dalej, bo to co piszesz nie ma sens. Miało jak napisałeś że ze 100 i 22 dało ci 10022 ja kto był string, ale nil nie ma sensu.

[quote=gotar]Tak czy siak powinno coś się pojawiać. Prześledź to w konsoli:

coś w stylu

Model.all{ |a| puts a.price }

I tak dalej, bo to co piszesz nie ma sens. Miało jak napisałeś że ze 100 i 22 dało ci 10022 ja kto był string, ale nil nie ma sensu.[/quote]
Trochę zamieszałem bo piszę o dwóch rozwiązaniach.

  1. Kod w pliku widoku:
<%=h @klients.sum( &:price ) %> 

Dzięki Waszej pomocy (zmiana typu danych na int w bazie) kod wyświetla sumę danych z komórki price.

  1. Wykorzystanie kontrolera

W kontrolerze klients_controller.rb dałem

@wynik = Klient.sum('price')
W widoku

<%= @wynik %>
Pierwsze rozwiązanie działa jeśli ktoś wie w jaki sposób wykorzystać do tego, model, kontroler, widok bardzo proszę o podpowiedź pozdrawiam i dziękuję

[quote=nikos]Tak czy siak powinno coś się pojawiać. Prześledź to w konsoli:

Pierwsze rozwiązanie działa jeśli ktoś wie w jaki sposób wykorzystać do tego, model, kontroler, widok bardzo proszę o podpowiedź pozdrawiam i dziękuję[/quote]
???

Jak działa to o co teraz chodzi?

Chodzi o drugi sposób rozwiązania tego problemu który pomoże w przyszłości korzystać z MVC