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.
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.
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
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
Spero di averti aiutato a comprendere meglio
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…
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
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.
Questo problema mi ha fatto sorgere un dubbio che penso meriti un thread
a
parte
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:-)
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.