Skip to content

Instantly share code, notes, and snippets.

@fxposter
Created February 21, 2010 00:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fxposter/310012 to your computer and use it in GitHub Desktop.
Save fxposter/310012 to your computer and use it in GitHub Desktop.
class NativeSerializer
def encode
value.inspect
end
def decode(value)
eval(value)
end
end
class JSONSerializer
def initialize
@encoder = Yajl::Encoder
@decoder = Yajl::Parser
end
def encode(value)
@encoder.encode(value)
end
def decode(value)
@decoder.parse(value)
end
end
module Serializable
def self.extended(klass)
klass.class_eval do
@@serializers = {}
def self.serializers
@@serializers
end
def after_initialize
@serialized = {}
@serialized_changed = {}
end
private
def perform_serialization
@serialized.each do |key, value|
if @serialized_changed[key]
self[key] = @@serializers[key].encode(value)
end
end
end
before_save :perform_serialization
end
end
def serialize_property(property, options = {})
options[:serializer] ||= NativeSerializer.new
serializers[property] = options[:serializer]
define_method property do
if @serialized[property].nil? && !self[property].nil?
@serialized[property] = self.class.serializers[property].decode(self[property])
@serialized_changed[property] = options[:autosave] ? true : false
end
@serialized[property]
end
define_method "#{property}=" do |value|
@serialized[property] = value
send("#{property}_changed!".to_sym)
end
define_method "#{property}_changed!" do
@serialized_changed[property] = true
end
end
end
class Post < ActiveRecord::Base
extend Serializable
serialize_property :tags, :serializer => JSONSerializer.new
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment