class Mongoid::PersistenceContext
Object
encapsulating logic for setting/getting a collection and database name and a client with particular options to use when persisting models.
@since 6.0.0
Constants
- EXTRA_OPTIONS
Extra options in addition to driver client options that determine the persistence context.
@return [ Array<Symbol> ] The list of extra options besides client options
that determine the persistence context.
@since 6.0.0
- VALID_OPTIONS
The full list of valid persistence context options.
@return [ Array<Symbol> ] The full list of options defining the persistence
context.
@since 6.0.0
Attributes
The options defining this persistence context.
@return [ Hash ] The persistence context options.
@since 6.0.0
Public Class Methods
Initialize the persistence context object.
@example Create a new persistence context.
PersistenceContext.new(model, collection: 'other')
@param [ Object
] object The class or model instance for which a persistence context
should be created.
@param [ Hash ] opts The persistence context options.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 55 def initialize(object, opts = {}) @object = object set_options!(opts) end
Private Class Methods
Clear the persistence context for a particular class or model instance.
@example Clear the persistence context for a class or model instance.
PersistenceContext.clear(model)
@param [ Class, Object
] object The class or model instance. @param [ Mongo::Cluster ] cluster The original cluster before this context was used. @param [ Mongoid::PersistenceContext
] original_context The original persistence
context that was set before this context was used.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 238 def clear(object, cluster = nil, original_context = nil) if context = get(object) unless cluster.nil? || context.cluster.equal?(cluster) context.client.close end end ensure Thread.current["[mongoid][#{object.object_id}]:context"] = original_context end
Get the persistence context for a particular class or model instance.
@example Get the persistence context for a class or model instance.
PersistenceContext.get(model)
@param [ Object
] object The class or model instance.
@return [ Mongoid::PersistenceContext
] The persistence context for the object.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 223 def get(object) Thread.current["[mongoid][#{object.object_id}]:context"] end
Set the persistence context for a particular class or model instance.
If there already is a persistence context set, options in the existing context are combined with options given to the set call.
@example Set the persistence context for a class or model instance.
PersistenceContext.set(model)
@param [ Object
] object The class or model instance. @param [ Hash, Mongoid::PersistenceContext
] options_or_context The persistence
options or a persistence context object.
@return [ Mongoid::PersistenceContext
] The persistence context for the object.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 197 def set(object, options_or_context) key = "[mongoid][#{object.object_id}]:context" existing_context = Thread.current[key] existing_options = if existing_context existing_context.options else {} end if options_or_context.is_a?(PersistenceContext) options_or_context = options_or_context.options end new_options = existing_options.merge(options_or_context) context = PersistenceContext.new(object, new_options) Thread.current[key] = context end
Public Instance Methods
Determine if this persistence context is equal to another.
@example Compare two persistence contexts.
context == other_context
@param [ Object
] other The object to be compared with this one.
@return [ true, false ] Whether the two persistence contexts are equal.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 141 def ==(other) return false unless other.is_a?(PersistenceContext) options == other.options end
Get the client for this persistence context.
@example Get the client for this persistence context.
context.client
@return [ Mongo::Client ] The client for this persistence
context.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 112 def client @client ||= begin client = Clients.with_name(client_name) if database_name_option client = client.use(database_name) end unless client_options.empty? client = client.with(client_options) end client end end
# File lib/mongoid/persistence_context.rb, line 125 def client_name @client_name ||= options[:client] || Threaded.client_override || storage_options && __evaluate__(storage_options[:client]) end
Get the collection for this persistence context.
@example Get the collection for this persistence context.
context.collection
@param [ Object
] parent The parent object whose collection name is used
instead of this persistence context's collection name.
@return [ Mongo::Collection ] The collection for this persistence
context.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 72 def collection(parent = nil) parent ? parent.collection.with(client_options) : client[collection_name.to_sym] end
Get the collection name for this persistence context.
@example Get the collection name for this persistence context.
context.collection_name
@return [ String ] The collection name for this persistence
context.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 85 def collection_name @collection_name ||= (__evaluate__(options[:collection] || storage_options[:collection])) end
Get the database name for this persistence context.
@example Get the database name for this persistence context.
context.database_name
@return [ String ] The database name for this persistence
context.
@since 6.0.0
# File lib/mongoid/persistence_context.rb, line 99 def database_name __evaluate__(database_name_option) || client.database.name end
Private Instance Methods
# File lib/mongoid/persistence_context.rb, line 157 def __evaluate__(name) return nil unless name name.respond_to?(:call) ? name.call.to_sym : name.to_sym end
# File lib/mongoid/persistence_context.rb, line 162 def client_options @client_options ||= begin opts = options.select do |k, v| Mongo::Client::VALID_OPTIONS.include?(k.to_sym) end if opts[:read].is_a?(Symbol) opts[:read] = {mode: opts[:read]} end opts end end
# File lib/mongoid/persistence_context.rb, line 174 def database_name_option @database_name_option ||= options[:database] || Threaded.database_override || storage_options && storage_options[:database] end
# File lib/mongoid/persistence_context.rb, line 148 def set_options!(opts) @options ||= opts.each.reduce({}) do |_options, (key, value)| unless VALID_OPTIONS.include?(key.to_sym) raise Errors::InvalidPersistenceOption.new(key.to_sym, VALID_OPTIONS) end value ? _options.merge!(key => value) : _options end end