Valore totale prodotti

Salve a tutti,

sono alle prime armi con ruby e con la programmazione in generale, ho
bisogno del vostro aiuto per capire una cosa che in teoria mi sembra
semplice, ma non riesco a risolverla…

Ho un partial che mi da tutte le informazioni che mi servono del
prodotto, creato un metodo nella classe prodotto che mi moltiplica la
quantità * prezzo, quindi prezzo totale del prodotto, ma non ad avere il
valore del prezzo totale dei prodotti.
Spero di aver posto la domanda nel modo giusto.

dove sbaglio?

Grazie

Immagino tu sia in una pagina che elenca un numero di prodotti e ti
serve una somma a fine pagina.
Se il recordset impaginato devi fare una query a parte per ottenere la
somma.
Se il recordset non impaginato te la puoi cavare con un ciclo
sull’array.

-f

2015-01-23 15:02 GMT+01:00 Michele M. [email protected]:

Ciao Michele,
potresti postare del codice? Messa come lhai scritta non si capisce
abbastanza :slight_smile:

Grazie Fabrizio e Sante per aver risposto così velocemente e scusate se
non ho fatto lo stesso…

Ho fatto diverse prove cercando in rete ma non sono riuscito ad ottenere
il risultato voluto…

Comunque ho allegato il codice spero di aver fatto bene…

Complimenti Sante per il tuo corso con Poulpolimi su youtube.

Michele

Ciao Michele, grazie per i complimenti :slight_smile:

Se ho ben inteso la tua richiesta, quello che tu vorresti avere
la somma, su tutti i prodotti, di quello a cui ti riferisci come
prezzo totale del prodotto, ossia "quantit * prezzo

Tu hai creato un metodo prezzo_totale che calcola questo valore,
quello che ti serve adesso fare la somma del valore di prezzo_totale
per ogni prodotto. A scopo didattico, immaginiamo di creare un metodo
nella classe Prodotto che faccia quanto sopra:

class Prodotto < ActiveRecord::Base

def self.prezzo_totale_prodotti
totale = 0
Prodotto.all.each do |prodotto|
totale = totale + prodotto.prezzo_totale
end
totale
end

end

Nota che questa implementazione proprio super base, non
ottimizzata n tantomeno elegante. Lho scritta cos proprio
perch voglio che sia chiaro ad un novizio il senso di ogni
istruzione. Lunica cosa che devi assolutamente notare
che ho definito prezzo_totale_prodotti come metodo di classe
e non di istanza, perch da quello che ho potuto capire cos
che tu intendi il valore che non riesci a calcolare, e questo
un modo brutto ma tutto sommato corretto di ottenerlo.

Ho notato che hai definito un metodo prods allinterno della classe
Prodotto, che fa la somma della colonna prezzo su tutti i prodotti.
Questo valore poi lo stampi relativamente ad ogni prodotto, ma
evidentemente verr lo stesso valore per tutti, per come implementato.

Ti torna?

Mi sento di consigliarti anche di utilizzare linglese per scegliere i
nomi delle
classi, e dei metodi. Un nome di metodo con una accentata allinterno
contro le linee guida comunemente accettate per la scrittura di codice
:wink:

Spero di averti aiutato a comprendere meglio :slight_smile:

Sante

Sante Gennaro R. wrote in post #1167139:

Ciao Michele, grazie per i complimenti :slight_smile:

Se ho ben inteso la tua richiesta, quello che tu vorresti avere
la somma, su tutti i prodotti, di quello a cui ti riferisci come
prezzo totale del prodotto, ossia "quantit * prezzo

Tu hai creato un metodo prezzo_totale che calcola questo valore,
quello che ti serve adesso fare la somma del valore di prezzo_totale
per ogni prodotto. A scopo didattico, immaginiamo di creare un metodo
nella classe Prodotto che faccia quanto sopra:

class Prodotto < ActiveRecord::Base

def self.prezzo_totale_prodotti
totale = 0
Prodotto.all.each do |prodotto|
totale = totale + prodotto.prezzo_totale
end
totale
end

end

Nota che questa implementazione proprio super base, non
ottimizzata n tantomeno elegante. Lho scritta cos proprio
perch voglio che sia chiaro ad un novizio il senso di ogni
istruzione. Lunica cosa che devi assolutamente notare
che ho definito prezzo_totale_prodotti come metodo di classe
e non di istanza, perch da quello che ho potuto capire cos
che tu intendi il valore che non riesci a calcolare, e questo
un modo brutto ma tutto sommato corretto di ottenerlo.

Ho notato che hai definito un metodo prods allinterno della classe
Prodotto, che fa la somma della colonna prezzo su tutti i prodotti.
Questo valore poi lo stampi relativamente ad ogni prodotto, ma
evidentemente verr lo stesso valore per tutti, per come implementato.

Ti torna?

Mi sento di consigliarti anche di utilizzare linglese per scegliere i
nomi delle
classi, e dei metodi. Un nome di metodo con una accentata allinterno
contro le linee guida comunemente accettate per la scrittura di codice
:wink:

Spero di averti aiutato a comprendere meglio :slight_smile:

Sante
Grazie mille Sante…

sicuramente mi interessa prima di tutto capire come funziona, poi
penserò a come rendere il codice più elegante.
Ora farò delle prove provando a modificare il tutto secondo i tuoi
consigli…

Di nuovo grazie
Michele

Ciao Michele,

penso che Fabrizio abbia interpretato correttamente la tua necessità, ma
sicuramente il codice ha fugato ogni dubbio :slight_smile:

TI consiglio di:

  1. Rimuovere il metodo d’istanza Prodotto#prods in prodotto.rb

def prods
prods = Prodotto.sum(:prezzo)
end

  1. Aggiungere il metodo di classe Prodotto.somma_dei_prezzi_totali in
    prodotto.rb

def self.somma_dei_prezzi_totali
sum(‘quantità * prezzo’)
end

  1. Aggiungere in index.html.erb il frammento ERB che ti stampa il totale
    dei prezzi totali:

<%= @prodotti.somma_dei_prezzi_totali %>

Infine, a scopo didattico, prova ad aprire la console (rails console) e
vedi l’SQL generato dallo scope
http://guides.rubyonrails.org/active_record_querying.html#scopes che
abbiamo creato prima:

puts Prodotto.somma_dei_prezzi_totali.to_sql

Questo problema mi ha fatto sorgere un dubbio che penso meriti un thread
a
parte :slight_smile:

2015-01-24 0:25 GMT+01:00 Michele M. [email protected]:

def prods
3) Aggiungere in index.html.erb il frammento ERB che ti stampa il totale

diverso?

Scorgo un po’ di confusione, ma anche questo è il bello di quando si
inizia, c’è tanto da imparare :slight_smile:

Il metodo proposto da Sante e il mio dovrebbero fornire lo stesso
risultato.
Lui ha proposto un metodo di classe dal nome “prezzo_totale_prodotti”
mentre io l’ho chiamato “somma_dei_prezzi_totali”.
Nel metodo di Sante, vengono effettuate molte operazioni Ruby che a loro
volta effettuano operazioni SQL. Lo scopo di questa versione è
prettamente
didattico, in quanto ti permette di capire, ad alto livello, che tipo di
operazioni sono necessarie per ottenere il risultato.
Nel mio metodo, avviene una sola operazione che accorpa direttamente a
livello di SQL l’algoritmo, relativamente più prolisso, di prima.
Per capire cosa avviene in entrambi i casi, apri la console di rails in
un
terminale

$ rails console

e in un altro tieni aperto il file di log

$ tail -f log/development.log

All’interno della sessione console, prova ad eseguire le operazioni con
gli
oggetti e le classi che gestisci e vedi nella sessione di log quali
chiamate SQL vengono generate.

Un’amena lettura preliminare
http://dev.mikamai.com/post/108536863609/ruby-and-self.

Poi fatti una scorpacciata di http://guides.rubyonrails.org/ :wink:

Soprattutto il capitolo sulle query Active Record
http://guides.rubyonrails.org/active_record_querying.html prestando
particolare attenzione sezioni Scopes
http://guides.rubyonrails.org/active_record_querying.html#scopes e
Calculations
http://guides.rubyonrails.org/active_record_querying.html#calculations.

have fun

Maurizio De magnis wrote in post #1167142:

Ciao Michele,

penso che Fabrizio abbia interpretato correttamente la tua necessità, ma
sicuramente il codice ha fugato ogni dubbio :slight_smile:

TI consiglio di:

  1. Rimuovere il metodo d’istanza Prodotto#prods in prodotto.rb

def prods
prods = Prodotto.sum(:prezzo)
end

  1. Aggiungere il metodo di classe Prodotto.somma_dei_prezzi_totali in
    prodotto.rb

def self.somma_dei_prezzi_totali
sum(‘quantità * prezzo’)
end

  1. Aggiungere in index.html.erb il frammento ERB che ti stampa il totale
    dei prezzi totali:

<%= @prodotti.somma_dei_prezzi_totali %>

Infine, a scopo didattico, prova ad aprire la console (rails console) e
vedi l’SQL generato dallo scope
http://guides.rubyonrails.org/active_record_querying.html#scopes che
abbiamo creato prima:

puts Prodotto.somma_dei_prezzi_totali.to_sql

Questo problema mi ha fatto sorgere un dubbio che penso meriti un thread
a
parte :slight_smile:
Ciao Maurizio, ho fatto le modifiche che mi hai suggerito ed è proprio
quello che mi serviva, e inoltre è servito a farmi capire anche altro, e
giusto per capire ancora meglio, mi diresti se possibile la differenza
con la soluzione di Sante? per quello che ho capito con la prima
soluzione chiamo un ciclo che mi stampa per ogni prodotto lo stesso
totale, nel tuo caso invece ottengo solo una stampa con il valore
totale, e solo un modo diverso per ottenere la stessa cosa in modo
diverso?
Grazie per le dritte:-)