Skip to content

suweller/mongoid-autoinc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

23e3858 · Jun 25, 2024
Jun 25, 2024
Mar 21, 2016
Jun 25, 2024
Jun 25, 2024
Oct 30, 2013
Jun 25, 2024
Oct 11, 2016
Sep 11, 2013
Jun 18, 2013
Jan 9, 2012
Jun 25, 2024
Mar 14, 2017
Jun 25, 2024
Jul 24, 2023

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