10. class Person
include Mongoid::Document
field :cool_dude, :type => Boolean, :default => false
field :name
field :age, :type => Integer
embeds_one :address
validates_presence_of :name
end
class Address
include Mongoid::Document
field :city
field :zip_code
embedded_in :person, :inverse_of => :address
end
11. class Person
include Mongoid::Document
field :cool_dude, :type => Boolean, :default => false
field :name
field :age, :type => Integer
embeds_one :address
embeds_many
references_one
validates_presence_of :name
references_many
end
referenced_in
class Address
include Mongoid::Document
field :city
field :zip_code
embedded_in :person, :inverse_of => :address
end
15. Mongoid::Paranoia
class Person
include Mongoid::Document
include Mongoid::Paranoia
end
person.delete # person.deleted_at = Time.now
person.restore # phew!
person.delete!
person.restore # it's gone :(
16. cursor proxy
module Mongoid
class Cursor
include Enumerable
OPERATIONS = [
:close, :closed?, :count, :explain,
:fields, :full_collection_name, :hint, :limit,
:order, :query_options_hash, :query_opts, :selector,
:skip, :snapshot, :sort, :timeout
]
OPERATIONS.each do |name|
define_method(name) { |*args| @cursor.send(name, *args) }
end
def each
# ...
end
def next_document
# ...
end
def to_a
# ...
end
end
17. Enables caching vs. lazy loading of big datasets
Person.all.cache.each { |person| person.hug }
or
class Person
include Mongoid::Document
cache
end
Person.all.each { |person| person.hug }
20. class Person
include MongoMapper::Document
key :cool_dude, Boolean, :default => false
key :name, String, :required => true
key :age, Integer
one :address
end
class Address
include MongoMapper::EmbeddedDocument
key :city, String
key :zip_code, String
end
21. class Person
include MongoMapper::Document
key :cool_dude, Boolean, :default => false
key :name, String, :required => true
key :age, Integer
one :address many
end belongs_to
class Address
include MongoMapper::EmbeddedDocument
key :city, String
key :zip_code, String
end
22. class Person
include MongoMapper::Document
key :cool_dude, Boolean, :default => false
key :name, String, :required => true
key :age, Integer
one :address
end
class Address
include MongoMapper::EmbeddedDocument
key :city, String
key :zip_code, String
end
23. class Person
include MongoMapper::Document
key :cool_dude, Boolean, :default => false
key :name, String, :required => true
key :age, Integer
one :address
Alternative
end
validation syntax
class Address
include MongoMapper::EmbeddedDocument
key :city, String
key :zip_code, String
end
25. Plugin architecture
module MongoMapper
module Plugins
def plugins
@plugins ||= []
end
def plugin(mod)
extend mod::ClassMethods if mod.const_defined?(:ClassMethods)
include mod::InstanceMethods if mod.const_defined?(:InstanceMethods)
mod.configure(self) if mod.respond_to?(:configure)
plugins << mod
end
end
end associations, dirty, document
dynamic_querying, embedded_document, equality
indexes, logger modifiers, pagination
persistence, protected, querying
safe, SCI, scopes, serialization, validations,
and more (pretty much everything in MM)
26. Querying (plucky)
Person.where(:address.exists => true).all
Person.where(:age.gt => 21).limit(10).all
Person.where(:age.gte => 21).all
Person.where(:age.lt => 30).all
Person.where(:age.lte => 30).all
( Similar to mongoid’s
querying and scoping )
Except for no support for
#not_in, #exists, #any_of
and others found in mongoid
28. cache_key
class Person
include MongoMapper::Document
end
Person.new.cache_key
# => "Person/new"
Person.create.cache_key
# => "Person/4c9508fbfff2cb4096000007"
29. Custom data types
class MongoSet
def self.to_mongo(value)
value.to_a
end
def self.from_mongo(value)
Set.new(value || [])
end
end
class Person
include MongoMapper::Document
key :aliases, MongoSet
end
30. Typecasting
class Person
include MongoMapper::Document
key :friend_ids, Array, :typecast => 'ObjectId'
end
Person.new(:friend_ids => %w(4c950520fff2cb3fb9000004
4c950558fff2cb3fb9000005
4c950911fff2cb4096000008) )