Use 0.1.3 for mongoid 2.0
use 0.3.0 for mongoid 3.0
A mongoid plugin to add auto incrementing fields to your documents.
{<img src=“” />}[![Build Status](travis-ci.org/dioteos/mongoid-autoinc.png)](https://travis-ci.org/dioteos/mongoid-autoinc) <img src=“https://codeclimate.com/badge.png” />
in gemfile:
gem 'mongoid-autoinc'
in class:
require 'autoinc'
# app/models/user.rb class User include Mongoid::Document include Mongoid::Autoinc field :name field :number, :type => Integer increments :number end user = User.create(:name => 'Dr. Percival "Perry" Ulysses Cox') user.id # BSON::ObjectId('4d1d150d30f2246bc6000001') user.number # 1 another_user = User.create(:name => 'Bob Kelso') another_user.number # 2
You can scope on document fields. For example:
class PatientFile include Mongoid::Document include Mongoid::Autoinc field :name field :number, :type => Integer increments :number, :scope => :patient_id belongs_to :patient end
Scope can also be a Proc:
increments :number, :scope => lambda { patient.name }
You can trigger the assignment of an increment field manually by passing: +:auto => false+ to the increment field. This allows for more flexible assignment of your increment number:
class Intern include Mongoid::Document include Mongoid::Autoinc field :name field :number increments :number, :auto => false after_save :assign_number_to_jd protected def assign_number_to_jd assign!(:number) if number.blank? && name == 'J.D.' end end
You can use a seed to start the incrementing field at a given value. The first document created will start at ‘seed + 1`.
class Vehicle include Mongoid::Document include Mongoid::Autoinc field :model field :vin increments :vin, seed: 1000 end car = Vehicle.new(model: "Coupe") car.vin # 1001
The step option can be used to specify the amount to increment the field every time a new document is created. If no step is specified, it will increment by 1.
class Ticket include Mongoid::Document include Mongoid::Autoinc field :number increments :number, step: 5 end first_ticket = Ticket.new first_ticket.number # 5 second_ticket = Ticket.new second_ticket.number # 10
The step option can also be a Proc:
increments :number, step: lambda { 1 + rand(10) }
$ gem install bundler (if you don't have it) $ bundle install $ bundle exec spec
Thanks to Johnny Shields (@johnnyshields) for implementing proc support to scopes And to Marcus Gartner (@mgartner) for implementing the seed functionality
See LICENSE for details