HashDB
HashDB is a minimal, in-memory, ActiveRecord like database library, backed by a Ruby Hash.
Installation
Gem releases are not done frequently as of now. I recommend installing through the git repository.
Add this line to your application's Gemfile:
gem 'hash_db', git: "https://github.com/utkarshkukreti/hash_db.git"
And then execute:
$ bundle
Or install it yourself as:
$ git clone https://github.com/utkarshkukreti/hash_db.git
$ cd hash_db
$ bundle install
$ rake install
Quickstart
(Complete usage instructions are below.)
require 'hash_db'
class Score
include HashDB::Model
keys :name, :points
end
score = Score.new name: "A", points: 10
score.save #= score.id == 1
Score.create name: "B", points: 11 #= id == 2
Score.create name: "C", points: 6 #= id == 3
Score.where(name: "B", points: 11).count #= 1
Score.where([:points, :>, 4], [:name, :=~, /a|b/i]).count #= 2
Score.find_by(:points, :>, 8).id #= 1
Usage
First, require HashDB.
require 'hash_db'
To make your class a HashDB model, just include HashDB::Model
module in
your class.
class Post
include HashDB::Model
end
Defining attributes is as easy as calling keys
, with the key names you want.
keys :title, :content
HashDB will automatically create getters and setters for these keys, so you can
now assign title
and content
to objects of the Post class.
post = Post.new
post.title = "Introducing HashDB"
post.content = "..."
Just as with ActiveRecord, you can also pass a Hash with key/value pairs to .new
# Same as above
post = Post.new title: "Introducing HashDB", content: "..."
To be able to query the model, objects must be saved, using .save
.
post.save
This saves the object into Class.all Hash, with auto generated id
key as the
key, and object as the value.
Post.all == { 1 => post } #= true
Like ActiveRecord, .new
and .save
can be combined into just a .create
call
on the class.
Post.create title: "Second Post"
Post.all.count == 2 #= true
Querying
HashDB currently has just 2 query methods, .where
, which can filter objects
using key(s) = value(s), and also using custom method call, like :<
and :>
.
Let's take HN as an example. :)
class Item
include HashDB::Model
keys :url, :title, :points, :comment_count
end
Item.create url: "http://blog.heroku.com/archives/2011/7/12/matz_joins_heroku/",
title: "Matz (creator of Ruby) joins Heroku",
points: 569,
comment_count: 79
Item.create url: "http://www.rubymotion.com/",
title: "RubyMotion - Ruby for iOS",
points: 466,
comment_count: 248
Item.create url: "http://repl.it/",
title: "Try Python, Ruby, Lua, Scheme, QBasic, Forth...",
points: 379,
comment_count: 80
You can query by key = value
Item.where(points: 569).count #= 1
by key = value pairs
Item.where(points: 569, comment_count: 79).count #= 1
by custom method call
Item.where(:points, :>, 400).count #= 2
and by custom method call pairs
Item.where([:points, :>, 400], [:title, :=~, /ios/i]).count #= 1
Associations
TODO: Add Documentation
License
MIT License. (c) 2013 Utkarsh Kukreti.