Inserire i tuoi modelli nella cache o serializzarli per altri motivi non dovrebbe essere doloroso. Purtroppo, con la maggior parte degli ORM, è così, poiché hanno una strategia di marshalling scarsa di default. Tuttavia, questo è facile da risolvere: la chiave sta nel capire che ogni ORM sa già come prendere un hash di informazioni dal database e istanziare un'istanza completa. Sapendo questo, possiamo facilmente rendere qualsiasi modello serializzarsi come burro.
#! /usr/bin/env ruby
# alcuni modelli hanno stronzate che non sopravvivono a un ciclo di marshalling
#
class Modello
include Mongoid::Documento
def inizializza(*args, &blocco)
super
assicura
@errore = Classe.nuovo, apri(__FILE__)
fine
fine
# quindi fallirà
#
inizia
p Marshal.carica(Marshal.scarica(Modello.crea))
salva Oggetto => o
avverti "#{ o.messaggio } (#{ o.classe })"
fine
# ma i modelli mongoid hanno semplicemente bisogno di un hash di informazioni dal driver mongo
# per vivificarsi completamente... quindi è tutto ciò che dobbiamo persistere quando
# viene marshallato. Questo rende il caricamento dai dati marshallati *proprio come* il caricamento dal
# db.
#
# se chiedi a me questo dovrebbe essere il comportamento predefinito!
#
# hrm - sono nel nucleo di mongoid... @durran, cosa ne pensi?
#
# a proposito - questo funziona benissimo anche con active_record...
#
class Modello
def _scarica(*args, &blocco)
Marshal.scarica(attributi_grezzi, *args, &blocco)
fine
def Modello._carica(stringa, *args, &blocco)
attributi_grezzi = Marshal.carica(stringa, *args, &blocco)
istanziare(attributi_grezzi)
fine
fine
# quindi ora funziona semplicemente (TM)
#
p Marshal.carica(Marshal.scarica(Modello.crea))
INIZIA {
richiedi 'rubygems'
richiedi 'mongoid'
Mongoid.configura