Module: Mongoid::Document

Extended by:
ActiveSupport::Concern
Includes:
Composable, Touchable::InstanceMethods
Included in:
GlobalDiscriminatorKeyAssignment::InvalidFieldHost
Defined in:
lib/mongoid/document.rb

Overview

This is the base module for all domain objects that need to be persisted to the database as documents.

Defined Under Namespace

Modules: ClassMethods

Constant Summary collapse

ILLEGAL_KEY =

Regex for matching illegal BSON keys. Note that bson 4.1 has the constant BSON::String::ILLEGAL_KEY that should be used instead. When ruby driver 2.3.0 is released and Mongoid can be updated to require >= 2.3.0, the BSON constant can be used.

/(\A[$])|(\.)/.freeze

Constants included from Composable

Composable::MODULES, Composable::RESERVED_METHOD_NAMES

Constants included from Interceptable

Interceptable::CALLBACKS

Constants included from Association

Association::MACRO_MAPPING

Constants included from Association::Depending

Association::Depending::STRATEGIES

Constants included from Persistable

Persistable::LIST_OPERATIONS

Constants included from Fields

Fields::Boolean, Fields::IDS, Fields::INVALID_BSON_CLASSES, Fields::StringifiedSymbol, Fields::TRANSLATIONS_SFX, Fields::TYPE_MAPPINGS

Constants included from Atomic

Atomic::UPDATES

Instance Attribute Summary collapse

Attributes included from Stateful

#destroyed, #flagged_for_destroy, #previously_new_record

Attributes included from Association

#_association

Attributes included from Attributes

#attributes

Attributes included from Clients::StorageOptions

#remembered_storage_options

Instance Method Summary collapse

Methods included from Touchable::InstanceMethods

#_clear_touch_updates, #_gather_touch_updates, #_run_touch_callbacks_from_root, #_touchable_parent?, #suppress_touch_callbacks, #touch, #touch_callbacks_suppressed?

Methods included from Composable

prohibited_methods

Methods included from Equality

#<=>, #==, #eql?

Methods included from Copyable

#clone

Methods included from Interceptable

#_mongoid_run_child_after_callbacks, #_mongoid_run_child_before_callbacks, #_mongoid_run_child_callbacks, #_mongoid_run_child_callbacks_with_around, #_mongoid_run_child_callbacks_without_around, #callback_executable?, #in_callback_state?, #pending_callbacks, #pending_callbacks=, #run_after_callbacks, #run_before_callbacks, #run_callbacks, #run_pending_callbacks

Methods included from Validatable

#begin_validate, #exit_validate, #performing_validations?, #read_attribute_for_validation, #valid?, #validated?, #validating, #validating_with_query?

Methods included from Traversable

#_children, #_descendants, #_parent, #_parent=, #_reset_memoized_descendants!, #_root, #_root?, #collect_children, #collect_descendants, #flag_descendants_persisted, #hereditary?, #parentize, #remove_child, #reset_persisted_descendants

Methods included from Cacheable

#cache_key

Methods included from Stateful

#destroyed?, #flagged_for_destroy?, #new_record=, #new_record?, #persisted?, #previously_new_record?, #previously_persisted?, #pushable?, #readonly!, #readonly?, #settable?, #updateable?

Methods included from Shardable

#shard_key_field_value, #shard_key_fields, #shard_key_selector, #shard_key_selector_in_db

Methods included from Serializable

#serializable_hash

Methods included from Selectable

#atomic_selector

Methods included from Reloadable

#reload

Methods included from Association

#association_name, #embedded?, #embedded_many?, #embedded_one?, #referenced_many?, #referenced_one?, #reload_relations

Methods included from Association::Reflections

#reflect_on_all_association, #reflect_on_association

Methods included from Association::Macros

#associations

Methods included from Association::Depending

#apply_destroy_dependencies!, define_dependency!, validate!

Methods included from Association::Accessors

#__build__, #create_relation, #reset_relation_criteria, #set_relation

Methods included from Association::Referenced::Syncable

#_syncable?, #_synced, #_synced?, #remove_inverse_keys, #update_inverse_keys

Methods included from Association::Referenced::CounterCache

define_callbacks!, #reset_counters

Methods included from Association::Referenced::AutoSave

#__autosaving__, #autosaved?, #changed_for_autosave?, define_autosave!

Methods included from Persistable

#atomically, #fail_due_to_callback!, #fail_due_to_validation!

Methods included from Persistable::Unsettable

#unset

Methods included from Persistable::Upsertable

#upsert

Methods included from Persistable::Updatable

#update, #update!, #update_attribute

Methods included from Persistable::Settable

#set

Methods included from Persistable::Savable

#save, #save!

Methods included from Persistable::Renamable

#rename

Methods included from Persistable::Pushable

#add_to_set, #push

Methods included from Persistable::Pullable

#pull, #pull_all

Methods included from Positional

#positionally

Methods included from Persistable::Poppable

#pop

Methods included from Persistable::Multipliable

#mul

Methods included from Persistable::Minable

#set_min

Methods included from Persistable::Maxable

#set_max

Methods included from Persistable::Logical

#bit

Methods included from Persistable::Incrementable

#inc

Methods included from Persistable::Destroyable

#destroy, #destroy!

Methods included from Persistable::Deletable

#delete

Methods included from Persistable::Creatable

#insert

Methods included from Matchable

#_matches?

Methods included from Inspectable

#inspect, #pretty_print

Methods included from Fields

#apply_default, #apply_defaults, #apply_post_processed_defaults, #apply_pre_processed_defaults, #attribute_names, #database_field_name, database_field_name, #dot_dollar_field?, #lazy_settable?, option, options, traverse_association_tree, #using_object_ids?, #validate_writable_field_name!

Methods included from Evolvable

#__evolve_object_id__

Methods included from Attributes

#assign_attributes, #attribute_missing?, #attribute_present?, #attributes_before_type_cast, #has_attribute?, #has_attribute_before_type_cast?, #process_raw_attribute, #read_attribute, #read_attribute_before_type_cast, #remove_attribute, #typed_attributes, #write_attribute, #write_attributes

Methods included from Attributes::Readonly

#attribute_writable?

Methods included from Attributes::Processing

#process_attributes

Methods included from Clients

clear, clients, default, disconnect, reconnect, set, with_name

Methods included from Clients::Sessions

included

Methods included from Clients::Options

#collection, #collection_name, #mongo_client, #persistence_context, #persistence_context?, #with

Methods included from Clients::StorageOptions

#remember_storage_options!, #storage_options

Methods included from Changeable

#attribute_before_last_save, #changed, #changed?, #changed_attributes, #changes, #children_changed?, #move_changes, #post_persist, #previous_changes, #remove_change, #saved_change_to_attribute, #saved_change_to_attribute?, #setters, #will_save_change_to_attribute?

Methods included from Atomic

#add_atomic_pull, #add_atomic_unset, #atomic_array_add_to_sets, #atomic_array_pulls, #atomic_array_pushes, #atomic_attribute_name, #atomic_delete_modifier, #atomic_insert_modifier, #atomic_path, #atomic_paths, #atomic_position, #atomic_pulls, #atomic_pushes, #atomic_sets, #atomic_unsets, #atomic_updates, #delayed_atomic_pulls, #delayed_atomic_sets, #delayed_atomic_unsets, #flag_as_destroyed, #flagged_destroys, #process_flagged_destroys

Instance Attribute Details

#__selected_fieldsObject

Returns the value of attribute __selected_fields.



30
31
32
# File 'lib/mongoid/document.rb', line 30

def __selected_fields
  @__selected_fields
end

#new_recordObject (readonly)

Returns the value of attribute new_record.



31
32
33
# File 'lib/mongoid/document.rb', line 31

def new_record
  @new_record
end

Instance Method Details

#_handle_callbacks_after_instantiation(execute_callbacks) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Handles the setup and execution of callbacks, if callbacks are to be executed; otherwise, adds the appropriate callbacks to the pending callbacks list.

Parameters:

  • execute_callbacks (true | false)

    Whether callbacks should be executed or not.



186
187
188
189
190
191
192
193
194
195
196
# File 'lib/mongoid/document.rb', line 186

def _handle_callbacks_after_instantiation(execute_callbacks)
  if execute_callbacks
    apply_defaults
    yield self if block_given?
    run_callbacks(:find) unless _find_callbacks.empty?
    run_callbacks(:initialize) unless _initialize_callbacks.empty?
  else
    yield self if block_given?
    self.pending_callbacks += %i[ apply_defaults find initialize ]
  end
end

#as_documentHash

Return a hash of the entire document hierarchy from this document and below. Used when the attributes are needed for everything and not just the current document.

Examples:

Get the full hierarchy.

person.as_document

Returns:

  • (Hash)

    A hash of all attributes in the hierarchy.



136
137
138
# File 'lib/mongoid/document.rb', line 136

def as_document
  BSON::Document.new(as_attributes)
end

#becomes(klass) ⇒ Document

Returns an instance of the specified class with the attributes, errors, and embedded documents of the current document.

Examples:

Return a subclass document as a superclass instance.

manager.becomes(Person)

Parameters:

  • klass (Class)

    The class to become.

Returns:

  • (Document)

    An instance of the specified class.

Raises:

  • (ArgumentError)

    If the class doesn’t include Mongoid::Document



151
152
153
154
155
156
157
158
# File 'lib/mongoid/document.rb', line 151

def becomes(klass)
  mongoid_document_check!(klass)

  became = klass.new(clone_document)
  became.internal_state = internal_state

  became
end

#freezeDocument

Freezes the internal attributes of the document.

Examples:

Freeze the document

document.freeze

Returns:



51
52
53
# File 'lib/mongoid/document.rb', line 51

def freeze
  as_attributes.freeze and self
end

#frozen?true | false

Checks if the document is frozen

Examples:

Check if frozen

document.frozen?

Returns:

  • (true | false)

    True if frozen, else false.



61
62
63
# File 'lib/mongoid/document.rb', line 61

def frozen?
  attributes.frozen?
end

#hashInteger

Delegates to identity in order to allow two records of the same identity to work with something like:

[ Person.find(1), Person.find(2), Person.find(3) ] &
[ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]

Examples:

Get the hash.

document.hash

Returns:

  • (Integer)

    The hash of the document’s identity.



75
76
77
# File 'lib/mongoid/document.rb', line 75

def hash
  identity.hash
end

#identityArray

A Document’s is identified absolutely by its class and database id:

Person.first.identity #=> [Person, BSON::ObjectId(‘4f775130a04745933a000003’)]

Examples:

Get the identity

document.identity

Returns:

  • (Array)

    An array containing [document.class, document._id]



87
88
89
# File 'lib/mongoid/document.rb', line 87

def identity
  [ self.class, _id ]
end

#initialize(attrs = nil, &block) ⇒ Document

Instantiate a new Document, setting the Document’s attributes if given. If no attributes are provided, they will be initialized with an empty Hash.

If a primary key is defined, the document’s id will be set to that key, otherwise it will be set to a fresh BSON::ObjectId string.

Examples:

Create a new document.

Person.new(:title => 'Sir')

Parameters:

  • attrs (Hash) (defaults to: nil)

    The attributes to set up the document with.

Returns:



104
105
106
# File 'lib/mongoid/document.rb', line 104

def initialize(attrs = nil, &block)
  construct_document(attrs, &block)
end

#internal_state=(state) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Sets the internal state of this document. Used only by #becomes to help initialize a retyped document.

Parameters:

  • state (Hash)

    The map of internal state values.



166
167
168
169
170
171
172
173
174
175
176
# File 'lib/mongoid/document.rb', line 166

def internal_state=(state)
  self._id = state[:id]
  @changed_attributes = state[:changed_attributes]
  @errors = ActiveModel::Errors.new(self).tap { |e| e.copy!(state[:errors]) }
  @new_record = state[:new_record]
  @destroyed = state[:destroyed]

  update_discriminator(state[:discriminator_key_was])

  mark_persisted_state_for_embedded_documents(state[:new_record])
end

#model_nameString

Return the model name of the document.

Examples:

Return the model name.

document.model_name

Returns:

  • (String)

    The model name.



114
115
116
# File 'lib/mongoid/document.rb', line 114

def model_name
  self.class.model_name
end

#to_keyString

Return the key value for the document.

Examples:

Return the key.

document.to_key

Returns:

  • (String)

    The id of the document or nil if new.



124
125
126
# File 'lib/mongoid/document.rb', line 124

def to_key
  (persisted? || destroyed?) ? [ _id.to_s ] : nil
end