Skip to content

suweller/mongoid-autoinc

Repository files navigation

mongoid-autoinc

A mongoid plugin to add auto incrementing fields to your documents.

Inline docs Code Climate Build Status

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

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