Module: Mongoid::Threaded

Extended by:
Threaded
Included in:
Threaded
Defined in:
build/mongoid-7.0/lib/mongoid/threaded.rb,
build/mongoid-7.0/lib/mongoid/threaded/lifecycle.rb

Overview

This module contains logic for easy access to objects that have a lifecycle on the current thread.

Defined Under Namespace

Modules: Lifecycle

Constant Summary collapse

DATABASE_OVERRIDE_KEY =
"[mongoid]:db-override"
CLIENTS_KEY =

Constant for the key to store clients.

Since:

  • 5.0.0

"[mongoid]:clients"
CLIENT_OVERRIDE_KEY =

The key to override the client.

Since:

  • 5.0.0

"[mongoid]:client-override"
CURRENT_SCOPE_KEY =

The key for the current thread’s scope stack.

Since:

  • 2.0.0

"[mongoid]:current-scope"
AUTOSAVES_KEY =
"[mongoid]:autosaves"
VALIDATIONS_KEY =
"[mongoid]:validations"
STACK_KEYS =
Hash.new do |hash, key|
  hash[key] = "[mongoid]:#{key}-stack"
end
BIND =
'bind'.freeze
ASSIGN =
'assign'.freeze
BUILD =
'build'.freeze
LOAD =
'load'.freeze
CREATE =
'create'.freeze

Instance Method Summary collapse

Instance Method Details

#autosaved?(document) ⇒ true, false

Is the document autosaved on the current thread?

Examples:

Is the document autosaved?

Threaded.autosaved?(doc)

Parameters:

  • document (Document)

    The document to check.

Returns:

  • (true, false)

    If the document is autosaved.

Since:

  • 2.1.9



296
297
298
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 296

def autosaved?(document)
  autosaves_for(document.class).include?(document._id)
end

#autosavesHash

Get all autosaves on the current thread.

Examples:

Get all autosaves.

Threaded.autosaves

Returns:

  • (Hash)

    The current autosaves.

Since:

  • 3.0.0



322
323
324
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 322

def autosaves
  Thread.current[AUTOSAVES_KEY] ||= {}
end

#autosaves_for(klass) ⇒ Array

Get all autosaves on the current thread for the class.

Examples:

Get all autosaves.

Threaded.autosaves_for(Person)

Parameters:

  • klass (Class)

    The class to check.

Returns:

  • (Array)

    The current autosaves.

Since:

  • 3.0.0



348
349
350
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 348

def autosaves_for(klass)
  autosaves[klass] ||= []
end

#begin_autosave(document) ⇒ Object

Begin autosaving a document on the current thread.

Examples:

Begin autosave.

Threaded.begin_autosave(doc)

Parameters:

  • document (Document)

    The document to autosave.

Since:

  • 3.0.0



126
127
128
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 126

def begin_autosave(document)
  autosaves_for(document.class).push(document._id)
end

#begin_execution(name) ⇒ true

Begin entry into a named thread local stack.

Examples:

Begin entry into the stack.

Threaded.begin_execution(:create)

Parameters:

  • name (String)

    The name of the stack

Returns:

  • (true)

    True.

Since:

  • 2.4.0



46
47
48
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 46

def begin_execution(name)
  stack(name).push(true)
end

#begin_validate(document) ⇒ Object

Begin validating a document on the current thread.

Examples:

Begin validation.

Threaded.begin_validate(doc)

Parameters:

  • document (Document)

    The document to validate.

Since:

  • 2.1.9



138
139
140
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 138

def begin_validate(document)
  validations_for(document.class).push(document._id)
end

#begin_without_default_scope(klass) ⇒ 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.

Begin suppressing default scopes for given model on the current thread.

Examples:

Begin without default scope stack.

Threaded.begin_without_default_scope(klass)

Parameters:

  • klass (Class)

    The model to suppress default scoping on.



174
175
176
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 174

def begin_without_default_scope(klass)
  stack(:without_default_scope).push(klass)
end

#clear_sessionnil

Clear the cached session for this thread.

Examples:

Clear this thread’s session.

Threaded.clear_session

Returns:

  • (nil)

Since:

  • 6.4.0



397
398
399
400
401
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 397

def clear_session
  session = get_session
  session.end_session if session
  Thread.current[:session] = nil
end

#client_overrideString, Symbol

Get the global client override.

Examples:

Get the global client override.

Threaded.client_override

Returns:

  • (String, Symbol)

    The override.

Since:

  • 5.0.0



198
199
200
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 198

def client_override
  Thread.current[CLIENT_OVERRIDE_KEY]
end

#client_override=(name) ⇒ String, Symbol

Set the global client override.

Examples:

Set the global client override.

Threaded.client_override = :testing

Parameters:

  • name (String, Symbol)

    The global override name.

Returns:

  • (String, Symbol)

    The override.

Since:

  • 3.0.0



212
213
214
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 212

def client_override=(name)
  Thread.current[CLIENT_OVERRIDE_KEY] = name
end

#current_scope(klass = nil) ⇒ Criteria

Get the current Mongoid scope.

Examples:

Get the scope.

Threaded.current_scope(klass)
Threaded.current_scope

Parameters:

  • klass (Klass) (defaults to: nil)

    The class type of the scope.

Returns:

Since:

  • 5.0.0



227
228
229
230
231
232
233
234
235
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 227

def current_scope(klass = nil)
  if klass && Thread.current[CURRENT_SCOPE_KEY].respond_to?(:keys)
    Thread.current[CURRENT_SCOPE_KEY][
        Thread.current[CURRENT_SCOPE_KEY].keys.find { |k| k <= klass }
    ]
  else
    Thread.current[CURRENT_SCOPE_KEY]
  end
end

#current_scope=(scope) ⇒ Criteria

Set the current Mongoid scope.

Examples:

Set the scope.

Threaded.current_scope = scope

Parameters:

  • scope (Criteria)

    The current scope.

Returns:

Since:

  • 5.0.0



247
248
249
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 247

def current_scope=(scope)
  Thread.current[CURRENT_SCOPE_KEY] = scope
end

#database_overrideString, Symbol

Get the global database override.

Examples:

Get the global database override.

Threaded.database_override

Returns:

  • (String, Symbol)

    The override.

Since:

  • 3.0.0



58
59
60
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 58

def database_override
  Thread.current[DATABASE_OVERRIDE_KEY]
end

#database_override=(name) ⇒ String, Symbol

Set the global database override.

Examples:

Set the global database override.

Threaded.database_override = :testing

Parameters:

  • name (String, Symbol)

    The global override name.

Returns:

  • (String, Symbol)

    The override.

Since:

  • 3.0.0



72
73
74
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 72

def database_override=(name)
  Thread.current[DATABASE_OVERRIDE_KEY] = name
end

#executing?(name) ⇒ true

Are in the middle of executing the named stack

Examples:

Are we in the stack execution?

Threaded.executing?(:create)

Parameters:

  • name (Symbol)

    The name of the stack

Returns:

  • (true)

    If the stack is being executed.

Since:

  • 2.4.0



86
87
88
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 86

def executing?(name)
  !stack(name).empty?
end

#exit_autosave(document) ⇒ Object

Exit autosaving a document on the current thread.

Examples:

Exit autosave.

Threaded.exit_autosave(doc)

Parameters:

  • document (Document)

    The document to autosave.

Since:

  • 3.0.0



150
151
152
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 150

def exit_autosave(document)
  autosaves_for(document.class).delete_one(document._id)
end

#exit_execution(name) ⇒ true

Exit from a named thread local stack.

Examples:

Exit from the stack.

Threaded.exit_execution(:create)

Parameters:

  • name (Symbol)

    The name of the stack

Returns:

  • (true)

    True.

Since:

  • 2.4.0



100
101
102
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 100

def exit_execution(name)
  stack(name).pop
end

#exit_validate(document) ⇒ Object

Exit validating a document on the current thread.

Examples:

Exit validation.

Threaded.exit_validate(doc)

Parameters:

  • document (Document)

    The document to validate.

Since:

  • 2.1.9



162
163
164
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 162

def exit_validate(document)
  validations_for(document.class).delete_one(document._id)
end

#exit_without_default_scope(klass) ⇒ 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.

Exit suppressing default scopes for given model on the current thread.

Examples:

Exit without default scope stack.

Threaded.exit_without_default_scope(klass)

Parameters:

  • klass (Class)

    The model to unsuppress default scoping on.



186
187
188
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 186

def exit_without_default_scope(klass)
  stack(:without_default_scope).delete(klass)
end

#get_sessionMongo::Session?

Get the cached session for this thread.

Examples:

Get the session for this thread.

Threaded.get_session

Returns:

  • (Mongo::Session, nil)

    The session cached on this thread or nil.

Since:

  • 6.4.0



385
386
387
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 385

def get_session
  Thread.current[:session]
end

#set_current_scope(scope, klass) ⇒ Criteria

Set the current Mongoid scope. Safe for multi-model scope chaining.

Examples:

Set the scope.

Threaded.current_scope(scope, klass)

Parameters:

  • scope (Criteria)

    The current scope.

  • klass (Class)

    The current model class.

Returns:

Since:

  • 5.0.1



262
263
264
265
266
267
268
269
270
271
272
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 262

def set_current_scope(scope, klass)
  if scope.nil?
    if Thread.current[CURRENT_SCOPE_KEY]
      Thread.current[CURRENT_SCOPE_KEY].delete(klass)
      Thread.current[CURRENT_SCOPE_KEY] = nil if Thread.current[CURRENT_SCOPE_KEY].empty?
    end
  else
    Thread.current[CURRENT_SCOPE_KEY] ||= {}
    Thread.current[CURRENT_SCOPE_KEY][klass] = scope
  end
end

#set_session(session) ⇒ Object

Cache a session for this thread.

Examples:

Save a session for this thread.

Threaded.set_session(session)

Parameters:

  • session (Mongo::Session)

    The session to save.

Since:

  • 6.4.0



373
374
375
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 373

def set_session(session)
  Thread.current[:session] = session
end

#stack(name) ⇒ Array

Get the named stack.

Examples:

Get a stack by name

Threaded.stack(:create)

Parameters:

  • name (Symbol)

    The name of the stack

Returns:

  • (Array)

    The stack.

Since:

  • 2.4.0



114
115
116
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 114

def stack(name)
  Thread.current[STACK_KEYS[name]] ||= []
end

#validated?(document) ⇒ true, false

Is the document validated on the current thread?

Examples:

Is the document validated?

Threaded.validated?(doc)

Parameters:

  • document (Document)

    The document to check.

Returns:

  • (true, false)

    If the document is validated.

Since:

  • 2.1.9



310
311
312
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 310

def validated?(document)
  validations_for(document.class).include?(document._id)
end

#validationsHash

Get all validations on the current thread.

Examples:

Get all validations.

Threaded.validations

Returns:

  • (Hash)

    The current validations.

Since:

  • 2.1.9



334
335
336
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 334

def validations
  Thread.current[VALIDATIONS_KEY] ||= {}
end

#validations_for(klass) ⇒ Array

Get all validations on the current thread for the class.

Examples:

Get all validations.

Threaded.validations_for(Person)

Parameters:

  • klass (Class)

    The class to check.

Returns:

  • (Array)

    The current validations.

Since:

  • 2.1.9



361
362
363
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 361

def validations_for(klass)
  validations[klass] ||= []
end

#without_default_scope?(klass) ⇒ Boolean

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.

Is the given klass’ default scope suppressed on the current thread?

Examples:

Is the given klass’ default scope suppressed?

Threaded.without_default_scope?(klass)

Parameters:

  • klass (Class)

    The model to check for default scope suppression.

Returns:



282
283
284
# File 'build/mongoid-7.0/lib/mongoid/threaded.rb', line 282

def without_default_scope?(klass)
  stack(:without_default_scope).include?(klass)
end