@drawoharajag ❤️ det här! << klicka på mig 🐛 🫖 🧚
/marshal-mongoid-object-like-butter
publicerad den: 2013-03-01

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