¿Cómo mantener las sesiones pequeñas?

A ver si alguien me puede ayudar con una duda. Generalmente se suele
recomendar mantener las sesiones pequeñas, lo cual implica almacenar
exclusivamente ids de objetos en vez de objetos enteros y acceder al
objeto en base de datos.

La duda es como puedo gestionar el caso de una relación de uno a muchos
en la que creo antes los ‘muchos’ que el ‘uno’. Un típico ejemplo sería
un carrito de la compra, no quiero crear un carrito en sesión y añadirle
lineas de producto en sesión. ¿Cómo lo soluciono? Se me ocurren dos
maneras pero ninguna me convence mucho porque todas implican almacenar
datos en base de datos que no sé si voy a poder borrar:

  1. Crear un modelo AR Carrito y otro LineaCarrito y crear un carrito
    para cada sesión y almacenar en sesión únicamente el id del carrito.
    Cuando se haga checkout puedo borrar el carrito, pero si no se hace
    checkout no se borraría.
  2. Hacer el modelo Linea carrito y almacenar en sesion únicamente los
    ids de las lineas que se hayan añadido. El problema es esencialmente el
    mismo.

Estoy seguro de que tiene que haber una forma estándar de solucionarlo.
¿Alguna recomendación?

On Oct 10, 2007, at 5:54 PM, Víctor Martínez garcía wrote:

carrito
para cada sesión y almacenar en sesión únicamente el id del carrito.
Cuando se haga checkout puedo borrar el carrito, pero si no se hace
checkout no se borraría.
2. Hacer el modelo Linea carrito y almacenar en sesion
únicamente los
ids de las lineas que se hayan añadido. El problema es
esencialmente el
mismo.

Podrias explicarlo con los modelos de verdad por favor? Al pensar en
un carrito no se que cosas asumo que apliquen a la situacion real.

Por ejemplo, en el caso del carrito uno crea un carrito vacio, y
añade lineas a ese. Por lo general no es buena idea tener registros
sin padre cuando deberian…

Como es la cosa?

– fxn

Crear el modelo, con instancias en la base de datos, es la forma mas
simple de resolver el problema.

Simplemente asegurate que tu modelo “carrito” (o orden o como lo
prefieras llamar) tenga un campo de “estado” donde indiques que esta
“en proceso de creacion” o que ya esta listo, o que ya fue cancelado,
etc, etc…

Siempre (o bueno, casi) es mas simple atacar al problema guardando
todo de forma persistente, pero con un estado especial, que intentar
mantenerlo en memoria haciendo malabarismos, pues a fin de cuentas
estas usando un framework que no maneja persistencia de estado.

Xavier N. wrote:

On Oct 10, 2007, at 5:54 PM, V�ctor Mart�nez garc�a wrote:

carrito
para cada sesi�n y almacenar en sesi�n �nicamente el id del carrito.
Cuando se haga checkout puedo borrar el carrito, pero si no se hace
checkout no se borrar�a.
2. Hacer el modelo Linea carrito y almacenar en sesion
�nicamente los
ids de las lineas que se hayan a�adido. El problema es
esencialmente el
mismo.

Podrias explicarlo con los modelos de verdad por favor? Al pensar en
un carrito no se que cosas asumo que apliquen a la situacion real.

Por ejemplo, en el caso del carrito uno crea un carrito vacio, y
a�ade lineas a ese. Por lo general no es buena idea tener registros
sin padre cuando deberian…

Como es la cosa?

– fxn

Ok intentaré explicarlo con el ejemplo concreto, lo del carrito era
porque me parecía una simplificación del problema genérico.

Tengo un modelo Producto, un modelo Color, un modelo Talla y un modelo
Stock.

Para cada stock tengo un id de producto, un id de color, un id de talla
y el número de elementos en stock. Es decir sería algo asi como 5
Camisetas rojas de la talla M.

La cosa es que cuando creo un producto, tengo que poder añadir en la
misma pantalla de creación de producto las lineas de stock.

Nuevo Producto:

  • Pantalón
    5 unidades, rojo, M
    10 unidades, rojo L
    5 unidades, verde, M

Lo que no sé como hacer es que esas lineas de stock referencien a un
producto que aún no se ha creado.

Espero que se haya entendido, gracias por la ayuda.

Víctor Martínez García wrote:

La cosa es que cuando creo un producto, tengo que poder añadir en la
misma pantalla de creación de producto las lineas de stock.

Lo que no sé como hacer es que esas lineas de stock referencien a un
producto que aún no se ha creado.

Al margen de las respuestas que has recibido, te recomiendo que revises
estos screencast [1] y [2], en dónde demuestra cómo crear múltiples
modelos a través de un solo form, manteniendo limpio el controlador, ya
en la parte 2 se explica cómo utilizar JavaScript y RJS para agregar y
eliminar form fields dinamicamente.

[1] #73 Complex Forms Part 1 - RailsCasts
[2] #74 Complex Forms Part 2 - RailsCasts

Espero te sirva.

Jaime Mora R.

Siempre (o bueno, casi) es mas simple atacar al problema guardando
todo de forma persistente, pero con un estado especial, que intentar
mantenerlo en memoria haciendo malabarismos, pues a fin de cuentas
estas usando un framework que no maneja persistencia de estado.

Vale pero en ese caso habría que tener algún script que borrara cada
cierto tiempo las órdenes que lleven mucho tiempo en estado “en
proceso
de creacion” porque eso significaría que no se han llevado a cabo ¿no?

Si, algun mecanismo de depuracion, que dependera del problema en
particular… pero no deberia de ser algo muy complicado de hacer

Sebastian D. wrote:

Crear el modelo, con instancias en la base de datos, es la forma mas
simple de resolver el problema.

Simplemente asegurate que tu modelo “carrito” (o orden o como lo
prefieras llamar) tenga un campo de “estado” donde indiques que esta
“en proceso de creacion” o que ya esta listo, o que ya fue cancelado,
etc, etc…

Siempre (o bueno, casi) es mas simple atacar al problema guardando
todo de forma persistente, pero con un estado especial, que intentar
mantenerlo en memoria haciendo malabarismos, pues a fin de cuentas
estas usando un framework que no maneja persistencia de estado.

Vale pero en ese caso habría que tener algún script que borrara cada
cierto tiempo las órdenes que lleven mucho tiempo en estado “en proceso
de creacion” porque eso significaría que no se han llevado a cabo ¿no?

Sebastian D.
escribió:>> Vale pero en ese caso habría que tener algún script que borrara cada

cierto tiempo las órdenes que lleven mucho tiempo en estado “en
proceso
de creacion” porque eso significaría que no se han llevado a cabo ¿no?

Si, algun mecanismo de depuracion, que dependera del problema en
particular… pero no deberia de ser algo muy complicado de hacer

Por jugar y tirar un poco del hilo, y siempre que las sesiones se
almacenen en base de datos, se me ocurre que se podría cargar algo así
desde el environment.rb:

class CGI::Session::ActiveRecordStore::Session

has_one :basket, :dependent => :destroy

habremos creado un session_id en la tabla baskets

end

…y crear toda cesta de la compra en base al objeto session de la base
de datos:

(desconozco si existe alguna forma mas directa de acceder al

registro que guarda la sesion en la db)

db_session=session.dbman.session_class.find_by_session_id(session.session_id)
db_session.create_basket(…)

…de forma que al resetear la sesión o al eliminar las sesiones
obsoletas también borraríamos automáticamente sus correspondientes
cestas sin ningún script adicional.

Saludos,
Raul M.

Jaime Mora R. wrote:

Víctor Martínez García wrote:

La cosa es que cuando creo un producto, tengo que poder añadir en la
misma pantalla de creación de producto las lineas de stock.

Lo que no sé como hacer es que esas lineas de stock referencien a un
producto que aún no se ha creado.

Al margen de las respuestas que has recibido, te recomiendo que revises
estos screencast [1] y [2], en dónde demuestra cómo crear múltiples
modelos a través de un solo form, manteniendo limpio el controlador, ya
en la parte 2 se explica cómo utilizar JavaScript y RJS para agregar y
eliminar form fields dinamicamente.

[1] #73 Complex Forms Part 1 - RailsCasts
[2] #74 Complex Forms Part 2 - RailsCasts

Espero te sirva.

Jaime Mora R.

Gracias, eso es justo lo que estaba buscando, me sirve para el ejemplo
de los stocks. Aunque ahora que lo pienso el ejemplo del carrito no es
una simplificación buena de lo que quería hacer ya que los productos se
van añadiendo al carrito durante la navegación por la web, no se crean
en un formulario a la vez que se hace checkout. Muchas gracias, tendré
que repasarme los screencasts que están muy bien.