Perpetuity is a simple Ruby object persistence layer that attempts to follow Martin Fowler's Data Mapper pattern, allowing you to use plain-old Ruby objects in your Ruby apps in order to decouple your domain logic from the database as well as speed up your tests.
There is no need for your model classes to inherit from another class or even include a mix-in.
Your objects will hopefully eventually be able to be persisted into whichever database you like.
[~/rubytesting/perpetuity]$ mongod -vvvv all output going to: /usr/local/var/log/mongodb/mongo.log
[~/rubytesting/perpetuity]$ cat Gemfile source 'https://rubygems.org' gem 'perpetuity-postgres' gem 'perpetuity-mongodb', '1.0.0.beta'
[~/rubytesting/perpetuity]$ cat app.rb
require 'perpetuity'
require 'perpetuity/mongodb'
Perpetuity.data_source :mongodb, 'my_perpetuity_database'
#Perpetuity.configure do
# data_source :mongodb
#end
class Article
attr_accessor :title, :body
def to_s
"title: #{@title}\nbody: #{body}\n"
end
end
Perpetuity.generate_mapper_for Article do
attribute :title
attribute :body
end
article = Article.new
article.title = 'New Article'
article.body = 'This is an article.'
Perpetuity[Article].insert article
puts article
[~/rubytesting/perpetuity]$ cat app_load.rb
require 'perpetuity'
require 'perpetuity/mongodb'
require 'pp'
Perpetuity.data_source :mongodb, 'my_perpetuity_database'
class Article
attr_accessor :title, :body
def to_s
"title: #{@title}\nbody: #{body}\n"
end
end
Perpetuity.generate_mapper_for Article do
attribute :title
attribute :body
end
articles = Perpetuity[Article].all
articles.each do |article| # This is when the DB gets hit
puts article
end
[~/rubytesting/perpetuity]$ ruby app_load.rb title: New Article body: This is an article. title: New Article body: This is an article. [~/rubytesting/perpetuity]$ ruby app.rb title: New Article body: This is an article. [~/rubytesting/perpetuity]$ ruby app_load.rb title: New Article body: This is an article. title: New Article body: This is an article. title: New Article body: This is an article.
[~/rubytesting/perpetuity]$ mongo
MongoDB shell version: 2.4.8
connecting to: test
Server has startup warnings:
Sat Mar 15 14:59:07.435 [initandlisten]
Sat Mar 15 14:59:07.435 [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
> show dbs
dict_dev 0.203125GB
local 0.078125GB
my_perpetuity_database 0.203125GB
sinatra-example-dev 0.203125GB
spatialapp 0.203125GB
test 0.203125GB
> use my_perpetuity_database
switched to db my_perpetuity_database
> show collections
Article
system.indexes
> db.Article.find()
{ "title" : "New Article", "body" : "This is an article.", "_id" : ObjectId("53246ee6a11460aefd000001") }
{ "title" : "New Article", "body" : "This is an article.", "_id" : ObjectId("532472dba114602208000001") }
{ "title" : "New Article", "body" : "This is an article.", "_id" : ObjectId("53247498a11460d527000001") }
{ "title" : "New Article", "body" : "This is an article.", "_id" : ObjectId("532476f3a114603149000001") }
{ "title" : "New Article", "body" : "This is an article.", "_id" : ObjectId("53247756a11460257d000001") }
{ "title" : "New Article", "body" : "This is an article.", "_id" : ObjectId("532480afa1146012f5000001") }