Ruby on Rails - Mongodb



Using MongoDB with Ruby on Rails

  • Fast in-place updates with atomic modifiers
  • Ruby on Rails is productive!
  • Object Mappers available for MongoDB
  • Mongo Ruby Driver

Mobile / Web

  • Ruby on Rails makes REST easy, making APIs easier.
  • Render responses as text, JSON, or XML
  • Geospatial indexing for location based queries.
  • Location-centric websites and mobile applications.

Why we chose MongoDB

  • Cowrite - collaborative writing web application
    • Versioning needed
    • Originally using GridFS
  • Travel720 - Gift registry web site
    • Self contained relations can take advantage of embedding documents

Mongo Object Mappers for Ruby

  • MongoMapper
  • Mongoid
  • Mongo ODM
  • MongoModel

Why we chose Mongoid

  • Excellent documentation
  • Active community
  • Compatibility with other projects/gems
  • Similar API to ActiveRecord
  • Uses ActiveValidation
  • Mongoid Extras: Caching, Paranoid Documents, Versioning, Timestamping,
  • Composite Keys

Compatible Gems with Mongoid

  • Devise - Authentication solution for Rails based on Warden. Supports
  • Mongoid out of box.
  • Carrierwave - simple and flexible way to upload files from Ruby Applications.
  • Supports grid_fs.
  • Geocoder - complete geocoding solution for Rails. Adds geocoding by street
  • or IP address, reverse geocoding, and distance queries.
  • Mongoid-rspec - RSpec matchers and macros for Mongoid.
 Mongoid example
Learn Ruby on Rails - Ruby on Rails tutorial - Mongoid example - Ruby on Rails examples - Ruby On Rails programs
 Mongoid program
Learn Ruby on Rails - Ruby on Rails tutorial - Mongoid program - Ruby on Rails examples - Ruby On Rails programs

Developing with MongoDB/Mongoid

  • Generating models is the same using the console as with ActiveRecord
    • rails generate model Team name:string city:string
    • location:array
  • No migrations needed!
  • Take advantage of embedded documents in models where applicable for
  • increased performance.
  • Store large files using GridFS

Fields available for Mongoid

  • Array
  • BigDecimal (Stored as a String)
  • Boolean
  • Date
  • DateTime
  • Float
  • Hash
  • Integer
  • Range
  • String
  • Symbol
  • Time
 Mongoid Document
Learn Ruby on Rails - Ruby on Rails tutorial - Mongoid Document - Ruby on Rails examples - Ruby On Rails programs

Persisting in the Controller

 Persisting controller
Learn Ruby on Rails - Ruby on Rails tutorial - Persisting controller - Ruby on Rails examples - Ruby On Rails programs

Indexing

 Indexing
Learn Ruby on Rails - Ruby on Rails tutorial - Indexing - Ruby on Rails examples - Ruby On Rails programs
  • To create indexes in the database use the rake task
rake db:mongoid:create_indexes
  • Or configure to autocreate in mongoid.yml (not recommended)
defaults: &defaults
autocreate_indexes: true

Relations in Models

  • Associations between models can be embedded or referenced
  • NO JOINS!
  • Objects that are referenced involve a separate query
  • Embedded documents can be very efficient with reducing queries to one
  • while managing the size of the document
  • One to One, One to Many, and Many to Many relations available

Relations in Mongoid - Embedded

 Embedded Relations
Learn Ruby on Rails - Ruby on Rails tutorial - Embedded Relations - Ruby on Rails examples - Ruby On Rails programs

Embedded Posts

 Embedded Posts
Learn Ruby on Rails - Ruby on Rails tutorial - Embedded Posts - Ruby on Rails examples - Ruby On Rails programs

Polymorphic Behavior

 polymorphic behaviour
Learn Ruby on Rails - Ruby on Rails tutorial - polymorphic behaviour - Ruby on Rails examples - Ruby On Rails programs

Relations in Mongoid - Referenced

 relations in mongoid
Learn Ruby on Rails - Ruby on Rails tutorial - relations in mongoid - Ruby on Rails examples - Ruby On Rails programs
 Many to Many Relationship
Learn Ruby on Rails - Ruby on Rails tutorial - Many to Many Relationship - Ruby on Rails examples - Ruby On Rails programs
  • Queries are of type Criteria, which is a chainable and lazily evaluated wrapper to a MongoDB dynamic query. Chainable queries include:
    • all_in
    • all_of
    • also_in
    • and
    • any_of
    • asc
    • desc
    • distinct
    • excludes
    • includes
    • limit
    • near
    • not_in
    • only
    • order_by
    • skip
    • where
    • without

Query Examples

Team.near(location: [20.70, 38.15]).limit(20)
Team.any_in(names: ["Giants", "Bears", "Lions"])
Team.find_or_create_by(name: "Giants")
Team.where(name: "Cowboys").destroy_all

Versioning with Mongoid

  • Embeds a version of the object on each save.
  • Can skip versioning and also set the max versions.
  • Add to model
include Mongoid::Versioning
{"_id" : ObjectId("4e9ba7fdcdffba52d6000004"),
"content" : "Impossible. I am too loud to fall asleep to.",
"created_at" : ISODate("2011-10-17T03:58:53Z"),
"title" : "Impossible to sleep to - this guy.",
"updated_at" : ISODate("2011-10-17T03:58:53Z"),
"version" : 3,
"versions" : [
{"title" : "Who is asleep?",
"content" : "Wake up the guy next to you if they are asleep.
Thanks.",
"version" : 1,
"created_at" : ISODate("2011-10-17T03:58:53Z")},
{"title" : "Who is asleep?",
"content" : "Impossible. I am too loud to fall asleep to.",
"created_at" : ISODate("2011-10-17T03:58:53Z"),
"version" : 2 } ]
}

Testing Rails with MongoDB

  • RSpec-Mongoid provides test matchers
  • RSpec does not refresh the database with each test run.
  • Database Cleaner to the rescue. It be setup to truncate a database before
  • running tests. Add below after installing the DatabaseCleaner Gem.
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.orm = "mongoid"
end

Hosting Options

  • Heroku is a widely used cloud hosting for Ruby on Rails
  • MongoHQ and MongoLab both have add on options
  • Options and pricing are similar

Related Searches to Ruby on Rails - Mongodb