Stocker vos modèles dans le cache ou les sérialiser pour d'autres raisons ne devrait pas être douloureux. Malheureusement, c'est souvent le cas avec la plupart des ORM, car ils ont une stratégie de marshaling médiocre par défaut. Cependant, c'est facile à corriger : la clé réside dans le fait que chaque ORM sait déjà comment prendre un tableau d'informations de la base de données et instancier une instance complète. En sachant cela, nous pouvons facilement faire en sorte que n'importe quel modèle se sérialise comme du beurre.
#! /usr/bin/env ruby
# certains modèles ont des trucs bizarres qui ne survivent pas à un aller-retour de marshaling
#
class Model
include Mongoid::Document
def initialize(*args, &block)
super
ensure
@fail = Class.new, open(__FILE__)
end
end
# donc cela échouera
#
begin
p Marshal.load(Marshal.dump(Model.create))
rescue Object => o
warn "#{ o.message } (#{ o.class })"
end
# mais les modèles mongoid ont simplement besoin d'un tableau d'informations du driver mongo
# pour s'animer complètement... ergo c'est tout ce dont nous avons besoin pour persister lorsque
# marshalé. Cela rend le chargement à partir des données marshalées *juste comme* le chargement à partir de
# la db.
#
# si vous me demandez, cela devrait être le comportement par défaut !
#
# hrm - je suis sur le noyau mongoid... @durran, qu'en penses-tu ?
#
# d'ailleurs - cela fonctionne très bien avec active_record aussi...
#
class Model
def _dump(*args, &block)
Marshal.dump(raw_attributes, *args, &block)
end
def Model._load(string, *args, &block)
raw_attributes = Marshal.load(string, *args, &block)
instantiate(raw_attributes)
end
end
# donc maintenant ça fonctionne juste (TM)
#
p Marshal.load(Marshal.dump(Model.create))
BEGIN {
require 'rubygems'
require 'mongoid'
Mongoid.configure{|config| config.connect_to