mongoid-autoinc
A mongoid plugin to add auto incrementing fields to your documents.
Installation
in gemfile:
gem 'mongoid-autoinc'
in class:
require 'autoinc'
Usage
# 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
Scopes
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 }
Custom Increment Trigger
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
Custom Model Name
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
Seeds
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
Step
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) }
Development
$ gem install bundler (if you don't have it)
$ bundle install
$ bundle exec spec
Contributing
- Fork and create a topic branch.
- Follow the 80beans styleguide. Basically the rubystyleguide with some minor changes.
- Submit a pull request
Contributions
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
Copyright
See LICENSE for details