Att spara dina modeller i cache, eller serialisera dem för andra anledningar bör inte vara smärtsamt. Dessvärre är det så med de flesta ORM:er, då de har en dålig marshal-strategi som standard. Glädjande nog är det lätt att åtgärda: nyckeln ligger i att förstå att varje ORM redan vet hur man tar en hash av information från databasen och instansierar en fullvärdig instans. Med detta i åtanke kan vi lätt göra så att vilken modell som helst serialiseras som smör.
#! /usr/bin/env ruby
# vissa modeller har skräp som inte klarar av en marshal-tur
#
class Model
include Mongoid::Document
def initialize(*args, &block)
super
ensure
@fail = Class.new, open(__FILE__)
end
end
# så det här kommer att misslyckas
#
begin
p Marshal.load(Marshal.dump(Model.create))
rescue Object => o
warn "#{ o.message } (#{ o.class })"
end
# men mongoid-modeller behöver bara en hash av information från mongodrivrutinen
# för att fullt ut levandegöra sig... därför behöver vi bara det här när
# vi marshalar. Detta gör laddningen från marshalade data *precis som* laddningen från
# db.
#
# om du frågar mig bör det här vara standardbeteendet!
#
# hrm - jag är i mongoid core... @durran, vad tycker du?
#
# för resten - det här fungerar precis lika bra med active_record också...
#
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
# så nu fungerar det bara (TM)
#
p Marshal.load(Marshal.dump(Model.create))
BEGIN {
require 'rubygems'
require 'mongoid'
Mongoid.configure{|config| config.connect_to('mongoid-marshal')}
}
__END__
teh outputz:
kan inte dumpa anonym klass #<Class:0x007fa89dc23768> (TypeError)
#<Model _id: 5130edd0af481ccd3d000002, >
ref: https://gist.github.com/ahoward/5066528