2010-02-20 9 views
9

Sto refactoring un'applicazione di registrazione degli eventi basata su Rails che ha un processo di checkout che colpisce diversi modelli di ActiveRecord. Idealmente, gli oggetti non dovrebbero essere salvati a meno che il checkout non sia completato (il pagamento è stato elaborato correttamente). Non sono del tutto sicuro del motivo per cui sarebbe una brutta cosa serializzare questi oggetti nella sessione temporaneamente, ma ho letto più e più volte che il suo cattivo mojo. Almeno non c'è il rischio di uscire dalla sincronizzazione con i record esistenti, in quanto non ci saranno record esistenti.Come/dove memorizzare temporaneamente gli oggetti ActiveRecord se non in sessione?

Le mie domande sono:

A) E 'ancora problematico record memorizzare nella sessione, anche se non esistono altrove? Anche se modifico un modello, non posso uccidere tutte le sessioni esistenti?

B) Se può causare problemi, come devo memorizzare temporaneamente oggetti? Devo salvarli e utilizzare un flag booleano per indicare lo stato permanente rispetto a quello temporaneo? Quindi cron uno script per eliminare gli oggetti temporanei stantii?

Pensieri?

risposta

5

Perché non li si archivia nel database, ma in un certo senso si sa che sono "incompleti"?

Ad esempio, è possibile aggiungere un campo datetime added_to_cart_at. Quando il prodotto viene aggiunto al carrello, si salva il record e si imposta il valore per quel campo. Quindi, se l'utente completa l'acquisto, si cancella il campo e si associa il prodotto a un ordine.

Per cancellare la registrazione obsoleta, è possibile impostare un cron giornaliero per eliminare tutti i record in cui added_to_cart_at è precedente a 1.day.ago.

+0

Penso che questa sia la strada da percorrere. Concettualmente, ha senso usare il modello. I dati temporanei, non ancora validi, non dovrebbero essere nel database, giusto? In pratica, però, posso vedere che non ha senso e che questo tipo di soluzione sarà più robusto. Grazie per il tuo contributo. – tacomachine

1

Il problema di archiviarli nella sessione è che la sessione ha uno spazio limitato. Gli oggetti ActiveRecord comportano un sovraccarico in termini di spazio quando vengono archiviati nella sessione. Se stai archiviando record con has_many densamente popolate, ti troverai nei guai.

Credo che la descrizione di Simone Carletti relativa alla memorizzazione di record parziali nel database sia la soluzione migliore.

Tuttavia, se si desidera archiviare oggetti nella sessione, memorizzare la quantità minima di informazioni possibile. Ad esempio, solo ID e campi aggiornati. Inoltre, memorizza le informazioni come hash, invece di memorizzare direttamente l'oggetto nella sessione.

+0

Sì, penso che questa sia la strada da percorrere se devi usare la sessione. Ciò che avevo anche considerato era quello di memorizzare i record parziali nel database, ma solo associarli all'utente tramite la sessione utilizzando un hash relativo al rispettivo user_id all'ID del record parziale. Credo che funzionerebbe, ma si basa inutilmente sulla sessione. La soluzione di Simone dovrebbe fare la stessa cosa, ma meglio. – tacomachine

Problemi correlati