Skip to content

Instantly share code, notes, and snippets.

@koduki
Created April 16, 2011 17:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koduki/923289 to your computer and use it in GitHub Desktop.
Save koduki/923289 to your computer and use it in GitHub Desktop.
Object Mapper for kvs
module PConfig
def self.setup params
@store = params[:store]
end
def self.store
@store
end
end
class Index
def initialize model
@store = PConfig.store
@model = model
end
def add property, index
key = @model.to_s + "Index" + property
if @store.key? key
@store[key] << index
else
@store[key] = [index]
end
end
def get property
key = @model.to_s + "Index" + property
@store[key].map{|index| (@model.to_s + property + index.to_s)}
end
end
module Persistable
def Object.properties *names
names.map{|x| x.to_s }.each do |name|
define_method(name){ @self[name] }
define_method(name+"="){ |value| @self[name] = value }
end
end
def Object.foreigns relesions
relesions.each do |relesion|
name = relesion[0].to_s
pk = relesion[1].to_s
define_method name do
model = eval(name.sub(/^(.?)/){ $1.upcase })
model.new @store, @self[pk]
end
end
end
define_method("initialize") do |pk|
key = self.class.to_s + pk.to_s
@store = PConfig.store
@self = if @store.key? key
@store[key]
else
@store[key] = {}
end
end
end
class Item
include Persistable
properties "isbn", :title, :price
end
class Order
include Persistable
properties :isbn
foreigns :item => :isbn
end
# example
PConfig.setup :store => {}
item = Item.new "123456789"
item.isbn = "123456789"
item.title = "Hello World"
index = "1"
order = Order.new "koduki" + index
order.isbn = "123456789"
Index.new(Order).add("koduki", index)
orders = Index.new(Order).get("koduki")
puts orders.first.item.title
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment