mongoid 5.4.1 → 6.0.0.beta
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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/config/locales/en.yml +23 -16
- data/lib/mongoid.rb +4 -9
- data/lib/mongoid/atomic.rb +1 -1
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +9 -11
- data/lib/mongoid/attributes/dynamic.rb +5 -6
- data/lib/mongoid/attributes/nested.rb +1 -1
- data/lib/mongoid/attributes/processing.rb +4 -0
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +37 -1
- data/lib/mongoid/clients.rb +0 -63
- data/lib/mongoid/clients/factory.rb +0 -2
- data/lib/mongoid/clients/options.rb +54 -249
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +26 -2
- data/lib/mongoid/config.rb +1 -1
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +6 -9
- data/lib/mongoid/contextual/geo_near.rb +2 -3
- data/lib/mongoid/contextual/map_reduce.rb +97 -24
- data/lib/mongoid/contextual/memory.rb +7 -4
- data/lib/mongoid/contextual/mongo.rb +63 -54
- data/lib/mongoid/contextual/none.rb +2 -2
- data/lib/mongoid/copyable.rb +19 -19
- data/lib/mongoid/criteria.rb +5 -4
- data/lib/mongoid/criteria/findable.rb +2 -3
- data/lib/mongoid/criteria/includable.rb +63 -16
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +86 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -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 +45 -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/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 +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +411 -0
- data/lib/mongoid/criteria/queryable/options.rb +136 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +196 -0
- data/lib/mongoid/criteria/queryable/smash.rb +103 -0
- data/lib/mongoid/document.rb +9 -23
- data/lib/mongoid/errors.rb +2 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +2 -2
- 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/inverse_not_found.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -5
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -3
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +5 -2
- data/lib/mongoid/factory.rb +1 -0
- data/lib/mongoid/fields/foreign_key.rb +2 -2
- data/lib/mongoid/fields/localized.rb +3 -8
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +3 -3
- data/lib/mongoid/indexable.rb +17 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +1 -2
- data/lib/mongoid/interceptable.rb +6 -17
- data/lib/mongoid/loggable.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -10
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/persistable.rb +6 -5
- data/lib/mongoid/persistable/creatable.rb +2 -0
- data/lib/mongoid/persistable/deletable.rb +7 -3
- data/lib/mongoid/persistable/settable.rb +3 -16
- data/lib/mongoid/persistable/updatable.rb +10 -12
- data/lib/mongoid/persistence_context.rb +216 -0
- data/lib/mongoid/query_cache.rb +5 -30
- data/lib/mongoid/relations/accessors.rb +6 -2
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +28 -18
- data/lib/mongoid/relations/eager.rb +19 -7
- data/lib/mongoid/relations/eager/base.rb +5 -5
- data/lib/mongoid/relations/embedded/batchable.rb +9 -33
- data/lib/mongoid/relations/embedded/in.rb +16 -2
- data/lib/mongoid/relations/embedded/many.rb +23 -8
- data/lib/mongoid/relations/embedded/one.rb +17 -2
- data/lib/mongoid/relations/macros.rb +9 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +1 -1
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +2 -33
- data/lib/mongoid/relations/referenced/in.rb +23 -11
- data/lib/mongoid/relations/referenced/many.rb +24 -16
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +17 -1
- data/lib/mongoid/relations/reflections.rb +3 -5
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +2 -3
- data/lib/mongoid/tasks/database.rb +1 -2
- data/lib/mongoid/threaded.rb +4 -4
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +2 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/church.rb +0 -2
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/person.rb +3 -1
- data/spec/app/models/post.rb +0 -1
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +1 -5
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +63 -0
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +3 -11
- data/spec/mongoid/clients/options_spec.rb +378 -96
- data/spec/mongoid/clients_spec.rb +207 -170
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +41 -21
- data/spec/mongoid/contextual/atomic_spec.rb +77 -343
- data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
- data/spec/mongoid/contextual/memory_spec.rb +56 -316
- data/spec/mongoid/contextual/mongo_spec.rb +104 -378
- data/spec/mongoid/copyable_spec.rb +8 -15
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- 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/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
- 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 +1786 -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 +4159 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +45 -63
- data/spec/mongoid/document_spec.rb +21 -88
- 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 +320 -18
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +4 -8
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/fields/localized_spec.rb +0 -91
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +6 -46
- data/spec/mongoid/interceptable_spec.rb +49 -10
- data/spec/mongoid/matchable/gt_spec.rb +11 -0
- data/spec/mongoid/matchable/gte_spec.rb +10 -0
- data/spec/mongoid/matchable/lt_spec.rb +11 -0
- data/spec/mongoid/matchable/lte_spec.rb +11 -0
- data/spec/mongoid/matchable_spec.rb +1 -51
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +1 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +30 -30
- data/spec/mongoid/persistable/settable_spec.rb +0 -185
- data/spec/mongoid/persistable/updatable_spec.rb +166 -5
- data/spec/mongoid/persistence_context_spec.rb +654 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -65
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
- data/spec/mongoid/relations/cyclic_spec.rb +0 -22
- data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/proxy_spec.rb +3 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
- data/spec/mongoid/relations/reflections_spec.rb +9 -9
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +0 -12
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -10
- metadata +536 -479
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
- data/lib/mongoid/extensions/decimal128.rb +0 -39
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -17,6 +17,7 @@ module Mongoid
|
|
17
17
|
# @param [ String, Symbol ] name The name of the relation.
|
18
18
|
# @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
|
19
19
|
# @param [ Metadata ] metadata The relation's metadata.
|
20
|
+
# @param [ true, false ] building If we are in a build operation.
|
20
21
|
#
|
21
22
|
# @return [ Proxy ] The relation.
|
22
23
|
#
|
@@ -31,7 +32,7 @@ module Mongoid
|
|
31
32
|
# @example Create the relation.
|
32
33
|
# person.create_relation(document, metadata)
|
33
34
|
#
|
34
|
-
# @param [ Document, Array<Document
|
35
|
+
# @param [ Document, Array<Document ] object The relation target.
|
35
36
|
# @param [ Metadata ] metadata The relation metadata.
|
36
37
|
#
|
37
38
|
# @return [ Proxy ] The relation.
|
@@ -159,7 +160,7 @@ module Mongoid
|
|
159
160
|
#
|
160
161
|
# @since 3.0.0
|
161
162
|
def existence_check(name)
|
162
|
-
module_eval <<-END
|
163
|
+
module_eval <<-END
|
163
164
|
def #{name}?
|
164
165
|
without_autobuild { !__send__(:#{name}).blank? }
|
165
166
|
end
|
@@ -229,6 +230,9 @@ module Mongoid
|
|
229
230
|
if value = get_relation(name, metadata, object)
|
230
231
|
if value.respond_to?(:substitute)
|
231
232
|
set_relation(name, value.substitute(object.substitutable))
|
233
|
+
else
|
234
|
+
value = __build__(name, value, metadata)
|
235
|
+
set_relation(name, value.substitute(object.substitutable))
|
232
236
|
end
|
233
237
|
else
|
234
238
|
__build__(name, object.substitutable, metadata)
|
@@ -59,17 +59,25 @@ module Mongoid
|
|
59
59
|
if metadata.autosave? && !metadata.embedded?
|
60
60
|
save_method = :"autosave_documents_for_#{metadata.name}"
|
61
61
|
define_method(save_method) do
|
62
|
-
|
63
62
|
if before_callback_halted?
|
64
63
|
self.before_callback_halted = false
|
65
64
|
else
|
66
65
|
__autosaving__ do
|
67
66
|
if relation = ivar(metadata.name)
|
68
|
-
options = persistence_options || {}
|
69
67
|
if :belongs_to == metadata.macro
|
70
|
-
|
68
|
+
if changed_for_autosave?(relation)
|
69
|
+
relation.with(persistence_context) do |_relation|
|
70
|
+
_relation.save
|
71
|
+
end
|
72
|
+
end
|
71
73
|
else
|
72
|
-
Array(relation).each
|
74
|
+
Array(relation).each do |doc|
|
75
|
+
if changed_for_autosave?(doc)
|
76
|
+
doc.with(persistence_context) do |d|
|
77
|
+
d.save
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
73
81
|
end
|
74
82
|
end
|
75
83
|
end
|
@@ -17,6 +17,8 @@ module Mongoid
|
|
17
17
|
# name.person.bind(:continue => true)
|
18
18
|
# name.person = Person.new
|
19
19
|
#
|
20
|
+
# @param [ Hash ] options The binding options.
|
21
|
+
#
|
20
22
|
# @option options [ true, false ] :continue Continue binding the inverse.
|
21
23
|
# @option options [ true, false ] :binding Are we in build mode?
|
22
24
|
#
|
@@ -40,6 +42,8 @@ module Mongoid
|
|
40
42
|
# name.person.unbind(:continue => true)
|
41
43
|
# name.person = nil
|
42
44
|
#
|
45
|
+
# @param [ Hash ] options The options to pass through.
|
46
|
+
#
|
43
47
|
# @option options [ true, false ] :continue Do we continue unbinding?
|
44
48
|
#
|
45
49
|
# @since 2.0.0.rc.1
|
@@ -14,6 +14,10 @@ module Mongoid
|
|
14
14
|
# person.addresses.bind_one(address)
|
15
15
|
#
|
16
16
|
# @param [ Document ] doc The single document to bind.
|
17
|
+
# @param [ Hash ] options The binding options.
|
18
|
+
#
|
19
|
+
# @option options [ true, false ] :continue Continue binding the inverse.
|
20
|
+
# @option options [ true, false ] :binding Are we in build mode?
|
17
21
|
#
|
18
22
|
# @since 2.0.0.rc.1
|
19
23
|
def bind_one(doc)
|
@@ -28,7 +32,10 @@ module Mongoid
|
|
28
32
|
# @example Unbind the document.
|
29
33
|
# person.addresses.unbind_one(document)
|
30
34
|
#
|
31
|
-
# @param [
|
35
|
+
# @param [ Hash ] options The binding options.
|
36
|
+
#
|
37
|
+
# @option options [ true, false ] :continue Continue binding the inverse.
|
38
|
+
# @option options [ true, false ] :binding Are we in build mode?
|
32
39
|
#
|
33
40
|
# @since 2.0.0.rc.1
|
34
41
|
def unbind_one(doc)
|
@@ -17,6 +17,11 @@ module Mongoid
|
|
17
17
|
# person.name.bind(:continue => true)
|
18
18
|
# person.name = Name.new
|
19
19
|
#
|
20
|
+
# @param [ Hash ] options The options to pass through.
|
21
|
+
#
|
22
|
+
# @option options [ true, false ] :continue Do we continue binding?
|
23
|
+
# @option options [ true, false ] :binding Are we in build mode?
|
24
|
+
#
|
20
25
|
# @since 2.0.0.rc.1
|
21
26
|
def bind_one
|
22
27
|
target.parentize(base)
|
@@ -32,6 +37,11 @@ module Mongoid
|
|
32
37
|
# person.name.unbind(:continue => true)
|
33
38
|
# person.name = nil
|
34
39
|
#
|
40
|
+
# @param [ Hash ] options The options to pass through.
|
41
|
+
#
|
42
|
+
# @option options [ true, false ] :continue Do we continue unbinding?
|
43
|
+
# @option options [ true, false ] :binding Are we in build mode?
|
44
|
+
#
|
35
45
|
# @since 2.0.0.rc.1
|
36
46
|
def unbind_one
|
37
47
|
binding do
|
@@ -13,6 +13,8 @@ module Mongoid
|
|
13
13
|
# @example Bind one document.
|
14
14
|
# person.posts.bind_one(post)
|
15
15
|
#
|
16
|
+
# @param [ Document ] doc The single document to bind.
|
17
|
+
#
|
16
18
|
# @since 2.0.0.rc.1
|
17
19
|
def bind_one(doc)
|
18
20
|
binding do
|
@@ -25,6 +27,8 @@ module Mongoid
|
|
25
27
|
# @example Unbind the document.
|
26
28
|
# person.posts.unbind_one(document)
|
27
29
|
#
|
30
|
+
# @param [ Document ] document The document to unbind.
|
31
|
+
#
|
28
32
|
# @since 2.0.0.rc.1
|
29
33
|
def unbind_one(doc)
|
30
34
|
binding do
|
@@ -64,7 +64,7 @@ module Mongoid
|
|
64
64
|
# @since 2.0.0.rc.1
|
65
65
|
def builder(name, metadata)
|
66
66
|
re_define_method("build_#{name}") do |*args|
|
67
|
-
attributes,
|
67
|
+
attributes, options = parse_args(*args)
|
68
68
|
document = Factory.build(metadata.klass, attributes)
|
69
69
|
_building do
|
70
70
|
child = send("#{name}=", document)
|
@@ -89,7 +89,7 @@ module Mongoid
|
|
89
89
|
# @since 2.0.0.rc.1
|
90
90
|
def creator(name, metadata)
|
91
91
|
re_define_method("create_#{name}") do |*args|
|
92
|
-
attributes,
|
92
|
+
attributes, options = parse_args(*args)
|
93
93
|
document = Factory.build(metadata.klass, attributes)
|
94
94
|
doc = _assigning do
|
95
95
|
send("#{name}=", document)
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# @example Build the document.
|
13
13
|
# Builder.new(meta, attrs).build
|
14
14
|
#
|
15
|
-
# @param [ String ]
|
15
|
+
# @param [ String ] type Not used in this context.
|
16
16
|
#
|
17
17
|
# @return [ Document ] A single document.
|
18
18
|
def build(_type = nil)
|
@@ -60,7 +60,7 @@ module Mongoid
|
|
60
60
|
# @example Is the document destroyable?
|
61
61
|
# destroyable?({ :_destroy => "1" })
|
62
62
|
#
|
63
|
-
# @
|
63
|
+
# @parma [ Hash ] attributes The attributes to pull the flag from.
|
64
64
|
#
|
65
65
|
# @return [ true, false ] If the relation can potentially be deleted.
|
66
66
|
def destroyable?(attributes)
|
@@ -13,7 +13,7 @@ module Mongoid
|
|
13
13
|
# Conversions.flag(metadata, 15)
|
14
14
|
#
|
15
15
|
# @param [ Object ] object The object to flag.
|
16
|
-
# @param [ Metadata ]
|
16
|
+
# @param [ Metadata ] The relation metadata.
|
17
17
|
#
|
18
18
|
# @return [ Object ] The provided object.
|
19
19
|
#
|
@@ -11,11 +11,13 @@ module Mongoid
|
|
11
11
|
# @example Reset the given counter cache
|
12
12
|
# post.reset_counters(:comments)
|
13
13
|
#
|
14
|
-
# @param [ Symbol, Array ]
|
14
|
+
# @param [ Symbol, Array ] One or more counter caches to reset
|
15
15
|
#
|
16
16
|
# @since 4.0.0
|
17
17
|
def reset_counters(*counters)
|
18
|
-
self.class.
|
18
|
+
self.class.with(persistence_context) do |_class|
|
19
|
+
_class.reset_counters(self, *counters)
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
module ClassMethods
|
@@ -27,8 +29,8 @@ module Mongoid
|
|
27
29
|
# @example Reset the given counter cache
|
28
30
|
# Post.reset_counters('50e0edd97c71c17ea9000001', :comments)
|
29
31
|
#
|
30
|
-
# @param [ String ]
|
31
|
-
# @param [ Symbol, Array ]
|
32
|
+
# @param [ String ] The id of the object that will be reset.
|
33
|
+
# @param [ Symbol, Array ] One or more counter caches to reset
|
32
34
|
#
|
33
35
|
# @since 3.1.0
|
34
36
|
def reset_counters(id, *counters)
|
@@ -49,8 +51,8 @@ module Mongoid
|
|
49
51
|
# Post.update_counters('50e0edd97c71c17ea9000001',
|
50
52
|
# :comments_count => 5, :likes_count => -2)
|
51
53
|
#
|
52
|
-
# @param [ String ]
|
53
|
-
# @param [ Hash ]
|
54
|
+
# @param [ String ] The id of the object to update.
|
55
|
+
# @param [ Hash ] Key = counter_cache and Value = factor.
|
54
56
|
#
|
55
57
|
# @since 3.1.0
|
56
58
|
def update_counters(id, counters)
|
@@ -64,8 +66,8 @@ module Mongoid
|
|
64
66
|
# @example Increment comments counter
|
65
67
|
# Post.increment_counter(:comments_count, '50e0edd97c71c17ea9000001')
|
66
68
|
#
|
67
|
-
# @param [ Symbol ]
|
68
|
-
# @param [ String ]
|
69
|
+
# @param [ Symbol ] Counter cache name
|
70
|
+
# @param [ String ] The id of the object that will have its counter incremented.
|
69
71
|
#
|
70
72
|
# @since 3.1.0
|
71
73
|
def increment_counter(counter_name, id)
|
@@ -79,8 +81,8 @@ module Mongoid
|
|
79
81
|
# @example Decrement comments counter
|
80
82
|
# Post.decrement_counter(:comments_count, '50e0edd97c71c17ea9000001')
|
81
83
|
#
|
82
|
-
# @param [ Symbol ]
|
83
|
-
# @param [ String ]
|
84
|
+
# @param [ Symbol ] Counter cache name
|
85
|
+
# @param [ String ] The id of the object that will have its counter decremented.
|
84
86
|
#
|
85
87
|
# @since 3.1.0
|
86
88
|
def decrement_counter(counter_name, id)
|
@@ -96,7 +98,7 @@ module Mongoid
|
|
96
98
|
# @example Add the touchable.
|
97
99
|
# Person.add_counter_cache_callbacks(meta)
|
98
100
|
#
|
99
|
-
# @param [ Metadata ]
|
101
|
+
# @param [ Metadata ] metadata The metadata for the relation.
|
100
102
|
#
|
101
103
|
# @since 3.1.0
|
102
104
|
def add_counter_cache_callbacks(meta)
|
@@ -105,18 +107,22 @@ module Mongoid
|
|
105
107
|
|
106
108
|
after_update do
|
107
109
|
if record = __send__(name)
|
108
|
-
|
110
|
+
id_field = "#{name}_id"
|
109
111
|
|
110
|
-
if attribute_changed?(
|
111
|
-
original, current = attribute_change(
|
112
|
+
if attribute_changed?(id_field)
|
113
|
+
original, current = attribute_change(id_field)
|
112
114
|
|
113
115
|
unless original.nil?
|
114
|
-
record.class.
|
116
|
+
record.class.with(persistence_context) do |_class|
|
117
|
+
_class.decrement_counter(cache_column, original)
|
118
|
+
end
|
115
119
|
end
|
116
120
|
|
117
121
|
unless current.nil?
|
118
122
|
record[cache_column] = (record[cache_column] || 0) + 1
|
119
|
-
record.class.
|
123
|
+
record.class.with(record.persistence_context) do |_class|
|
124
|
+
_class.increment_counter(cache_column, current) if record.persisted?
|
125
|
+
end
|
120
126
|
end
|
121
127
|
end
|
122
128
|
end
|
@@ -127,7 +133,9 @@ module Mongoid
|
|
127
133
|
record[cache_column] = (record[cache_column] || 0) + 1
|
128
134
|
|
129
135
|
if record.persisted?
|
130
|
-
record.class.
|
136
|
+
record.class.with(record.persistence_context) do |_class|
|
137
|
+
_class.increment_counter(cache_column, record._id)
|
138
|
+
end
|
131
139
|
record.remove_change(cache_column)
|
132
140
|
end
|
133
141
|
end
|
@@ -138,7 +146,9 @@ module Mongoid
|
|
138
146
|
record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen?
|
139
147
|
|
140
148
|
if record.persisted?
|
141
|
-
record.class.
|
149
|
+
record.class.with(record.persistence_context) do |_class|
|
150
|
+
_class.decrement_counter(cache_column, record._id)
|
151
|
+
end
|
142
152
|
record.remove_change(cache_column)
|
143
153
|
end
|
144
154
|
end
|
@@ -9,16 +9,28 @@ module Mongoid
|
|
9
9
|
module Relations
|
10
10
|
module Eager
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
attr_accessor :eager_loaded
|
13
|
+
|
14
|
+
def with_eager_loading(document)
|
15
|
+
return nil unless document
|
16
|
+
doc = Factory.from_db(klass, document, criteria.options[:fields])
|
17
|
+
eager_load_one(doc)
|
18
|
+
doc
|
19
|
+
end
|
20
|
+
|
21
|
+
def eager_load_one(doc)
|
22
|
+
eager_load([doc])
|
23
|
+
end
|
24
|
+
|
25
|
+
def eager_loadable?(document = nil)
|
26
|
+
return false if criteria.inclusions.empty?
|
27
|
+
!eager_loaded
|
14
28
|
end
|
15
29
|
|
16
30
|
def eager_load(docs)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
31
|
+
return false unless eager_loadable?
|
32
|
+
preload(criteria.inclusions, docs)
|
33
|
+
self.eager_loaded = true
|
22
34
|
end
|
23
35
|
|
24
36
|
def preload(relations, docs)
|
@@ -12,8 +12,8 @@ module Mongoid
|
|
12
12
|
# @example Create the new belongs to eager load preloader.
|
13
13
|
# BelongsTo.new(relations_metadata, parent_docs)
|
14
14
|
#
|
15
|
-
# @param [ Array<Metadata> ]
|
16
|
-
# @param [ Array<Document> ]
|
15
|
+
# @param [ Array<Metadata> ] Relations to eager load
|
16
|
+
# @param [ Array<Document> ] Documents to preload the relations
|
17
17
|
#
|
18
18
|
# @return [ Base ] The eager load preloader
|
19
19
|
#
|
@@ -84,7 +84,7 @@ module Mongoid
|
|
84
84
|
# @example Set docs into parent with pk = "foo"
|
85
85
|
# loader.set_on_parent("foo", docs)
|
86
86
|
#
|
87
|
-
# @param [ ObjectId ]
|
87
|
+
# @param [ ObjectId ] parent`s id
|
88
88
|
# @param [ Document, Array ] element to push into the parent
|
89
89
|
#
|
90
90
|
# @since 4.0.0
|
@@ -140,12 +140,12 @@ module Mongoid
|
|
140
140
|
# @example Set docs into parent using the current relation name.
|
141
141
|
# loader.set_relation(doc, docs)
|
142
142
|
#
|
143
|
-
# @param [ Document ]
|
143
|
+
# @param [ Document ] document
|
144
144
|
# @param [ Document, Array ] element to set into the parent
|
145
145
|
#
|
146
146
|
# @since 4.0.0
|
147
147
|
def set_relation(doc, element)
|
148
|
-
doc.set_relation(@metadata.name, element)
|
148
|
+
doc.set_relation(@metadata.name, element)
|
149
149
|
end
|
150
150
|
end
|
151
151
|
end
|
@@ -13,15 +13,15 @@ module Mongoid
|
|
13
13
|
# made to the database.
|
14
14
|
#
|
15
15
|
# @example Execute the batch push.
|
16
|
-
# batchable.
|
16
|
+
# batchable.batch_insert([ doc_one, doc_two ])
|
17
17
|
#
|
18
18
|
# @param [ Array<Document> ] docs The docs to add.
|
19
19
|
#
|
20
20
|
# @return [ Array<Hash> ] The inserts.
|
21
21
|
#
|
22
|
-
# @since
|
23
|
-
def
|
24
|
-
|
22
|
+
# @since 3.0.0
|
23
|
+
def batch_insert(docs)
|
24
|
+
execute_batch_insert(docs, "$pushAll")
|
25
25
|
end
|
26
26
|
|
27
27
|
# Clear all of the docs out of the relation in a single swipe.
|
@@ -89,7 +89,7 @@ module Mongoid
|
|
89
89
|
base.delayed_atomic_sets.clear unless _assigning?
|
90
90
|
docs = normalize_docs(docs).compact
|
91
91
|
target.clear and _unscoped.clear
|
92
|
-
inserts =
|
92
|
+
inserts = execute_batch_insert(docs, "$set")
|
93
93
|
add_atomic_sets(inserts)
|
94
94
|
end
|
95
95
|
end
|
@@ -122,50 +122,26 @@ module Mongoid
|
|
122
122
|
# @api private
|
123
123
|
#
|
124
124
|
# @example Perform a batch operation.
|
125
|
-
# batchable.
|
125
|
+
# batchable.execute_batch(docs, "$set")
|
126
126
|
#
|
127
127
|
# @param [ Array<Document> ] docs The docs to persist.
|
128
128
|
# @param [ String ] operation The atomic operation.
|
129
129
|
#
|
130
130
|
# @return [ Array<Hash> ] The inserts.
|
131
131
|
#
|
132
|
-
# @since
|
133
|
-
def
|
132
|
+
# @since 3.0.0
|
133
|
+
def execute_batch_insert(docs, operation)
|
134
134
|
self.inserts_valid = true
|
135
135
|
inserts = pre_process_batch_insert(docs)
|
136
136
|
if insertable?
|
137
137
|
collection.find(selector).update_one(
|
138
|
-
positionally(selector,
|
138
|
+
positionally(selector, operation => { path => inserts })
|
139
139
|
)
|
140
140
|
post_process_batch_insert(docs)
|
141
141
|
end
|
142
142
|
inserts
|
143
143
|
end
|
144
144
|
|
145
|
-
# Perform a batch persist of the provided documents with $push and $each.
|
146
|
-
#
|
147
|
-
# @api private
|
148
|
-
#
|
149
|
-
# @example Perform a batch push.
|
150
|
-
# batchable.execute_batch_push(docs)
|
151
|
-
#
|
152
|
-
# @param [ Array<Document> ] docs The docs to persist.
|
153
|
-
# @param [ String ] operation The atomic operation.
|
154
|
-
#
|
155
|
-
# @return [ Array<Hash> ] The inserts.
|
156
|
-
#
|
157
|
-
# @since 5.4.0
|
158
|
-
def execute_batch_push(docs)
|
159
|
-
self.inserts_valid = true
|
160
|
-
pushes = pre_process_batch_insert(docs)
|
161
|
-
if insertable?
|
162
|
-
collection.find(selector).update_one(
|
163
|
-
positionally(selector, '$push' => { path => { '$each' => pushes } }))
|
164
|
-
post_process_batch_insert(docs)
|
165
|
-
end
|
166
|
-
pushes
|
167
|
-
end
|
168
|
-
|
169
145
|
# Are we in a state to be able to batch insert?
|
170
146
|
#
|
171
147
|
# @api private
|