module Mongoid::Persistable::Creatable
Defines behavior for persistence operations that create new documents.
Public Instance Methods
Insert a new document into the database. Will return the document itself whether or not the save was successful.
@example Insert a document.
document.insert
@param [ Hash ] options Options to pass to insert.
@return [ Document
] The persisted document.
# File lib/mongoid/persistable/creatable.rb, line 20 def insert(options = {}) prepare_insert(options) do if embedded? insert_as_embedded else insert_as_root end end end
Private Instance Methods
Get the atomic insert for embedded documents, either a push or set.
@api private
@example Get the inserts.
document.inserts
@return [ Hash ] The insert ops.
# File lib/mongoid/persistable/creatable.rb, line 40 def atomic_inserts { atomic_insert_modifier => { atomic_position => as_attributes }} end
Insert the embedded document.
@api private
@example Insert the document as embedded.
document.insert_as_embedded
@return [ Document
] The document.
# File lib/mongoid/persistable/creatable.rb, line 52 def insert_as_embedded raise Errors::NoParent.new(self.class.name) unless _parent if _parent.new_record? _parent.insert else selector = _parent.atomic_selector _root.collection.find(selector).update_one( positionally(selector, atomic_inserts), session: _session) end end
Insert the root document.
@api private
@example Insert the document as root.
document.insert_as_root
@return [ Document
] The document.
# File lib/mongoid/persistable/creatable.rb, line 72 def insert_as_root collection.insert_one(as_attributes, session: _session) end
Post process an insert, which sets the new record attribute to false and flags all the children as persisted.
@api private
@example Post process the insert.
document.post_process_insert
@return [ true ] true.
# File lib/mongoid/persistable/creatable.rb, line 85 def post_process_insert self.new_record = false remember_storage_options! flag_descendants_persisted true end
Prepare the insert for execution. Validates and runs callbacks, etc.
@api private
@example Prepare for insertion.
document.prepare_insert do collection.insert(as_document) end
@param [ Hash ] options The options.
@return [ Document
] The document.
# File lib/mongoid/persistable/creatable.rb, line 104 def prepare_insert(options = {}) raise Errors::ReadonlyDocument.new(self.class) if readonly? && !Mongoid.legacy_readonly return self if performing_validations?(options) && invalid?(options[:context] || :create) ensure_client_compatibility! run_callbacks(:commit, with_children: true, skip_if: -> { in_transaction? }) do run_callbacks(:save, with_children: false) do run_callbacks(:create, with_children: false) do run_callbacks(:persist_parent, with_children: false) do _mongoid_run_child_callbacks(:save) do _mongoid_run_child_callbacks(:create) do result = yield(self) if !result.is_a?(Document) || result.errors.empty? post_process_insert post_process_persist(result, options) end end end end end end end self end