Stocker des objets dans une session dans les rails
J'ai toujours été enseigné que le stockage d'objets dans une session a été une mauvaise idée. Au lieu de cela les Id doivent être stockés que de récupérer un enregistrement en cas de besoin.
Cependant, j'ai une application que je me demande est une exception à cette règle. Je suis en train de construire une carte mémoire de l'application, et les mots interrogés sont dans une table dans la base de données dont le schéma ne change pas. Je veux stocker les mots actuellement interrogés lors d'une session, un utilisateur peut terminer là où ils ont commencé dans le cas où ils se déplacent sur une page séparée.
Dans ce cas, est-il possible de s'en tirer avec le stockage de ces mots comme des objets dans la base de données? Si oui, pourquoi? La raison que je demande, c'est parce que le questionnaire est conçu pour se déplacer rapidement, et je déteste les déchets d'une base de données sur la récupération d'un enregistrement qui ne change jamais, en premier lieu. Cependant, peut-être il y a d'autres points négatifs à une session importante que je ne suis pas au courant.
*Pour l'enregistrement, j'ai essayé de mise en cache avec le haut-memcache méthodes dans les Rails 2.3, mais apparemment, qui a une taille maximale par point de 1 mo.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
La principale raison de ne pas stocker des objets dans la session, c'est que si l'objet des modifications de la structure, vous aurez une exception. Considérez les points suivants:
Puis, dans une version ultérieure du projet, vous de la Barre de modification du nom. Vous redémarrez le serveur, et essayer d'attraper foo de la session. Quand il tente de désérialiser, il ne parvient pas à trouver un Bar et explose.
Il peut sembler comme il serait facile d'éviter ce piège, mais dans la pratique, je l'ai vu mordre un certain nombre de personnes. C'est tout simplement parce que la sérialisation d'un objet peut parfois prendre plus avec elle que ce qui est immédiatement apparent (ce genre de chose est censé être transparent) et, sauf si vous avez rigoureuse des règles à ce sujet, les choses auront tendance à être démontés.
La raison, il est généralement mal vu, c'est que c'est très fréquent pour cette de mordre les gens dans ActiveRecord, car il est assez commun pour la structure de votre application évolue au cours du temps, et des sessions peuvent être désérialisés une semaine ou plus après qu'ils ont été initialement créés.
Si vous comprenez tout ce que et sont prêts à mettre de l'énergie pour être sûr que votre modèle ne change pas et n'est pas la sérialisation rien de plus, vous êtes probablement très bien. Mais attention 🙂
Rails tend à encourager Reposante de la conception, et à l'aide de sessions n'est pas très Reposant. Je serais probablement faire un Quiz ressource qui a un tas de mots, ainsi que d'un current_word. De cette façon, quand ils reviennent, vous savez où ils étaient.
Maintenant, le RESTE, ce n'est pas tout (en fonction de qui vous parlez), mais il y a une assez bonne affaire à l'encontre de grandes sessions. Rappelez-vous que des séances d'écrire des choses et à partir du disque, et plus les données que vous écrivez, plus il faut de temps pour lire...
Depuis votre app est une application Rails, je dirais:
en mettant en cache les cartes en javascript.
(vous auriez besoin d'un assez ajaxy application de
ce faire, consultez la dernière RailsCast pour quelques points intéressants sur le javascript de la page en cache)
options de mise en cache (c'est à dire MemCached)
cache de données.
Un beaucoup plus insidieuse question, vous rencontrerez de stocker des objets directement dans la session est lorsque vous utilisez CookieStore (la valeur par défaut dans les Rails 2+ je crois). Il est très facile de se CookieOverflow erreurs qui sont très difficiles à récupérer.