mongoid 5.4.0 → 6.4.8
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
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/Rakefile +26 -0
- data/lib/config/locales/en.yml +40 -0
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +5 -5
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/sessions.rb +113 -0
- data/lib/mongoid/clients/storage_options.rb +2 -69
- data/lib/mongoid/clients.rb +10 -63
- data/lib/mongoid/composable.rb +29 -2
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +4 -4
- data/lib/mongoid/contextual/map_reduce.rb +7 -3
- data/lib/mongoid/contextual/memory.rb +9 -4
- data/lib/mongoid/contextual/mongo.rb +65 -30
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +29 -3
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
- data/lib/mongoid/criteria/queryable/optional.rb +429 -0
- data/lib/mongoid/criteria/queryable/options.rb +153 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria.rb +6 -2
- data/lib/mongoid/document.rb +34 -41
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/invalid_session_use.rb +24 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/decimal128.rb +3 -3
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions/string.rb +6 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +16 -14
- data/lib/mongoid/interceptable.rb +9 -22
- data/lib/mongoid/matchable/all.rb +2 -2
- data/lib/mongoid/matchable/and.rb +3 -3
- data/lib/mongoid/matchable/default.rb +2 -2
- data/lib/mongoid/matchable/elem_match.rb +28 -0
- data/lib/mongoid/matchable/exists.rb +2 -2
- data/lib/mongoid/matchable/gt.rb +4 -2
- data/lib/mongoid/matchable/gte.rb +4 -2
- data/lib/mongoid/matchable/in.rb +2 -2
- data/lib/mongoid/matchable/lt.rb +4 -2
- data/lib/mongoid/matchable/lte.rb +4 -2
- data/lib/mongoid/matchable/ne.rb +2 -2
- data/lib/mongoid/matchable/nin.rb +2 -2
- data/lib/mongoid/matchable/nor.rb +37 -0
- data/lib/mongoid/matchable/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/matchable.rb +16 -7
- data/lib/mongoid/persistable/creatable.rb +5 -3
- data/lib/mongoid/persistable/deletable.rb +5 -3
- data/lib/mongoid/persistable/destroyable.rb +1 -5
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +7 -14
- data/lib/mongoid/persistable/upsertable.rb +2 -1
- data/lib/mongoid/persistable.rb +4 -6
- data/lib/mongoid/persistence_context.rb +220 -0
- data/lib/mongoid/query_cache.rb +67 -23
- data/lib/mongoid/railtie.rb +17 -1
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/relations/accessors.rb +3 -0
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
- data/lib/mongoid/relations/counter_cache.rb +15 -5
- data/lib/mongoid/relations/eager/base.rb +3 -3
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/relations/eager.rb +6 -11
- data/lib/mongoid/relations/embedded/batchable.rb +20 -18
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +51 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- data/lib/mongoid/relations/many.rb +4 -0
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +1 -31
- data/lib/mongoid/relations/referenced/in.rb +19 -10
- data/lib/mongoid/relations/referenced/many.rb +30 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +15 -1
- data/lib/mongoid/relations/synchronization.rb +12 -12
- data/lib/mongoid/relations/targets/enumerable.rb +24 -4
- data/lib/mongoid/relations/touchable.rb +7 -4
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stateful.rb +1 -0
- data/lib/mongoid/tasks/database.rb +3 -2
- data/lib/mongoid/threaded.rb +74 -0
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +6 -6
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
- data/spec/app/models/agent.rb +2 -0
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/array_field.rb +7 -0
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +3 -0
- data/spec/app/models/book.rb +2 -1
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/dokument.rb +1 -0
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/page.rb +1 -1
- data/spec/app/models/person.rb +3 -3
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/subscription.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +15 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
- data/spec/mongoid/atomic_spec.rb +5 -5
- data/spec/mongoid/attributes/nested_spec.rb +18 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +90 -5
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +80 -28
- data/spec/mongoid/clients/options_spec.rb +396 -95
- data/spec/mongoid/clients/sessions_spec.rb +334 -0
- data/spec/mongoid/clients_spec.rb +243 -101
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +67 -11
- data/spec/mongoid/contextual/atomic_spec.rb +3 -3
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
- data/spec/mongoid/contextual/mongo_spec.rb +275 -22
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +156 -22
- data/spec/mongoid/document_spec.rb +100 -90
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -4
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/factory_spec.rb +11 -0
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +47 -2
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +85 -19
- data/spec/mongoid/matchable/all_spec.rb +4 -4
- data/spec/mongoid/matchable/and_spec.rb +10 -10
- data/spec/mongoid/matchable/default_spec.rb +12 -12
- data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
- data/spec/mongoid/matchable/exists_spec.rb +5 -5
- data/spec/mongoid/matchable/gt_spec.rb +18 -7
- data/spec/mongoid/matchable/gte_spec.rb +17 -7
- data/spec/mongoid/matchable/in_spec.rb +5 -5
- data/spec/mongoid/matchable/lt_spec.rb +18 -7
- data/spec/mongoid/matchable/lte_spec.rb +18 -7
- data/spec/mongoid/matchable/ne_spec.rb +5 -5
- data/spec/mongoid/matchable/nin_spec.rb +5 -5
- data/spec/mongoid/matchable/nor_spec.rb +209 -0
- data/spec/mongoid/matchable/or_spec.rb +7 -7
- data/spec/mongoid/matchable/regexp_spec.rb +5 -5
- data/spec/mongoid/matchable/size_spec.rb +3 -3
- data/spec/mongoid/matchable_spec.rb +199 -54
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +35 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +34 -29
- data/spec/mongoid/persistable/settable_spec.rb +77 -27
- data/spec/mongoid/persistable/updatable_spec.rb +182 -3
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/persistence_context_spec.rb +694 -0
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +170 -12
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +415 -7
- data/spec/mongoid/relations/metadata_spec.rb +15 -1
- data/spec/mongoid/relations/proxy_spec.rb +27 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
- data/spec/mongoid/relations/synchronization_spec.rb +48 -2
- data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
- data/spec/mongoid/relations/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +101 -8
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +42 -0
- data.tar.gz.sig +0 -0
- metadata +163 -61
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/railties/document.rb +0 -12
- data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# We undefine most methods to get them sent through to the target.
|
13
13
|
instance_methods.each do |method|
|
14
14
|
undef_method(method) unless
|
15
|
-
method =~
|
15
|
+
method =~ /^(__.*|send|object_id|equal\?|respond_to\?|tap|public_send|extend_proxy|extend_proxies)$/
|
16
16
|
end
|
17
17
|
|
18
18
|
include Threaded::Lifecycle
|
@@ -84,35 +84,6 @@ module Mongoid
|
|
84
84
|
target
|
85
85
|
end
|
86
86
|
|
87
|
-
# Tell the next persistence operation to store in a specific collection,
|
88
|
-
# database or client.
|
89
|
-
#
|
90
|
-
# @example Save the current document to a different collection.
|
91
|
-
# model.with(collection: "secondary").save
|
92
|
-
#
|
93
|
-
# @example Save the current document to a different database.
|
94
|
-
# model.with(database: "secondary").save
|
95
|
-
#
|
96
|
-
# @example Save the current document to a different client.
|
97
|
-
# model.with(client: "replica_set").save
|
98
|
-
#
|
99
|
-
# @example Save with a combination of options.
|
100
|
-
# model.with(client: "sharded", database: "secondary").save
|
101
|
-
#
|
102
|
-
# @param [ Hash ] options The storage options.
|
103
|
-
#
|
104
|
-
# @option options [ String, Symbol ] :collection The collection name.
|
105
|
-
# @option options [ String, Symbol ] :database The database name.
|
106
|
-
# @option options [ String, Symbol ] :client The client name.
|
107
|
-
#
|
108
|
-
# @return [ Document ] The current document.
|
109
|
-
#
|
110
|
-
# @since 3.0.0
|
111
|
-
def with(options)
|
112
|
-
@persistence_options = options
|
113
|
-
self
|
114
|
-
end
|
115
|
-
|
116
87
|
protected
|
117
88
|
|
118
89
|
# Get the collection from the root of the hierarchy.
|
@@ -125,7 +96,6 @@ module Mongoid
|
|
125
96
|
# @since 2.0.0
|
126
97
|
def collection
|
127
98
|
root = base._root
|
128
|
-
root.with(@persistence_options)
|
129
99
|
root.collection unless root.embedded?
|
130
100
|
end
|
131
101
|
|
@@ -10,6 +10,24 @@ module Mongoid
|
|
10
10
|
class In < Relations::One
|
11
11
|
include Evolvable
|
12
12
|
|
13
|
+
# The allowed options when defining this relation.
|
14
|
+
#
|
15
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
16
|
+
#
|
17
|
+
# @since 6.0.0
|
18
|
+
VALID_OPTIONS = [
|
19
|
+
:autobuild,
|
20
|
+
:autosave,
|
21
|
+
:dependent,
|
22
|
+
:foreign_key,
|
23
|
+
:index,
|
24
|
+
:polymorphic,
|
25
|
+
:primary_key,
|
26
|
+
:touch,
|
27
|
+
:optional,
|
28
|
+
:required
|
29
|
+
].freeze
|
30
|
+
|
13
31
|
# Instantiate a new referenced_in relation.
|
14
32
|
#
|
15
33
|
# @example Create the new relation.
|
@@ -264,16 +282,7 @@ module Mongoid
|
|
264
282
|
#
|
265
283
|
# @since 2.1.0
|
266
284
|
def valid_options
|
267
|
-
|
268
|
-
:autobuild,
|
269
|
-
:autosave,
|
270
|
-
:dependent,
|
271
|
-
:foreign_key,
|
272
|
-
:index,
|
273
|
-
:polymorphic,
|
274
|
-
:primary_key,
|
275
|
-
:touch
|
276
|
-
]
|
285
|
+
VALID_OPTIONS
|
277
286
|
end
|
278
287
|
|
279
288
|
# Get the default validation setting for the relation. Determines if
|
@@ -10,6 +10,24 @@ module Mongoid
|
|
10
10
|
delegate :count, to: :criteria
|
11
11
|
delegate :first, :in_memory, :last, :reset, :uniq, to: :target
|
12
12
|
|
13
|
+
# The allowed options when defining this relation.
|
14
|
+
#
|
15
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
16
|
+
#
|
17
|
+
# @since 6.0.0
|
18
|
+
VALID_OPTIONS = [
|
19
|
+
:after_add,
|
20
|
+
:after_remove,
|
21
|
+
:as,
|
22
|
+
:autosave,
|
23
|
+
:before_add,
|
24
|
+
:before_remove,
|
25
|
+
:dependent,
|
26
|
+
:foreign_key,
|
27
|
+
:order,
|
28
|
+
:primary_key
|
29
|
+
].freeze
|
30
|
+
|
13
31
|
# Appends a document or array of documents to the relation. Will set
|
14
32
|
# the parent and update the index in the process.
|
15
33
|
#
|
@@ -320,7 +338,6 @@ module Mongoid
|
|
320
338
|
#
|
321
339
|
# @since 2.0.0.rc.1
|
322
340
|
def append(document)
|
323
|
-
document.with(@persistence_options) if @persistence_options
|
324
341
|
with_add_callbacks(document, already_related?(document)) do
|
325
342
|
target.push(document)
|
326
343
|
characterize_one(document)
|
@@ -460,7 +477,7 @@ module Mongoid
|
|
460
477
|
# @since 3.0.0
|
461
478
|
def persist_delayed(docs, inserts)
|
462
479
|
unless docs.empty?
|
463
|
-
collection.insert_many(inserts)
|
480
|
+
collection.insert_many(inserts, session: _session)
|
464
481
|
docs.each do |doc|
|
465
482
|
doc.new_record = false
|
466
483
|
doc.run_after_callbacks(:create, :save)
|
@@ -500,7 +517,7 @@ module Mongoid
|
|
500
517
|
selector = conditions || {}
|
501
518
|
removed = klass.send(method, selector.merge!(criteria.selector))
|
502
519
|
target.delete_if do |doc|
|
503
|
-
if doc.
|
520
|
+
if doc._matches?(selector)
|
504
521
|
unbind_one(doc) and true
|
505
522
|
end
|
506
523
|
end
|
@@ -550,7 +567,7 @@ module Mongoid
|
|
550
567
|
if doc.new_record? && doc.valid?(:create)
|
551
568
|
doc.run_before_callbacks(:save, :create)
|
552
569
|
docs.push(doc)
|
553
|
-
inserts.push(doc.
|
570
|
+
inserts.push(doc.send(:as_attributes))
|
554
571
|
else
|
555
572
|
doc.save
|
556
573
|
end
|
@@ -590,14 +607,12 @@ module Mongoid
|
|
590
607
|
# @since 2.1.0
|
591
608
|
def criteria(metadata, object, type = nil)
|
592
609
|
apply_ordering(
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
metadata
|
600
|
-
), metadata
|
610
|
+
with_polymorphic_criterion(
|
611
|
+
metadata.klass.where(metadata.foreign_key => object),
|
612
|
+
metadata,
|
613
|
+
type
|
614
|
+
),
|
615
|
+
metadata
|
601
616
|
)
|
602
617
|
end
|
603
618
|
|
@@ -729,18 +744,7 @@ module Mongoid
|
|
729
744
|
#
|
730
745
|
# @since 2.1.0
|
731
746
|
def valid_options
|
732
|
-
|
733
|
-
:after_add,
|
734
|
-
:after_remove,
|
735
|
-
:as,
|
736
|
-
:autosave,
|
737
|
-
:before_add,
|
738
|
-
:before_remove,
|
739
|
-
:dependent,
|
740
|
-
:foreign_key,
|
741
|
-
:order,
|
742
|
-
:primary_key
|
743
|
-
]
|
747
|
+
VALID_OPTIONS
|
744
748
|
end
|
745
749
|
|
746
750
|
# Get the default validation setting for the relation. Determines if
|
@@ -795,8 +799,8 @@ module Mongoid
|
|
795
799
|
# @since 3.0.0
|
796
800
|
def with_inverse_field_criterion(criteria, metadata)
|
797
801
|
inverse_metadata = metadata.inverse_metadata(metadata.klass)
|
798
|
-
if inverse_metadata.try(:
|
799
|
-
criteria.any_in(inverse_metadata.
|
802
|
+
if inverse_metadata.try(:inverse_of)
|
803
|
+
criteria.any_in(inverse_metadata.inverse_of => [ metadata.name, nil ])
|
800
804
|
else
|
801
805
|
criteria
|
802
806
|
end
|
@@ -7,6 +7,24 @@ module Mongoid
|
|
7
7
|
# many-to-many between documents in different collections.
|
8
8
|
class ManyToMany < Many
|
9
9
|
|
10
|
+
# The allowed options when defining this relation.
|
11
|
+
#
|
12
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
13
|
+
#
|
14
|
+
# @since 6.0.0
|
15
|
+
VALID_OPTIONS = [
|
16
|
+
:after_add,
|
17
|
+
:after_remove,
|
18
|
+
:autosave,
|
19
|
+
:before_add,
|
20
|
+
:before_remove,
|
21
|
+
:dependent,
|
22
|
+
:foreign_key,
|
23
|
+
:index,
|
24
|
+
:order,
|
25
|
+
:primary_key
|
26
|
+
].freeze
|
27
|
+
|
10
28
|
# Appends a document or array of documents to the relation. Will set
|
11
29
|
# the parent and update the index in the process.
|
12
30
|
#
|
@@ -266,7 +284,7 @@ module Mongoid
|
|
266
284
|
#
|
267
285
|
# @since 3.0.0
|
268
286
|
def unsynced(doc, key)
|
269
|
-
doc.
|
287
|
+
doc._synced[key] = false
|
270
288
|
true
|
271
289
|
end
|
272
290
|
|
@@ -439,18 +457,7 @@ module Mongoid
|
|
439
457
|
#
|
440
458
|
# @since 2.1.0
|
441
459
|
def valid_options
|
442
|
-
|
443
|
-
:after_add,
|
444
|
-
:after_remove,
|
445
|
-
:autosave,
|
446
|
-
:before_add,
|
447
|
-
:before_remove,
|
448
|
-
:dependent,
|
449
|
-
:foreign_key,
|
450
|
-
:index,
|
451
|
-
:order,
|
452
|
-
:primary_key
|
453
|
-
]
|
460
|
+
VALID_OPTIONS
|
454
461
|
end
|
455
462
|
|
456
463
|
# Get the default validation setting for the relation. Determines if
|
@@ -7,6 +7,20 @@ module Mongoid
|
|
7
7
|
# one-to-one between documents in different collections.
|
8
8
|
class One < Relations::One
|
9
9
|
|
10
|
+
# The allowed options when defining this relation.
|
11
|
+
#
|
12
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
13
|
+
#
|
14
|
+
# @since 6.0.0
|
15
|
+
VALID_OPTIONS = [
|
16
|
+
:as,
|
17
|
+
:autobuild,
|
18
|
+
:autosave,
|
19
|
+
:dependent,
|
20
|
+
:foreign_key,
|
21
|
+
:primary_key
|
22
|
+
].freeze
|
23
|
+
|
10
24
|
# Instantiate a new references_one relation. Will set the foreign key
|
11
25
|
# and the base on the inverse object.
|
12
26
|
#
|
@@ -254,7 +268,7 @@ module Mongoid
|
|
254
268
|
#
|
255
269
|
# @since 2.1.0
|
256
270
|
def valid_options
|
257
|
-
|
271
|
+
VALID_OPTIONS
|
258
272
|
end
|
259
273
|
|
260
274
|
# Get the default validation setting for the relation. Determines if
|
@@ -11,41 +11,41 @@ module Mongoid
|
|
11
11
|
# the key has changed and the relation bindings have not been run.
|
12
12
|
#
|
13
13
|
# @example Are the foreign keys syncable?
|
14
|
-
# document.
|
14
|
+
# document._syncable??(metadata)
|
15
15
|
#
|
16
16
|
# @param [ Metadata ] metadata The relation metadata.
|
17
17
|
#
|
18
18
|
# @return [ true, false ] If we can sync.
|
19
19
|
#
|
20
20
|
# @since 2.1.0
|
21
|
-
def
|
22
|
-
!
|
21
|
+
def _syncable?(metadata)
|
22
|
+
!_synced?(metadata.foreign_key) && send(metadata.foreign_key_check)
|
23
23
|
end
|
24
24
|
|
25
25
|
# Get the synced foreign keys.
|
26
26
|
#
|
27
27
|
# @example Get the synced foreign keys.
|
28
|
-
# document.
|
28
|
+
# document._synced
|
29
29
|
#
|
30
30
|
# @return [ Hash ] The synced foreign keys.
|
31
31
|
#
|
32
32
|
# @since 2.1.0
|
33
|
-
def
|
34
|
-
@
|
33
|
+
def _synced
|
34
|
+
@_synced ||= {}
|
35
35
|
end
|
36
36
|
|
37
37
|
# Has the document been synced for the foreign key?
|
38
38
|
#
|
39
39
|
# @example Has the document been synced?
|
40
|
-
# document.
|
40
|
+
# document._synced??
|
41
41
|
#
|
42
42
|
# @param [ String ] foreign_key The foreign key.
|
43
43
|
#
|
44
44
|
# @return [ true, false ] If we can sync.
|
45
45
|
#
|
46
46
|
# @since 2.1.0
|
47
|
-
def
|
48
|
-
!!
|
47
|
+
def _synced?(foreign_key)
|
48
|
+
!!_synced[foreign_key]
|
49
49
|
end
|
50
50
|
|
51
51
|
# Update the inverse keys on destroy.
|
@@ -81,7 +81,7 @@ module Mongoid
|
|
81
81
|
adds, subs = new - (old || []), (old || []) - new
|
82
82
|
|
83
83
|
# If we are autosaving we don't want a duplicate to get added - the
|
84
|
-
# $addToSet would run previously and then the $
|
84
|
+
# $addToSet would run previously and then the $push and $each from the
|
85
85
|
# inverse on the autosave would cause this. We delete each id from
|
86
86
|
# what's in memory in case a mix of id addition and object addition
|
87
87
|
# had occurred.
|
@@ -110,7 +110,7 @@ module Mongoid
|
|
110
110
|
# @param [ Metadata ] metadata The relation metadata.
|
111
111
|
#
|
112
112
|
# @since 2.1.0
|
113
|
-
def
|
113
|
+
def _synced(metadata)
|
114
114
|
unless metadata.forced_nil_inverse?
|
115
115
|
synced_save(metadata)
|
116
116
|
synced_destroy(metadata)
|
@@ -137,7 +137,7 @@ module Mongoid
|
|
137
137
|
set_callback(
|
138
138
|
:save,
|
139
139
|
:after,
|
140
|
-
if: ->(doc){ doc.
|
140
|
+
if: ->(doc){ doc._syncable?(metadata) }
|
141
141
|
) do |doc|
|
142
142
|
doc.update_inverse_keys(metadata)
|
143
143
|
end
|
@@ -214,12 +214,22 @@ module Mongoid
|
|
214
214
|
# @example Get the first document.
|
215
215
|
# enumerable.first
|
216
216
|
#
|
217
|
+
# @note Automatically adding a sort on _id when no other sort is
|
218
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
219
|
+
# If you experience unexpected poor performance when using #first or #last,
|
220
|
+
# use the option { id_sort: :none }.
|
221
|
+
# Be aware that #first/#last won't guarantee order in this case.
|
222
|
+
#
|
223
|
+
# @param [ Hash ] opts The options for the query returning the first document.
|
224
|
+
#
|
225
|
+
# @option opts [ :none ] :id_sort Don't apply a sort on _id.
|
226
|
+
#
|
217
227
|
# @return [ Document ] The first document found.
|
218
228
|
#
|
219
229
|
# @since 2.1.0
|
220
|
-
def first
|
230
|
+
def first(opts = {})
|
221
231
|
_loaded.try(:values).try(:first) ||
|
222
|
-
_added[(ul = _unloaded.try(:first)).try(:id)] ||
|
232
|
+
_added[(ul = _unloaded.try(:first, opts)).try(:id)] ||
|
223
233
|
ul ||
|
224
234
|
_added.values.try(:first)
|
225
235
|
end
|
@@ -298,13 +308,23 @@ module Mongoid
|
|
298
308
|
# @example Get the last document.
|
299
309
|
# enumerable.last
|
300
310
|
#
|
311
|
+
# @note Automatically adding a sort on _id when no other sort is
|
312
|
+
# defined on the criteria has the potential to cause bad performance issues.
|
313
|
+
# If you experience unexpected poor performance when using #first or #last,
|
314
|
+
# use the option { id_sort: :none }.
|
315
|
+
# Be aware that #first/#last won't guarantee order in this case.
|
316
|
+
#
|
317
|
+
# @param [ Hash ] opts The options for the query returning the first document.
|
318
|
+
#
|
319
|
+
# @option opts [ :none ] :id_sort Don't apply a sort on _id.
|
320
|
+
#
|
301
321
|
# @return [ Document ] The last document found.
|
302
322
|
#
|
303
323
|
# @since 2.1.0
|
304
|
-
def last
|
324
|
+
def last(opts = {})
|
305
325
|
_added.values.try(:last) ||
|
306
326
|
_loaded.try(:values).try(:last) ||
|
307
|
-
_added[(ul = _unloaded.try(:last)).try(:id)] ||
|
327
|
+
_added[(ul = _unloaded.try(:last, opts)).try(:id)] ||
|
308
328
|
ul
|
309
329
|
end
|
310
330
|
|
@@ -31,7 +31,7 @@ module Mongoid
|
|
31
31
|
touches = touch_atomic_updates(field)
|
32
32
|
unless touches["$set"].blank?
|
33
33
|
selector = atomic_selector
|
34
|
-
_root.collection.find(selector).update_one(positionally(selector, touches))
|
34
|
+
_root.collection.find(selector).update_one(positionally(selector, touches), session: _session)
|
35
35
|
end
|
36
36
|
run_callbacks(:touch)
|
37
37
|
true
|
@@ -53,7 +53,8 @@ module Mongoid
|
|
53
53
|
def touchable(metadata)
|
54
54
|
if metadata.touchable?
|
55
55
|
name = metadata.name
|
56
|
-
|
56
|
+
field = metadata[:touch].is_a?(Symbol) ? metadata[:touch] : nil
|
57
|
+
method_name = define_relation_touch_method(name, field)
|
57
58
|
after_save method_name
|
58
59
|
after_destroy method_name
|
59
60
|
after_touch method_name
|
@@ -70,19 +71,21 @@ module Mongoid
|
|
70
71
|
#
|
71
72
|
# @example Define the touch relation.
|
72
73
|
# Model.define_relation_touch_method(:band)
|
74
|
+
# Model.define_relation_touch_method(:band, :band_updated_at)
|
73
75
|
#
|
74
76
|
# @param [ Symbol ] name The name of the relation.
|
77
|
+
# @param [ Symbol ] extra_field Additional timestamp field to update.
|
75
78
|
#
|
76
79
|
# @since 3.1.0
|
77
80
|
#
|
78
81
|
# @return [ Symbol ] The method name.
|
79
|
-
def define_relation_touch_method(name)
|
82
|
+
def define_relation_touch_method(name, extra_field = nil)
|
80
83
|
method_name = "touch_#{name}_after_create_or_destroy"
|
81
84
|
class_eval <<-TOUCH, __FILE__, __LINE__ + 1
|
82
85
|
def #{method_name}
|
83
86
|
without_autobuild do
|
84
87
|
relation = __send__(:#{name})
|
85
|
-
relation.touch if relation
|
88
|
+
relation.touch #{":#{extra_field}" if extra_field} if relation
|
86
89
|
end
|
87
90
|
end
|
88
91
|
TOUCH
|
data/lib/mongoid/reloadable.rb
CHANGED
@@ -58,7 +58,7 @@ module Mongoid
|
|
58
58
|
#
|
59
59
|
# @since 2.3.2
|
60
60
|
def reload_root_document
|
61
|
-
{}.merge(collection.find(_id: _id).read(mode: :primary).first || {})
|
61
|
+
{}.merge(collection.find({ _id: _id }, session: _session).read(mode: :primary).first || {})
|
62
62
|
end
|
63
63
|
|
64
64
|
# Reload the embedded document.
|
@@ -71,7 +71,7 @@ module Mongoid
|
|
71
71
|
# @since 2.3.2
|
72
72
|
def reload_embedded_document
|
73
73
|
extract_embedded_attributes({}.merge(
|
74
|
-
_root.
|
74
|
+
collection(_root).find(_id: _root._id).read(mode: :primary).first
|
75
75
|
))
|
76
76
|
end
|
77
77
|
|
data/lib/mongoid/scopable.rb
CHANGED
@@ -102,7 +102,7 @@ module Mongoid
|
|
102
102
|
#
|
103
103
|
# @since 3.0.0
|
104
104
|
def default_scopable?
|
105
|
-
default_scoping? && !Threaded.
|
105
|
+
default_scoping? && !Threaded.without_default_scope?(self)
|
106
106
|
end
|
107
107
|
|
108
108
|
# Get a queryable, either the last one on the scope stack or a fresh one.
|
@@ -244,10 +244,10 @@ module Mongoid
|
|
244
244
|
#
|
245
245
|
# @since 3.0.0
|
246
246
|
def without_default_scope
|
247
|
-
Threaded.
|
247
|
+
Threaded.begin_without_default_scope(self)
|
248
248
|
yield
|
249
249
|
ensure
|
250
|
-
Threaded.
|
250
|
+
Threaded.exit_without_default_scope(self)
|
251
251
|
end
|
252
252
|
|
253
253
|
private
|
data/lib/mongoid/serializable.rb
CHANGED
@@ -66,7 +66,7 @@ module Mongoid
|
|
66
66
|
#
|
67
67
|
# @since 3.0.0
|
68
68
|
def field_names(options)
|
69
|
-
names = (
|
69
|
+
names = (as_attributes.keys + attribute_names).uniq.sort
|
70
70
|
|
71
71
|
only = Array.wrap(options[:only]).map(&:to_s)
|
72
72
|
except = Array.wrap(options[:except]).map(&:to_s)
|
data/lib/mongoid/stateful.rb
CHANGED
@@ -43,6 +43,7 @@ module Mongoid
|
|
43
43
|
@flagged_for_destroy ||= false
|
44
44
|
end
|
45
45
|
alias :marked_for_destruction? :flagged_for_destroy?
|
46
|
+
alias :_destroy :flagged_for_destroy?
|
46
47
|
|
47
48
|
# Returns true if the +Document+ has been succesfully destroyed, and false
|
48
49
|
# if it hasn't. This is determined by the variable @destroyed and NOT
|
@@ -44,7 +44,7 @@ module Mongoid
|
|
44
44
|
models.each do |model|
|
45
45
|
unless model.embedded?
|
46
46
|
begin
|
47
|
-
model.collection.indexes.each do |index|
|
47
|
+
model.collection.indexes(session: model.send(:_session)).each do |index|
|
48
48
|
# ignore default index
|
49
49
|
unless index['name'] == '_id_'
|
50
50
|
key = index['key'].symbolize_keys
|
@@ -77,7 +77,7 @@ module Mongoid
|
|
77
77
|
indexes.each do |index|
|
78
78
|
key = index['key'].symbolize_keys
|
79
79
|
collection = model.collection
|
80
|
-
collection.indexes.drop_one(key)
|
80
|
+
collection.indexes(session: model.send(:_session)).drop_one(key)
|
81
81
|
logger.info(
|
82
82
|
"MONGOID: Removed index '#{index['name']}' on collection " +
|
83
83
|
"'#{collection.name}' in database '#{collection.database.name}'."
|
@@ -107,6 +107,7 @@ module Mongoid
|
|
107
107
|
end
|
108
108
|
|
109
109
|
private
|
110
|
+
|
110
111
|
def logger
|
111
112
|
Mongoid.logger
|
112
113
|
end
|
data/lib/mongoid/threaded.rb
CHANGED
@@ -163,6 +163,30 @@ module Mongoid
|
|
163
163
|
validations_for(document.class).delete_one(document._id)
|
164
164
|
end
|
165
165
|
|
166
|
+
# Begin suppressing default scopes for given model on the current thread.
|
167
|
+
#
|
168
|
+
# @example Begin without default scope stack.
|
169
|
+
# Threaded.begin_without_default_scope(klass)
|
170
|
+
#
|
171
|
+
# @param [ Class ] klass The model to suppress default scoping on.
|
172
|
+
#
|
173
|
+
# @api private
|
174
|
+
def begin_without_default_scope(klass)
|
175
|
+
stack(:without_default_scope).push(klass)
|
176
|
+
end
|
177
|
+
|
178
|
+
# Exit suppressing default scopes for given model on the current thread.
|
179
|
+
#
|
180
|
+
# @example Exit without default scope stack.
|
181
|
+
# Threaded.exit_without_default_scope(klass)
|
182
|
+
#
|
183
|
+
# @param [ Class ] klass The model to unsuppress default scoping on.
|
184
|
+
#
|
185
|
+
# @api private
|
186
|
+
def exit_without_default_scope(klass)
|
187
|
+
stack(:without_default_scope).delete(klass)
|
188
|
+
end
|
189
|
+
|
166
190
|
# Get the global client override.
|
167
191
|
#
|
168
192
|
# @example Get the global client override.
|
@@ -247,6 +271,18 @@ module Mongoid
|
|
247
271
|
end
|
248
272
|
end
|
249
273
|
|
274
|
+
# Is the given klass' default scope suppressed on the current thread?
|
275
|
+
#
|
276
|
+
# @example Is the given klass' default scope suppressed?
|
277
|
+
# Threaded.without_default_scope?(klass)
|
278
|
+
#
|
279
|
+
# @param [ Class ] klass The model to check for default scope suppression.
|
280
|
+
#
|
281
|
+
# @api private
|
282
|
+
def without_default_scope?(klass)
|
283
|
+
stack(:without_default_scope).include?(klass)
|
284
|
+
end
|
285
|
+
|
250
286
|
# Is the document autosaved on the current thread?
|
251
287
|
#
|
252
288
|
# @example Is the document autosaved?
|
@@ -325,5 +361,43 @@ module Mongoid
|
|
325
361
|
def validations_for(klass)
|
326
362
|
validations[klass] ||= []
|
327
363
|
end
|
364
|
+
|
365
|
+
# Cache a session for this thread.
|
366
|
+
#
|
367
|
+
# @example Save a session for this thread.
|
368
|
+
# Threaded.set_session(session)
|
369
|
+
#
|
370
|
+
# @param [ Mongo::Session ] session The session to save.
|
371
|
+
#
|
372
|
+
# @since 6.4.0
|
373
|
+
def set_session(session)
|
374
|
+
Thread.current[:session] = session
|
375
|
+
end
|
376
|
+
|
377
|
+
# Get the cached session for this thread.
|
378
|
+
#
|
379
|
+
# @example Get the session for this thread.
|
380
|
+
# Threaded.get_session
|
381
|
+
#
|
382
|
+
# @return [ Mongo::Session, nil ] The session cached on this thread or nil.
|
383
|
+
#
|
384
|
+
# @since 6.4.0
|
385
|
+
def get_session
|
386
|
+
Thread.current[:session]
|
387
|
+
end
|
388
|
+
|
389
|
+
# Clear the cached session for this thread.
|
390
|
+
#
|
391
|
+
# @example Clear this thread's session.
|
392
|
+
# Threaded.clear_session
|
393
|
+
#
|
394
|
+
# @return [ nil ]
|
395
|
+
#
|
396
|
+
# @since 6.4.0
|
397
|
+
def clear_session
|
398
|
+
session = get_session
|
399
|
+
session.end_session if session
|
400
|
+
Thread.current[:session] = nil
|
401
|
+
end
|
328
402
|
end
|
329
403
|
end
|
data/lib/mongoid/traversable.rb
CHANGED
@@ -169,7 +169,6 @@ module Mongoid
|
|
169
169
|
name = document.database_field_name(item)
|
170
170
|
criteria = criteria.where(item => document.attributes[name])
|
171
171
|
end
|
172
|
-
criteria = criteria.with(document.persistence_options)
|
173
172
|
criteria
|
174
173
|
end
|
175
174
|
|
@@ -274,7 +273,7 @@ module Mongoid
|
|
274
273
|
criteria = create_criteria(klass, document, attribute, value)
|
275
274
|
criteria = criteria.merge(options[:conditions].call) if options[:conditions]
|
276
275
|
|
277
|
-
if criteria.
|
276
|
+
if criteria.read(mode: :primary).exists?
|
278
277
|
add_error(document, attribute, value)
|
279
278
|
end
|
280
279
|
end
|
data/lib/mongoid/version.rb
CHANGED