123456789_123456789_123456789_123456789_123456789_

Module: Mongo::Id Private

Do not use. This module is for internal use only.
Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Defined in: lib/mongo/id.rb

Overview

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.

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.

Examples:

Include the Id module.

class Foo
  include Mongo::Id
end

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

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

Class Method Summary

Class Method Details

.included(klass)

Since:

  • 2.7.0

[ GitHub ]

  
# File 'lib/mongo/id.rb', line 56

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