Module: Mongoid::Traversable::ClassMethods

Defined in:
lib/mongoid/traversable.rb

Overview

Class-level methods for the Traversable behavior.

Instance Method Summary collapse

Instance Method Details

#hereditary?true | false

Determines if the document is a subclass of another document.

Examples:

Check if the document is a subclass.

Square.hereditary?

Returns:

  • (true | false)

    True if hereditary, false if not.



20
21
22
# File 'lib/mongoid/traversable.rb', line 20

def hereditary?
  !!(superclass < Mongoid::Document)
end

#inherited(subclass) ⇒ Object

When inheriting, we want to copy the fields from the parent class and set the on the child to start, mimicking the behavior of the old class_inheritable_accessor that was deprecated in Rails edge.

rubocop:disable Metrics/AbcSize

Examples:

Inherit from this class.

Person.inherited(Doctor)

Parameters:

  • subclass (Class)

    The inheriting class.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/mongoid/traversable.rb', line 34

def inherited(subclass)
  super

  # Register the new subclass with the resolver subsystem
  Mongoid::ModelResolver.register(subclass)

  @_type = nil
  subclass.aliased_fields = aliased_fields.dup
  subclass.localized_fields = localized_fields.dup
  subclass.fields = fields.dup
  subclass.pre_processed_defaults = pre_processed_defaults.dup
  subclass.post_processed_defaults = post_processed_defaults.dup
  subclass._declared_scopes = Hash.new { |_hash, key| _declared_scopes[key] }
  subclass.discriminator_value = subclass.name

  # We need to do this here because the discriminator_value method is
  # overridden in the subclass above.
  subclass.include DiscriminatorRetrieval

  # We only need the _type field if inheritance is in play, but need to
  # add to the root class as well for backwards compatibility.
  return if fields.key?(discriminator_key)

  default_proc = -> { self.class.discriminator_value }
  field(discriminator_key, default: default_proc, type: String)
end