A mongoid plugin to add auto incrementing fields to your documents.
Use 0.1.3 for mongoid 2.0
Use 0.3.0 for mongoid 3.0
Use 4.x.x for mongoid 4
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: -> { 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 override the model name used to generate the autoincrement keys. This can be useful when working with subclasses or namespaces.
class Intern
include Mongoid::Document
include Mongoid::Autoinc
field :name
field :number
increments :number, model_name => :foo
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: -> { 1 + rand(10) }
$ gem install bundler (if you don't have it)
$ bundle install
$ bundle exec spec
- Fork and create a topic branch.
- Follow the 80beans styleguide. Basically the rubystyleguide with some minor changes.
- Submit a pull request
Thanks to Johnny Shields (@johnnyshields) for implementing proc support to scopes And to Marcus Gartner (@mgartner) for implementing the seed functionality
Kris Martin (@krismartin) and Johnny Shields (@johnnyshields) for adding the overwritten model name feature
See LICENSE for details