README.md in mongoid-locker-0.3.6 vs README.md in mongoid-locker-1.0.0

- old
+ new

@@ -1,14 +1,14 @@ # mongoid-locker [![Gem Version](https://badge.fury.io/rb/mongoid-locker.svg)](http://badge.fury.io/rb/mongoid-locker) [![Build Status](https://secure.travis-ci.org/mongoid/mongoid-locker.svg?branch=master)](http://travis-ci.org/mongoid/mongoid-locker) [![Code Climate](https://codeclimate.com/github/mongoid/mongoid-locker.svg)](https://codeclimate.com/github/mongoid/mongoid-locker) -Document-level locking for MongoDB via Mongoid. The need arose at [Jux](https://jux.com) from multiple processes on multiple servers trying to act upon the same document and stepping on each other's toes. Mongoid-Locker is an easy way to ensure only one process can perform a certain operation on a document at a time. +Document-level locking for MongoDB via Mongoid. The need arose at [Jux](https://jux.com) from multiple processes on multiple servers trying to act upon the same document and stepping on each other's toes. Mongoid-Locker is an easy way to ensure only one process can perform a certain operation on a document at a time. [Tested](http://travis-ci.org/mongoid/mongoid-locker) against: -- MRI: `2.3.6`, `2.4.3`, `2.5.0` +- MRI: `2.3.6`, `2.4.3`, `2.5.0` - Mongoid: `2`, `3`, `4`, `5`, `6`, `7` See [.travis.yml](.travis.yml) for the latest test matrix. ## Usage @@ -17,29 +17,32 @@ ```ruby gem 'mongoid-locker' ``` -and run `bundle install`. In the model you wish to lock, include `Mongoid::Locker` after `Mongoid::Document`. For example: +and run `bundle install`. In the model you wish to lock, include `Mongoid::Locker` after `Mongoid::Document`. For example: ```ruby class QueueItem include Mongoid::Document include Mongoid::Locker - field :completed_at, :type => Time + field :locked_at, type: Time + field :locked_until, type: Time + + field :completed_at, type: Time end ``` Then, execute any code you like in a block like so: ```ruby queue_item.with_lock do # do stuff - queue_item.completed_at = Time.now + queue_item.completed_at = Time.now.utc queue_item.save! end ``` The `#with_lock` function takes an optional [handful of options around retrying](http://rdoc.info/github/mongoid/mongoid-locker/Mongoid/Locker:with_lock), so make sure to take a look. @@ -54,9 +57,51 @@ ``` Note that these locks are only enforced when using `#with_lock`, not at the database level. It's useful for transactional operations, where you can make atomic modification of the document with checks. For example, you could deduct a purchase from a user's balance ... _unless_ they are broke. More in-depth method documentation can be found at [rdoc.info](http://rdoc.info/github/mongoid/mongoid-locker/frames). + +### Customizable :locked_at and :locked_until field names +By default, Locker uses fields with `:locked_at` and `:locked_until` names which should be defined in a model. +```ruby +class User + include Mongoid::Document + include Mongoid::Locker + + field :locked_at, type: Time + field :locked_until, type: Time +end +``` + +Use `Mongoid::Locker.configure` to setup field names which used by Locker for all models where it's included. +```ruby +Mongoid::Locker.configure do |config| + config.locked_at_field = :global_locked_at + config.locked_until_field = :global_locked_until +end + +class User + include Mongoid::Document + include Mongoid::Locker + + field :global_locked_at, type: Time + field :global_locked_until, type: Time +end +``` + +The `locker` method in your model accepts `:locked_at_field` and `:locked_until_field` options to setup field names which used by Locker for the model. This can be useful when another library uses the same field for different purposes. +```ruby +class User + include Mongoid::Document + include Mongoid::Locker + + field :locker_locked_at, type: Time + field :locker_locked_until, type: Time + + locker locked_at_field: :locker_locked_at, + locked_until_field: :locker_locked_until +end +``` ## Copyright & License Copyright (c) 2012-2018 Aidan Feldman & Contributors