Question

J'utilise Rails 2.3 et ActiveRecord comme magasin de session et je veux éviter de créer des sessions avant qu'il ne soit nécessaire.

J'ai une table Itens pour stocker des éléments associés à la session, à savoir, son modèle a une belongs_to :session d'association.

J'ai un appel Ajax qui devrait créer un nouvel élément. Quand il n'y a pas encore de session, il devrait créer un à associer à l'élément. Pour cela, je dois l'id de la table des sessions, et non le session_id utilisé pour identifier le sesssion par le cookie. Mais, l'enregistrement de session est créé uniquement dans DB après la demande terminée. 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
Était-ce utile?

La solution

"objets modèle ne doit pas savoir quoi que ce soit au sujet de la session" (Pat Maddox de http://markmail.org/message / 4ilmpn7s3wkq6iod ).

Et ce sens de faire, car si je décide de stocker session en mémoire, cookies, système de fichiers ou ailleurs, rien ne change dans le code du modèle.

Alors, la solution est de créer une autre table pour items_groups magasin. S'il n'y a pas encore de session, créer un nouveau items_group et stocker son identifiant sur la session. Dans le cas contraire, récupérer items_group_id de la session et nous avons fini!

Lorsque la session est enregistrée dans la base de données n'a plus d'importance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top