mongoid 5.4.1 → 6.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- 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
|