mongoid 5.4.1 → 6.1.1
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
- data/README.md +3 -3
- data/lib/config/locales/en.yml +19 -0
- data/lib/mongoid.rb +4 -4
- data/lib/mongoid/atomic.rb +2 -2
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients.rb +8 -63
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +29 -3
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +5 -8
- data/lib/mongoid/contextual/map_reduce.rb +0 -4
- data/lib/mongoid/contextual/memory.rb +2 -2
- data/lib/mongoid/contextual/mongo.rb +40 -22
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria.rb +5 -2
- 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 +87 -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 +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/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 +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 +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/document.rb +30 -37
- data/lib/mongoid/errors.rb +2 -0
- 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/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -4
- 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/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +15 -13
- data/lib/mongoid/interceptable.rb +5 -22
- data/lib/mongoid/matchable.rb +13 -7
- 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/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/persistable.rb +3 -5
- data/lib/mongoid/persistable/creatable.rb +2 -2
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +5 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +215 -0
- data/lib/mongoid/query_cache.rb +3 -6
- 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.rb +6 -11
- 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/embedded/batchable.rb +12 -36
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +28 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- 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 +23 -17
- 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 +11 -11
- data/lib/mongoid/relations/touchable.rb +6 -3
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/book.rb +2 -1
- 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/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 +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 +31 -3
- data/spec/mongoid/clients/options_spec.rb +382 -96
- 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/mongo_spec.rb +165 -20
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- 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 → 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 +4174 -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_spec.rb +152 -21
- data/spec/mongoid/document_spec.rb +37 -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/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/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +68 -10
- 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/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 +173 -53
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +16 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +35 -30
- data/spec/mongoid/persistable/settable_spec.rb +45 -29
- data/spec/mongoid/persistable/updatable_spec.rb +184 -5
- data/spec/mongoid/persistence_context_spec.rb +680 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -0
- 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 +63 -47
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -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 +13 -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/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- 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/spec_helper.rb +20 -11
- metadata +524 -469
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- metadata.gz.sig +0 -0
@@ -140,6 +140,7 @@ module Mongoid
|
|
140
140
|
aliased_fields[name.to_s] = meta.foreign_key
|
141
141
|
touchable(meta)
|
142
142
|
add_counter_cache_callbacks(meta) if meta.counter_cached?
|
143
|
+
validates(name, presence: true) if require_association?(options)
|
143
144
|
meta
|
144
145
|
end
|
145
146
|
|
@@ -197,7 +198,7 @@ module Mongoid
|
|
197
198
|
reference(meta, Array)
|
198
199
|
autosave(meta)
|
199
200
|
validates_relation(meta)
|
200
|
-
|
201
|
+
_synced(meta)
|
201
202
|
meta
|
202
203
|
end
|
203
204
|
|
@@ -350,9 +351,16 @@ module Mongoid
|
|
350
351
|
# @param [ Symbol ] name The name of the relation.
|
351
352
|
# @param [ Metadata ] metadata The metadata for the relation.
|
352
353
|
def relate(name, metadata)
|
354
|
+
Fields::Validators::Macro.validate_relation(self, name)
|
353
355
|
self.relations = relations.merge(name.to_s => metadata)
|
354
356
|
getter(name, metadata).setter(name, metadata).existence_check(name)
|
355
357
|
end
|
358
|
+
|
359
|
+
def require_association?(options = {})
|
360
|
+
required = options[:required] if options.key?(:required)
|
361
|
+
required = !options[:optional] if options.key?(:optional) && required.nil?
|
362
|
+
required.nil? ? Mongoid.belongs_to_required_by_default : required
|
363
|
+
end
|
356
364
|
end
|
357
365
|
end
|
358
366
|
end
|
@@ -778,10 +778,10 @@ module Mongoid
|
|
778
778
|
#
|
779
779
|
# @since 2.0.0.rc.1
|
780
780
|
def validate?
|
781
|
-
|
782
|
-
self[:validate]
|
783
|
-
else
|
781
|
+
if self[:validate].nil?
|
784
782
|
self[:validate] = relation.validation_default
|
783
|
+
else
|
784
|
+
self[:validate]
|
785
785
|
end
|
786
786
|
end
|
787
787
|
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
:name,
|
18
18
|
:relation,
|
19
19
|
:validate
|
20
|
-
]
|
20
|
+
].freeze
|
21
21
|
|
22
22
|
# Determine if the provided options are valid for the relation.
|
23
23
|
#
|
@@ -32,7 +32,7 @@ module Mongoid
|
|
32
32
|
#
|
33
33
|
# @since 2.1.0
|
34
34
|
def validate!(options)
|
35
|
-
valid_options = options[:relation]
|
35
|
+
valid_options = options[:relation]::VALID_OPTIONS + COMMON
|
36
36
|
options.keys.each do |key|
|
37
37
|
if !valid_options.include?(key)
|
38
38
|
raise Errors::InvalidOptions.new(
|
@@ -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)
|
@@ -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
|
@@ -729,18 +746,7 @@ module Mongoid
|
|
729
746
|
#
|
730
747
|
# @since 2.1.0
|
731
748
|
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
|
-
]
|
749
|
+
VALID_OPTIONS
|
744
750
|
end
|
745
751
|
|
746
752
|
# Get the default validation setting for the relation. Determines if
|
@@ -795,8 +801,8 @@ module Mongoid
|
|
795
801
|
# @since 3.0.0
|
796
802
|
def with_inverse_field_criterion(criteria, metadata)
|
797
803
|
inverse_metadata = metadata.inverse_metadata(metadata.klass)
|
798
|
-
if inverse_metadata.try(:
|
799
|
-
criteria.any_in(inverse_metadata.
|
804
|
+
if inverse_metadata.try(:inverse_of)
|
805
|
+
criteria.any_in(inverse_metadata.inverse_of => [ metadata.name, nil ])
|
800
806
|
else
|
801
807
|
criteria
|
802
808
|
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.
|
@@ -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
|
@@ -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
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)
|