Module: Mongoid::Clients::Sessions

Included in:
Mongoid::Clients, Mongoid::Criteria
Defined in:
build/mongoid-7.3/lib/mongoid/clients/sessions.rb

Overview

Encapsulates behavior for getting a session from the client of a model class or instance, setting the session on the current thread, and yielding to a block. The session will be closed after the block completes or raises an error.

Since:

  • 6.4.0

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#with_session(options = {}) {|The| ... } ⇒ Object

Note:

You cannot do any operations in the block using models or objects that use a different client; the block will execute all operations in the context of the implicit session and operations on any models using another client will fail. For example, if you set a client using store_in on a particular model and execute an operation on it in the session context block, that operation can’t use the block’s session and an error will be raised. An error will also be raised if sessions are nested.

Execute a block within the context of a session.

Examples:

Execute some operations in the context of a session.

band.with_session(causal_consistency: true) do
  band.records << Record.create
  band.name = 'FKA Twigs'
  band.save
  band.reload
end

Parameters:

  • options (Hash) (defaults to: {})

    The session options. Please see the driver documentation for the available session options.

Yield Parameters:

  • The (Mongo::Session)

    session being used for the block.

Returns:

  • (Object)

    The result of calling the block.

Raises:

  • (Errors::InvalidSessionUse)

    If an operation is attempted on a model using another client from which the session was started or if sessions are nested.

Since:

  • 6.4.0



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'build/mongoid-7.3/lib/mongoid/clients/sessions.rb', line 43

def with_session(options = {})
  if Threaded.get_session
    raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
  end
  session = persistence_context.client.start_session(options)
  Threaded.set_session(session)
  yield(session)
rescue Mongo::Error::InvalidSession => ex
  if
    # Driver 2.13.0+
    defined?(Mongo::Error::SessionsNotSupported) &&
      Mongo::Error::SessionsNotSupported === ex ||
    # Legacy drivers
    ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
  then
    raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
  end
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
ensure
  Threaded.clear_session
end