mongoid 7.0.2 → 7.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/mongoid/association/referenced/eager.rb +4 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +3 -1
- data/lib/mongoid/association/referenced/has_many/proxy.rb +2 -2
- data/lib/mongoid/association/relatable.rb +90 -10
- data/lib/mongoid/clients/options.rb +6 -4
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +33 -6
- data/lib/mongoid/document.rb +11 -4
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/matchable.rb +3 -1
- data/lib/mongoid/matchable/eq.rb +22 -0
- data/lib/mongoid/matchable/ne.rb +1 -1
- data/lib/mongoid/persistence_context.rb +20 -5
- data/lib/mongoid/query_cache.rb +8 -4
- data/lib/mongoid/railtie.rb +17 -0
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/threaded.rb +36 -0
- data/lib/mongoid/version.rb +1 -1
- data/spec/app/models/minim.rb +7 -0
- data/spec/app/models/store_as_dup_test3.rb +7 -0
- data/spec/app/models/store_as_dup_test4.rb +7 -0
- data/spec/config/mongoid.yml +12 -3
- data/spec/integration/associations/belongs_to_spec.rb +13 -0
- data/spec/lite_spec_helper.rb +56 -0
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +24 -5
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +46 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +21 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +3 -3
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
- data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +3 -3
- data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +51 -4
- data/spec/mongoid/clients/factory_spec.rb +24 -18
- data/spec/mongoid/clients/options_spec.rb +40 -37
- data/spec/mongoid/clients_spec.rb +68 -8
- data/spec/mongoid/config_spec.rb +3 -1
- data/spec/mongoid/contextual/mongo_spec.rb +5 -2
- data/spec/mongoid/copyable_spec.rb +40 -6
- data/spec/mongoid/copyable_spec_models.rb +17 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +18 -3
- data/spec/mongoid/document_spec.rb +81 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +1 -1
- data/spec/mongoid/matchable/eq_spec.rb +48 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistence_context_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +59 -6
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +35 -25
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/spec_config.rb +39 -0
- metadata +471 -460
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f9840f2a5bdcfd628358c56f70818857080118680059a6ca299c6de3b4554c2
|
4
|
+
data.tar.gz: f8700656e769546f2c8d2555013aa601d10552e9e48faf37f24c66fded700b1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a05fb92510939cf2ccff55855219033db8a9a45399865f725e695af95a9501f72a0db72422766dd54fc9946854e0065b9beb870bfeb3a02b8ac9e605962419e0
|
7
|
+
data.tar.gz: 267ff19b100ca5ef83f383ddd8d4ece8ce0e122a16cbc6c1605bc872e391ad775bd6336beb53af733ba8d7b47d9ec01d9842f5502c7f0c135cdc2fa258b80b47
|
data/README.md
CHANGED
@@ -64,7 +64,10 @@ module Mongoid
|
|
64
64
|
#
|
65
65
|
# @since 4.0.0
|
66
66
|
def each_loaded_document
|
67
|
-
|
67
|
+
doc_keys = keys_from_docs
|
68
|
+
return @association.klass.none if doc_keys.all?(&:nil?)
|
69
|
+
|
70
|
+
criteria = @association.klass.any_in(key => doc_keys)
|
68
71
|
criteria.inclusions = criteria.inclusions - [@association]
|
69
72
|
criteria.each do |doc|
|
70
73
|
yield doc
|
@@ -135,7 +135,9 @@ module Mongoid
|
|
135
135
|
end
|
136
136
|
unless _association.forced_nil_inverse?
|
137
137
|
if replacement
|
138
|
-
objects_to_clear = _base.send(foreign_key) - replacement.collect
|
138
|
+
objects_to_clear = _base.send(foreign_key) - replacement.collect do |object|
|
139
|
+
object.send(_association.primary_key)
|
140
|
+
end
|
139
141
|
criteria(objects_to_clear).pull(inverse_foreign_key => _base._id)
|
140
142
|
else
|
141
143
|
criteria.pull(inverse_foreign_key => _base._id)
|
@@ -284,7 +284,7 @@ module Mongoid
|
|
284
284
|
new_ids = new_docs.map { |doc| doc._id }
|
285
285
|
remove_not_in(new_ids)
|
286
286
|
new_docs.each do |doc|
|
287
|
-
docs.push(doc) if doc.send(foreign_key) != _base.
|
287
|
+
docs.push(doc) if doc.send(foreign_key) != _base.send(_association.primary_key)
|
288
288
|
end
|
289
289
|
concat(docs)
|
290
290
|
else
|
@@ -303,7 +303,7 @@ module Mongoid
|
|
303
303
|
#
|
304
304
|
# @since 2.4.0
|
305
305
|
def unscoped
|
306
|
-
klass.unscoped.where(foreign_key => _base.
|
306
|
+
klass.unscoped.where(foreign_key => _base.send(_association.primary_key))
|
307
307
|
end
|
308
308
|
|
309
309
|
private
|
@@ -147,23 +147,64 @@ module Mongoid
|
|
147
147
|
|
148
148
|
# The class name of the relation object(s).
|
149
149
|
#
|
150
|
-
#
|
150
|
+
# The class name may be fully qualified or may be specified relative
|
151
|
+
# to the class on which the association is defined (this class is
|
152
|
+
# accessible as inverse_class). If :class_name option is given in the
|
153
|
+
# association, the exact value of that option is returned here for
|
154
|
+
# backwards compatibility reasons. If :class_name option is not given,
|
155
|
+
# the name of the class computed by Mongoid to be the association target
|
156
|
+
# is returned, and it will be fully qualified.
|
157
|
+
#
|
158
|
+
# The class name returned by this method may not correspond to a defined
|
159
|
+
# class. The return value of the method is the class name that Mongoid
|
160
|
+
# would reference, relative to the host document class, when it needs to
|
161
|
+
# perform operations on the association target.
|
162
|
+
#
|
163
|
+
# @note The return value of this method should not be used to determine
|
164
|
+
# whether two associations have the same target class, because the
|
165
|
+
# return value is not always a fully qualified class name. To compare
|
166
|
+
# classes, retrieve the class instance of the association target using
|
167
|
+
# the +relation_class+ method.
|
168
|
+
#
|
169
|
+
# @return [ String ] The association objects' class name.
|
151
170
|
#
|
152
171
|
# @since 7.0
|
153
172
|
def relation_class_name
|
154
|
-
@class_name ||= @options[:class_name] ||
|
173
|
+
@class_name ||= @options[:class_name] || begin
|
174
|
+
cls_name = ActiveSupport::Inflector.classify(name)
|
175
|
+
begin
|
176
|
+
cls_name = resolve_name(inverse_class, cls_name).name
|
177
|
+
rescue NameError
|
178
|
+
# ignore
|
179
|
+
end
|
180
|
+
cls_name
|
181
|
+
end
|
155
182
|
end
|
156
183
|
alias :class_name :relation_class_name
|
157
184
|
|
158
185
|
# The class of the relation object(s).
|
159
186
|
#
|
160
|
-
#
|
187
|
+
# This method returns the class instance corresponding to
|
188
|
+
# +relation_class_name+, resolved relative to the host document class.
|
189
|
+
#
|
190
|
+
# If the class does not exist, this method raises NameError. This can
|
191
|
+
# happen because the target class has not yet been defined. Note that
|
192
|
+
# polymorphic associations generally do not have a well defined target
|
193
|
+
# class because the target class can change from one object to another,
|
194
|
+
# and calling this method on a polymorphic association will generally
|
195
|
+
# fail with a NameError or produce misleading results (if a class does
|
196
|
+
# happen to be defined with the same name as the association name).
|
197
|
+
#
|
198
|
+
# @return [ String ] The association objects' class.
|
161
199
|
#
|
162
200
|
# @since 7.0
|
163
|
-
def
|
164
|
-
@klass ||=
|
201
|
+
def relation_class
|
202
|
+
@klass ||= begin
|
203
|
+
cls_name = @options[:class_name] || ActiveSupport::Inflector.classify(name)
|
204
|
+
resolve_name(inverse_class, cls_name)
|
205
|
+
end
|
165
206
|
end
|
166
|
-
alias :
|
207
|
+
alias :klass :relation_class
|
167
208
|
|
168
209
|
# The class name of the object owning this relation.
|
169
210
|
#
|
@@ -325,10 +366,6 @@ module Mongoid
|
|
325
366
|
|
326
367
|
private
|
327
368
|
|
328
|
-
def name_with_module
|
329
|
-
@module_path + name.to_s.capitalize
|
330
|
-
end
|
331
|
-
|
332
369
|
# Gets the model classes with inverse associations of this model. This is used to determine
|
333
370
|
# the classes on the other end of polymorphic relations with models.
|
334
371
|
def inverse_association_classes
|
@@ -424,6 +461,49 @@ module Mongoid
|
|
424
461
|
def default_inverse
|
425
462
|
@default_inverse ||= klass.relations[inverse_klass.name.underscore]
|
426
463
|
end
|
464
|
+
|
465
|
+
# Returns an array of classes/modules forming the namespace hierarchy
|
466
|
+
# where symbols referenced in the provided class/module would be looked
|
467
|
+
# up by Ruby. For example, if mod is Foo::Bar, this method would return
|
468
|
+
# [Foo::Bar, Foo, Object].
|
469
|
+
def namespace_hierarchy(mod)
|
470
|
+
parent = Object
|
471
|
+
hier = [parent]
|
472
|
+
mod.name.split('::').each do |part|
|
473
|
+
parent = parent.const_get(part)
|
474
|
+
hier << parent
|
475
|
+
end
|
476
|
+
hier.reverse
|
477
|
+
end
|
478
|
+
|
479
|
+
# Resolves the given class/module name in the context of the specified
|
480
|
+
# module, as Ruby would when a constant is referenced in the source.
|
481
|
+
def resolve_name(mod, name)
|
482
|
+
cls = exc = nil
|
483
|
+
parts = name.to_s.split('::')
|
484
|
+
namespace_hierarchy(mod).each do |ns|
|
485
|
+
begin
|
486
|
+
parts.each do |part|
|
487
|
+
# Simple const_get sometimes pulls names out of weird scopes,
|
488
|
+
# perhaps confusing the receiver (ns in this case) with the
|
489
|
+
# local scope. Walk the class hierarchy ourselves one node
|
490
|
+
# at a time by specifying false as the second argument.
|
491
|
+
ns = ns.const_get(part, false)
|
492
|
+
end
|
493
|
+
cls = ns
|
494
|
+
break
|
495
|
+
rescue NameError => e
|
496
|
+
if exc.nil?
|
497
|
+
exc = e
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|
501
|
+
if cls.nil?
|
502
|
+
# Raise the first exception, this is from the most specific namespace
|
503
|
+
raise exc
|
504
|
+
end
|
505
|
+
cls
|
506
|
+
end
|
427
507
|
end
|
428
508
|
end
|
429
509
|
end
|
@@ -20,11 +20,12 @@ module Mongoid
|
|
20
20
|
#
|
21
21
|
# @since 6.0.0
|
22
22
|
def with(options_or_context, &block)
|
23
|
+
original_context = PersistenceContext.get(self)
|
23
24
|
original_cluster = persistence_context.cluster
|
24
25
|
set_persistence_context(options_or_context)
|
25
26
|
yield self
|
26
27
|
ensure
|
27
|
-
clear_persistence_context(original_cluster)
|
28
|
+
clear_persistence_context(original_cluster, original_context)
|
28
29
|
end
|
29
30
|
|
30
31
|
def collection(parent = nil)
|
@@ -51,8 +52,8 @@ module Mongoid
|
|
51
52
|
PersistenceContext.set(self, options_or_context)
|
52
53
|
end
|
53
54
|
|
54
|
-
def clear_persistence_context(original_cluster = nil)
|
55
|
-
PersistenceContext.clear(self, original_cluster)
|
55
|
+
def clear_persistence_context(original_cluster = nil, context = nil)
|
56
|
+
PersistenceContext.clear(self, original_cluster, context)
|
56
57
|
end
|
57
58
|
|
58
59
|
module ClassMethods
|
@@ -92,11 +93,12 @@ module Mongoid
|
|
92
93
|
#
|
93
94
|
# @since 6.0.0
|
94
95
|
def with(options, &block)
|
96
|
+
original_context = PersistenceContext.get(self)
|
95
97
|
original_cluster = persistence_context.cluster
|
96
98
|
PersistenceContext.set(self, options)
|
97
99
|
yield self
|
98
100
|
ensure
|
99
|
-
PersistenceContext.clear(self, original_cluster)
|
101
|
+
PersistenceContext.clear(self, original_cluster, original_context)
|
100
102
|
end
|
101
103
|
|
102
104
|
def persistence_context
|
data/lib/mongoid/copyable.rb
CHANGED
@@ -73,8 +73,8 @@ module Mongoid
|
|
73
73
|
next unless attrs.present? && attrs[association.key].present?
|
74
74
|
|
75
75
|
if association.is_a?(Association::Embedded::EmbedsMany)
|
76
|
-
attrs[association.
|
77
|
-
embedded_klass = attr.fetch('_type', association.
|
76
|
+
attrs[association.key].each do |attr|
|
77
|
+
embedded_klass = attr.fetch('_type', association.relation_class_name).constantize
|
78
78
|
process_localized_attributes(embedded_klass, attr)
|
79
79
|
end
|
80
80
|
else
|
@@ -17,8 +17,8 @@ module Mongoid
|
|
17
17
|
PersistenceContext.set(klass, options)
|
18
18
|
end
|
19
19
|
|
20
|
-
def clear_persistence_context(original_cluster)
|
21
|
-
PersistenceContext.clear(klass, original_cluster)
|
20
|
+
def clear_persistence_context(original_cluster, original_context)
|
21
|
+
PersistenceContext.clear(klass, original_cluster, original_context)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -134,13 +134,21 @@ module Mongoid
|
|
134
134
|
::Boolean.evolve(value)
|
135
135
|
end
|
136
136
|
|
137
|
-
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
138
|
-
# the examples to expand the criteria.
|
137
|
+
# Add a $geoIntersects or $geoWithin selection. Symbol operators must
|
138
|
+
# be used as shown in the examples to expand the criteria.
|
139
139
|
#
|
140
140
|
# @note The only valid geometry shapes for a $geoIntersects are:
|
141
141
|
# :intersects_line, :intersects_point, and :intersects_polygon.
|
142
142
|
#
|
143
|
-
# @note The only valid
|
143
|
+
# @note The only valid options for a $geoWithin query are the geometry
|
144
|
+
# shape :within_polygon and the operator :within_box.
|
145
|
+
#
|
146
|
+
# @note The :within_box operator for the $geoWithin query expects the
|
147
|
+
# lower left (south west) coordinate pair as the first argument and
|
148
|
+
# the upper right (north east) as the second argument.
|
149
|
+
# Important: When latitude and longitude are passed, longitude is
|
150
|
+
# expected as the first element of the coordinate pair.
|
151
|
+
# Source: https://docs.mongodb.com/manual/reference/operator/query/box/
|
144
152
|
#
|
145
153
|
# @example Add a geo intersect criterion for a line.
|
146
154
|
# query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
@@ -154,6 +162,9 @@ module Mongoid
|
|
154
162
|
# @example Add a geo within criterion for a polygon.
|
155
163
|
# query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
|
156
164
|
#
|
165
|
+
# @example Add a geo within criterion for a box.
|
166
|
+
# query.geo_spacial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
|
167
|
+
#
|
157
168
|
# @param [ Hash ] criterion The criterion.
|
158
169
|
#
|
159
170
|
# @return [ Selectable ] The cloned selectable.
|
@@ -174,6 +185,7 @@ module Mongoid
|
|
174
185
|
key :within_polygon, :override, "$geoWithin", "$geometry" do |value|
|
175
186
|
{ "type" => POLYGON, "coordinates" => value }
|
176
187
|
end
|
188
|
+
key :within_box, :override, "$geoWithin", "$box"
|
177
189
|
|
178
190
|
# Add the $gt criterion to the selector.
|
179
191
|
#
|
@@ -501,6 +513,11 @@ module Mongoid
|
|
501
513
|
# @example Construct a text search selector with options.
|
502
514
|
# selectable.text_search("testing", :$language => "fr")
|
503
515
|
#
|
516
|
+
# @note Per https://docs.mongodb.com/manual/reference/operator/query/text/
|
517
|
+
# it is not currently possible to supply multiple text search
|
518
|
+
# conditions in a query. Mongoid will build such a query but the
|
519
|
+
# server will return an error when trying to execute it.
|
520
|
+
#
|
504
521
|
# @param [ String, Symbol ] terms A string of terms that MongoDB parses
|
505
522
|
# and uses to query the text index.
|
506
523
|
# @param [ Hash ] opts Text search options. See MongoDB documentation
|
@@ -512,9 +529,19 @@ module Mongoid
|
|
512
529
|
def text_search(terms, opts = nil)
|
513
530
|
clone.tap do |query|
|
514
531
|
if terms
|
515
|
-
criterion = {
|
516
|
-
criterion[
|
517
|
-
query.selector
|
532
|
+
criterion = {'$text' => { '$search' => terms }}
|
533
|
+
criterion['$text'].merge!(opts) if opts
|
534
|
+
if query.selector['$text']
|
535
|
+
# Per https://docs.mongodb.com/manual/reference/operator/query/text/
|
536
|
+
# multiple $text expressions are not currently supported by
|
537
|
+
# MongoDB server, but build the query correctly instead of
|
538
|
+
# overwriting previous text search condition with the currently
|
539
|
+
# given one.
|
540
|
+
Mongoid.logger.warn('Multiple $text expressions per query are not currently supported by the server')
|
541
|
+
query.selector = {'$and' => [query.selector]}.merge(criterion)
|
542
|
+
else
|
543
|
+
query.selector = query.selector.merge(criterion)
|
544
|
+
end
|
518
545
|
end
|
519
546
|
end
|
520
547
|
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -180,6 +180,13 @@ module Mongoid
|
|
180
180
|
|
181
181
|
# Calls #as_json on the document with additional, Mongoid-specific options.
|
182
182
|
#
|
183
|
+
# @note Rails 6 changes return value of as_json for non-primitive types
|
184
|
+
# such as BSON::ObjectId. In Rails <= 5, as_json returned these as
|
185
|
+
# instances of the class. In Rails 6, these are returned serialized to
|
186
|
+
# primitive types (e.g. {"$oid"=>"5bcfc40bde340b37feda98e9"}).
|
187
|
+
# See https://github.com/rails/rails/commit/2e5cb980a448e7f4ab00df6e9ad4c1cc456616aa
|
188
|
+
# for more information.
|
189
|
+
#
|
183
190
|
# @example Get the document as json.
|
184
191
|
# document.as_json(compact: true)
|
185
192
|
#
|
@@ -192,11 +199,11 @@ module Mongoid
|
|
192
199
|
#
|
193
200
|
# @since 5.1.0
|
194
201
|
def as_json(options = nil)
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
super(options)
|
202
|
+
rv = super
|
203
|
+
if options && options[:compact]
|
204
|
+
rv = rv.compact
|
199
205
|
end
|
206
|
+
rv
|
200
207
|
end
|
201
208
|
|
202
209
|
# Returns an instance of the specified class with the attributes,
|
@@ -53,7 +53,7 @@ module Mongoid
|
|
53
53
|
#
|
54
54
|
# @since 3.0.0
|
55
55
|
def demongoize(object)
|
56
|
-
object && object.numeric? ?
|
56
|
+
object && object.numeric? ? BigDecimal(object.to_s) : nil
|
57
57
|
end
|
58
58
|
|
59
59
|
# Mongoize an object of any type to how it's stored in the db as a String.
|
data/lib/mongoid/matchable.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require "mongoid/matchable/default"
|
3
3
|
require "mongoid/matchable/all"
|
4
4
|
require "mongoid/matchable/and"
|
5
|
+
require "mongoid/matchable/eq"
|
5
6
|
require "mongoid/matchable/exists"
|
6
7
|
require "mongoid/matchable/gt"
|
7
8
|
require "mongoid/matchable/gte"
|
@@ -32,6 +33,7 @@ module Mongoid
|
|
32
33
|
"$all" => All,
|
33
34
|
"$elemMatch" => ElemMatch,
|
34
35
|
"$and" => And,
|
36
|
+
"$eq" => Eq,
|
35
37
|
"$exists" => Exists,
|
36
38
|
"$gt" => Gt,
|
37
39
|
"$gte" => Gte,
|
@@ -42,7 +44,7 @@ module Mongoid
|
|
42
44
|
"$nin" => Nin,
|
43
45
|
"$or" => Or,
|
44
46
|
"$nor" => Nor,
|
45
|
-
"$size" => Size
|
47
|
+
"$size" => Size,
|
46
48
|
}.with_indifferent_access.freeze
|
47
49
|
|
48
50
|
# Determines if this document has the attributes to match the supplied
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
module Mongoid
|
4
|
+
module Matchable
|
5
|
+
|
6
|
+
# Performs equivalency checks.
|
7
|
+
class Eq < Default
|
8
|
+
|
9
|
+
# Return true if the attribute and first value are equal.
|
10
|
+
#
|
11
|
+
# @example Do the values match?
|
12
|
+
# matcher._matches?({ :key => 10 })
|
13
|
+
#
|
14
|
+
# @param [ Hash ] value The values to check.
|
15
|
+
#
|
16
|
+
# @return [ true, false ] True if matches, false if not.
|
17
|
+
def _matches?(value)
|
18
|
+
super(value.values.first)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/mongoid/matchable/ne.rb
CHANGED
@@ -169,6 +169,9 @@ module Mongoid
|
|
169
169
|
|
170
170
|
# Set the persistence context for a particular class or model instance.
|
171
171
|
#
|
172
|
+
# If there already is a persistence context set, options in the existing
|
173
|
+
# context are combined with options given to the set call.
|
174
|
+
#
|
172
175
|
# @example Set the persistence context for a class or model instance.
|
173
176
|
# PersistenceContext.set(model)
|
174
177
|
#
|
@@ -180,9 +183,19 @@ module Mongoid
|
|
180
183
|
#
|
181
184
|
# @since 6.0.0
|
182
185
|
def set(object, options_or_context)
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
+
key = "[mongoid][#{object.object_id}]:context"
|
187
|
+
existing_context = Thread.current[key]
|
188
|
+
existing_options = if existing_context
|
189
|
+
existing_context.options
|
190
|
+
else
|
191
|
+
{}
|
192
|
+
end
|
193
|
+
if options_or_context.is_a?(PersistenceContext)
|
194
|
+
options_or_context = options_or_context.options
|
195
|
+
end
|
196
|
+
new_options = existing_options.merge(options_or_context)
|
197
|
+
context = PersistenceContext.new(object, new_options)
|
198
|
+
Thread.current[key] = context
|
186
199
|
end
|
187
200
|
|
188
201
|
# Get the persistence context for a particular class or model instance.
|
@@ -206,14 +219,16 @@ module Mongoid
|
|
206
219
|
#
|
207
220
|
# @param [ Class, Object ] object The class or model instance.
|
208
221
|
# @param [ Mongo::Cluster ] cluster The original cluster before this context was used.
|
222
|
+
# @param [ Mongoid::PersistenceContext ] original_context The original persistence
|
223
|
+
# context that was set before this context was used.
|
209
224
|
#
|
210
225
|
# @since 6.0.0
|
211
|
-
def clear(object, cluster = nil)
|
226
|
+
def clear(object, cluster = nil, original_context = nil)
|
212
227
|
if context = get(object)
|
213
228
|
context.client.close unless (context.cluster.equal?(cluster) || cluster.nil?)
|
214
229
|
end
|
215
230
|
ensure
|
216
|
-
Thread.current["[mongoid][#{object.object_id}]:context"] =
|
231
|
+
Thread.current["[mongoid][#{object.object_id}]:context"] = original_context
|
217
232
|
end
|
218
233
|
end
|
219
234
|
end
|