module Mongo::Id

This module abstracts the functionality for generating sequential unique integer IDs for instances of the class. It defines the method next_id on the class that includes it. The implementation ensures that the IDs will be unique even when called from multiple threads.

@example Include the Id module.

class Foo
  include Mongo::Id
end

f = Foo.new
foo.next_id # => 1
foo.next_id # => 2

Classes which include Id should not access `@@id` or `@@id_lock` directly; instead, they should call `#next_id` in `#initialize` and save the result in the instance being created.

@example Save the ID in the instance of the including class.

class Bar
  include Mongo::Id

  attr_reader :id

  def initialize
    @id = self.class.next_id
  end
end

a = Bar.new
a.id # => 1
b = Bar.new
b.id # => 2

@since 2.7.0 @api private

Public Class Methods

included(klass) click to toggle source
# File lib/mongo/id.rb, line 51
def self.included(klass)
  klass.class_variable_set(:@@id, 0)
  klass.class_variable_set(:@@id_lock, Mutex.new)

  klass.define_singleton_method(:next_id) do
    klass.class_variable_get(:@@id_lock).synchronize do
      id = class_variable_get(:@@id)
      klass.class_variable_set(:@@id, id + 1)
      klass.class_variable_get(:@@id)
    end
  end
end