Mongomapper - Ramaze/ramaze GitHub Wiki
MongoMapper requires the mongodb be installed and running. Note this example is a little old, you probably want to use a newer version of mongomapper.
Configuration
Gemfile
gem 'mongo', '~>1.3.0'
gem 'mongo_mapper', '~>0.9.0'
model/init.rb
# Here goes your database connection and options:
require 'mongo_mapper'
require 'log4r'
# connect with a logger! Whoooop! Great feature
MongoMapper.connection = Mongo::Connection.new('localhost', nil, :logger => Log4r::Logger['charta'])
MongoMapper.database = 'charta-test'
# Use identity map for all models
module IdentityMapAddition
def self.included(model)
model.plugin MongoMapper::Plugins::IdentityMap
end
end
# our mongomapper extensions
Dir[__DIR__('extensions/*.rb')].each {|name| require name}
# Here go your requires for models:
require __DIR__('card')
model/extensions/uniq_array.rb
This is an example for a custom data type, in this case an array constrained to unique values
module MongoMapper
module Extensions
module UniqArray
# to_mongo gets called anytime a value is assigned
def to_mongo(value)
value = value.respond_to?(:lines) ? value.lines : value
value.to_a.uniq
end
# from mongo gets called anytime a value is read
def from_mongo(value)
(value || []).uniq
end
end
end
end
class UniqArray
extend MongoMapper::Extensions::UniqArray
end
model/card.rb
This is an example model.
# This models the 3x5 card with self referencing parents and children associations
class Card
include MongoMapper::Document
key :name, String
key :owner, User, :required => true
key :readers, Array, :typecast => 'User', :default => []
key :writers, Array, :typecast => 'User', :default => []
key :fields, Array, :default => []
key :card_ids, Array, :typecast => 'ObjectId', :default => []
many :children, :in => :card_ids, :class_name => 'Card'
key :parent_card_ids, Array, :typecast => 'ObjectId', :default => []
many :parents, :in => :parent_card_ids, :class_name => 'Card'
def children?
children.size > 0
end
def parents?
parents.size > 0
end
# Card attachment methods are self saving otherwise
# the bidirectional parent-to-childe relationships could be
# compromised.
def attach_parent(card)
parents << card
card.children << self
card.save
save
end
def attach_child(card)
children << card
card.parents << self
card.save
save
end
def detach_parent(card)
parents.delete(card)
card.children.delete(self)
card.save
save
end
def detach_child(card)
children.delete(card)
card.parents.delete(self)
card.save
save
end
end