Skip to content
Atomic update helpers for your Mongoid models
Find file
Pull request Compare This branch is even with jcoene:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
lib
spec
.gitignore
Gemfile
README.rdoc
Rakefile
VERSION
mongoid_atomic.gemspec

README.rdoc

Mongoid::Atomic

Atomic updates for your Mongoid models.

Installation

Add to Gemfile:

gem 'mongoid_atomic'

Getting Started

Include the module in models where you want it:

class User
  include Mongoid::Document
  include Mongoid::Atomic

  field :username
  field :groups, :type => Array, :default => ['users']
  field :post_count, :type => Integer
end

Easy and Human Readable Atomic Updates!

A simple example. To increment a post count:

u = User.where(:name => 'Bill').first
u.atomic_inc(:post_count)

.. which might fit nicely in your Post model:

class Post
  include Mongoid::Document
  ...
  references_one :user
  ...
  after_create :update_post_count
  ...
  private
  def update_post_count
    self.user.atomic_inc :post_count
  end
end

.. or join a group:

...
u.atomic_push(:groups, 'posters')

.. or remove a field:

...
u.atomic_unset(:deprecated_field)

.. or change your name:

...
u.atomic_set(:username, 'bill')

.. or do all of it at once:

...
u.atomic_update :inc => {:post_count => 1}, :set => {:username => 'bobby'}, :pushAll => {:groups => %w[rubyists developers]}

A Note About Attribute Consistency

No effort is made to ensure consistency between the server and instance attributes. There's a good reason for this: the operations are performed inside of the Mongo server and we often don't care about the result. If you need to ensure the consistency of your attributes after an update, call the Mongoid reload method. Example:

>> u = User.first
=> #<User....>

>> u.post_count
=> 0

>> u.atomic_inc :post_count
=> nil

>> u.post_count
=> 0

>> u.reload
=> #<User....>

>> u.post_count
>= 1
Something went wrong with that request. Please try again.