Pregunta

Estoy usando Rails 2.3 y Activerecord como tienda de sesión y quiero evitar la creación de sesiones antes de que se necesite.

Tengo una tabla ITENS para almacenar elementos asociados a la sesión, es decir, su modelo tiene una asociación belongs_to :session.

Tengo una llamada AJAX que debería crear un nuevo elemento. Cuando aún no hay sesión, debería crear uno para estar asociado al elemento. Para esto, necesito la ID de la tabla Sessions, no la sesión utilizada para identificar la session por la cookie. Pero, el registro de la sesión solo se crea en DB después de que la solicitud haya finalizado. Ex:

def create
  request.session_options[:id] # nil if there is no session yet
  session[:activate] = 1 # this "creates" the sesssion (but not in DB)
  request.session_options[:id] # now the new generated session_id
  db_session = Session.find_by_session_id(request.session_options[:id]) # nil, not in DB yet :(
  Item.new(
    :session_id => db_session.id, # ops, id called for nil object
    :data => params[:data]
  )
end
¿Fue útil?

Solución

"Los objetos modelo no deben saber nada sobre la sesión" (Pat Maddox de http://markmail.org/message/4ilmpn7s3wkq6ioD).

Y esto tiene sentido, ya que si decidí almacenar la sesión en la memoria, la cookie, el sistema de archivos o donde sea, no se cambia nada en el código del modelo.

Entonces, la solución es crear otra tabla para almacenar elementos_groups. Si aún no hay sesión, cree un nuevo elemento_group y almacene su ID en la sesión. De lo contrario, recupere elementos_group_id de la sesión y ¡terminemos!

Cuando la sesión se almacena en la base de datos ya no importa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top