Report abuse

require 'rubygems'
require 'sequel/sqlite'

require 'pp'
require 'yaml'

module Sequel
  class Model
    def self.serialize *fields
      @@serialized_fields = fields

      @@serialized_fields.each { |f|
        define_method f, &eval("proc { YAML.load @values[:%s] }" % f.to_s)
        define_method "#{f.to_s}=", &eval("proc { |v| @values[:%s] = v.to_yaml }" % f.to_s)
      }

      before_create {
        @@serialized_fields.each { |f|
          self[f] = self[f].to_yaml
        }
      }
    end
  end
end

DB = Sequel.sqlite

class SerializedData < Sequel::Model(:data)
  set_schema do
    primary_key :id
    text :array
    text :hash
  end

  serialize :array, :hash
end

SerializedData.create_table

SerializedData.create :array => [1,2,3], :hash => { :a=>1, :b=>2 }
SerializedData.create :hash => { :a=>1, :b=>2 }
SerializedData.create :array => [1,2,3]


pp DB[:data].select(:array,:hash).where(:id => 1).first

r = SerializedData[1]
pp r.array
pp r.hash

r.array = [4,5,6,7]
pp r.array
r.save

pp DB[:data].select(:array,:hash).where(:id => 1).first