Gestione di un carrello spesa

Salve a tutti,

Stò implementando un carrello spesa in un’applicazione rails.
Tutto procede bene fin quando non accade che l’utente abbandoni la
sessione
senza svuotare manualmente il carrello.

In alcuni controller ho un filtro così impostato:

before_filter :get_cart, :except => :empty_cart

Dove get_cart è definito come:

def get_cart
if session[:cart]
@cart = Cart.find(session[:cart])
else
if logged_in?
@cart = Cart.new
@cart.user = current_user
@cart.save!
session[:cart] = @cart.id
else
@cart = nil
end
end
end

Il metodo get_cart fissa il record nel database che rimane lì finchè
l’utente non procede al checkout o allo svuotamento del carrello.

Al momento non mi viene in mente nulla per far sì che, alla chiusura del
browser ad esempio, venga eliminato il carrello dell’utente posto che
questo sia vuoto.

Voi come fareste? Ci vorrebbe qualcosa che facesse da garbage collector
per
i carrelli rimasti orfani…

Grazie in anticipo.

On 5/3/07, Carmine M. [email protected] wrote:

Voi come fareste? Ci vorrebbe qualcosa che facesse da garbage collector

per
i carrelli rimasti orfani…

Secondo me i carrelli con i prodotti dovrebbero rimanere in sessione e
non
nel db, e tu dovresti registrare nel db solo gli ordini effettuati. In
questo modo daresti la possibilità all’utente di ritrovare i prodotti
selezionati anche diversi giorni prima, sia nel caso di utente loggato
che
di utente sconosciuto, il che è piuttosto comodo.

Dai un’occhiata al “Depot Application” su Agile Web D. with
Rails.

Ciao,
Tommaso

Ciao Tommaso,

Tommaso P. wrote:

Secondo me i carrelli con i prodotti dovrebbero rimanere in sessione e
non
nel db, e tu dovresti registrare nel db solo gli ordini effettuati. In
questo modo daresti la possibilit� all’utente di ritrovare i prodotti
selezionati anche diversi giorni prima, sia nel caso di utente loggato
che
di utente sconosciuto, il che � piuttosto comodo.

Dai un’occhiata al “Depot Application” su Agile Web D. with
Rails.
In effetti, quello di Agile Web D. se non ricordo male,
inizialmente butta tutto il modello nella sessione, salvo poi,
utilizzare il solo id dell’istanza del carrello in un secondo momento.
In questo secondo momento, l’istanza viene memorizzata nel DB proprio
come ho fatto io.
Ciò avviene per svariate ragioni tra cui quella che, se memorizzi il
carrello (l’istanza) nella sessione e, successivamente, apporti qualche
modifica al modello del carrello, quelli con le sessioni appese si
troverebbero in difficoltà .
La cosa è documentata anche sullo stesso libro.

Grazie per il tuo aiuto.

Ciao Matteo,

Matteo V. wrote:
[…snip…]

Poi niente ti vieta di eseguire periodicamente uno script che elimina i
carrelli pi� vecchi di tot. L’unica accortezza che ti consiglio � di
scrivere lo script in ruby (e non in sql!) ed eseguirlo con
script/runner.
In questo modo puoi usare i tuoi modelli ActiveRecord, con tutte le loro
validazioni.

Interessante, non conosco “script/runner” ma stasera gli dò un’occhiata.

Grazie 1000!

On 5/4/07, Tommaso P. [email protected] wrote:

questo modo daresti la possibilità all’utente di ritrovare i prodotti
selezionati anche diversi giorni prima, sia nel caso di utente loggato che
di utente sconosciuto, il che è piuttosto comodo.

Per fare in modo che il carrello persista è giusto salvare il carrello nel
db. Guarda come fa Amazon che è il negozio online più popolare del pianeta:
il tuo carrello viene conservato per mesi!

Poi niente ti vieta di eseguire periodicamente uno script che elimina i
carrelli più vecchi di tot. L’unica accortezza che ti consiglio è di
scrivere lo script in ruby (e non in sql!) ed eseguirlo con
script/runner.
In questo modo puoi usare i tuoi modelli ActiveRecord, con tutte le loro
validazioni.

M

Dai un’occhiata al “Depot Application” su Agile Web D. with
Rails.

Ciao,