mongoid 2.3.5 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +34 -176
- data/LICENSE +1 -1
- data/lib/config/locales/bg.yml +6 -0
- data/lib/config/locales/de.yml +6 -0
- data/lib/config/locales/en-GB.yml +8 -0
- data/lib/config/locales/en.yml +8 -0
- data/lib/config/locales/es.yml +9 -3
- data/lib/config/locales/fr.yml +6 -0
- data/lib/config/locales/hi.yml +6 -0
- data/lib/config/locales/hu.yml +6 -0
- data/lib/config/locales/id.yml +6 -0
- data/lib/config/locales/it.yml +6 -0
- data/lib/config/locales/ja.yml +6 -0
- data/lib/config/locales/kr.yml +6 -0
- data/lib/config/locales/nl.yml +8 -0
- data/lib/config/locales/pl.yml +6 -0
- data/lib/config/locales/pt-BR.yml +6 -0
- data/lib/config/locales/pt.yml +8 -2
- data/lib/config/locales/ro.yml +6 -0
- data/lib/config/locales/ru.yml +6 -0
- data/lib/config/locales/sv.yml +6 -0
- data/lib/config/locales/vi.yml +14 -8
- data/lib/config/locales/zh-CN.yml +6 -0
- data/lib/mongoid/atomic.rb +62 -13
- data/lib/mongoid/atomic/modifiers.rb +33 -1
- data/lib/mongoid/attributes.rb +5 -19
- data/lib/mongoid/callbacks.rb +2 -1
- data/lib/mongoid/collection.rb +2 -2
- data/lib/mongoid/collections/retry.rb +18 -6
- data/lib/mongoid/components.rb +2 -0
- data/lib/mongoid/config.rb +8 -63
- data/lib/mongoid/config/environment.rb +41 -0
- data/lib/mongoid/config/options.rb +74 -0
- data/lib/mongoid/contexts/enumerable.rb +0 -24
- data/lib/mongoid/contexts/mongo.rb +33 -3
- data/lib/mongoid/copyable.rb +1 -1
- data/lib/mongoid/criteria.rb +4 -2
- data/lib/mongoid/criterion/inclusion.rb +1 -16
- data/lib/mongoid/criterion/optional.rb +37 -10
- data/lib/mongoid/criterion/scoping.rb +83 -0
- data/lib/mongoid/criterion/selector.rb +9 -6
- data/lib/mongoid/default_scope.rb +1 -1
- data/lib/mongoid/dirty.rb +163 -29
- data/lib/mongoid/document.rb +58 -7
- data/lib/mongoid/errors.rb +2 -0
- data/lib/mongoid/errors/no_environment.rb +19 -0
- data/lib/mongoid/errors/scope_overwrite.rb +21 -0
- data/lib/mongoid/extensions.rb +6 -0
- data/lib/mongoid/extensions/array/deep_copy.rb +25 -0
- data/lib/mongoid/extensions/hash/deep_copy.rb +25 -0
- data/lib/mongoid/extensions/hash/scoping.rb +1 -1
- data/lib/mongoid/extensions/object/deep_copy.rb +21 -0
- data/lib/mongoid/extensions/proc/scoping.rb +2 -2
- data/lib/mongoid/extensions/symbol/inflections.rb +1 -0
- data/lib/mongoid/fields.rb +171 -104
- data/lib/mongoid/fields/{serializable → internal}/array.rb +33 -1
- data/lib/mongoid/fields/{serializable → internal}/big_decimal.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/bignum.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/binary.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/boolean.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/date.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/date_time.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/fixnum.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/float.rb +16 -1
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +74 -0
- data/lib/mongoid/fields/{serializable → internal}/foreign_keys/object.rb +11 -2
- data/lib/mongoid/fields/{serializable → internal}/hash.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/integer.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/localized.rb +23 -2
- data/lib/mongoid/fields/{serializable → internal}/nil_class.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/object.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/object_id.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/range.rb +21 -2
- data/lib/mongoid/fields/{serializable → internal}/set.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/string.rb +16 -1
- data/lib/mongoid/fields/{serializable → internal}/symbol.rb +17 -1
- data/lib/mongoid/fields/{serializable → internal}/time.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/time_with_zone.rb +1 -1
- data/lib/mongoid/fields/{serializable → internal}/timekeeping.rb +16 -1
- data/lib/mongoid/fields/mappings.rb +8 -3
- data/lib/mongoid/fields/serializable.rb +34 -3
- data/lib/mongoid/hierarchy.rb +14 -14
- data/lib/mongoid/identity_map.rb +3 -2
- data/lib/mongoid/logger.rb +1 -7
- data/lib/mongoid/named_scope.rb +16 -12
- data/lib/mongoid/observer.rb +5 -1
- data/lib/mongoid/paranoia.rb +1 -0
- data/lib/mongoid/persistence.rb +11 -4
- data/lib/mongoid/persistence/atomic.rb +4 -1
- data/lib/mongoid/persistence/atomic/add_to_set.rb +17 -1
- data/lib/mongoid/persistence/atomic/sets.rb +1 -1
- data/lib/mongoid/railties/database.rake +1 -1
- data/lib/mongoid/relations.rb +1 -3
- data/lib/mongoid/relations/auto_save.rb +1 -1
- data/lib/mongoid/relations/builders.rb +1 -1
- data/lib/mongoid/relations/builders/embedded/many.rb +2 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -1
- data/lib/mongoid/relations/cascading/delete.rb +1 -1
- data/lib/mongoid/relations/cyclic.rb +10 -6
- data/lib/mongoid/relations/embedded/atomic.rb +3 -3
- data/lib/mongoid/relations/embedded/many.rb +98 -20
- data/lib/mongoid/relations/macros.rb +2 -0
- data/lib/mongoid/relations/many.rb +13 -0
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +4 -3
- data/lib/mongoid/relations/proxy.rb +0 -1
- data/lib/mongoid/relations/referenced/batch.rb +3 -2
- data/lib/mongoid/relations/referenced/in.rb +3 -3
- data/lib/mongoid/relations/referenced/many.rb +89 -10
- data/lib/mongoid/relations/referenced/many_to_many.rb +34 -43
- data/lib/mongoid/relations/referenced/one.rb +8 -4
- data/lib/mongoid/relations/synchronization.rb +22 -5
- data/lib/mongoid/threaded.rb +38 -276
- data/lib/mongoid/threaded/lifecycle.rb +18 -18
- data/lib/mongoid/timestamps/updated.rb +13 -3
- data/lib/mongoid/validations.rb +22 -1
- data/lib/mongoid/validations/presence.rb +40 -0
- data/lib/mongoid/validations/uniqueness.rb +14 -3
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +6 -2
- data/lib/rails/mongoid.rb +7 -1
- metadata +64 -45
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +0 -42
- data/lib/mongoid/relations/embedded/sort.rb +0 -31
@@ -27,8 +27,11 @@ module Mongoid #:nodoc:
|
|
27
27
|
# @example Add only a unique value on the field.
|
28
28
|
# person.add_to_set(:aliases, "Bond")
|
29
29
|
#
|
30
|
+
# @example Add only the unique values to the field.
|
31
|
+
# person.add_to_set(:aliases, [ "Bond", "James" ])
|
32
|
+
#
|
30
33
|
# @param [ Symbol ] field The name of the field.
|
31
|
-
# @param [ Object ] value The value to add.
|
34
|
+
# @param [ Object, Array<Object> ] value The value or values to add.
|
32
35
|
# @param [ Hash ] options The mongo persistence options.
|
33
36
|
#
|
34
37
|
# @return [ Array<Object> ] The new value of the field.
|
@@ -20,7 +20,9 @@ module Mongoid #:nodoc:
|
|
20
20
|
prepare do
|
21
21
|
document[field] = [] unless document[field]
|
22
22
|
values = document.send(field)
|
23
|
-
|
23
|
+
Array.wrap(value).each do |val|
|
24
|
+
values.push(val) unless values.include?(val)
|
25
|
+
end
|
24
26
|
values.tap do
|
25
27
|
if document.persisted?
|
26
28
|
collection.update(document.atomic_selector, operation("$addToSet"), options)
|
@@ -29,6 +31,20 @@ module Mongoid #:nodoc:
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
34
|
+
|
35
|
+
# Get the atomic operation to perform.
|
36
|
+
#
|
37
|
+
# @example Get the operation.
|
38
|
+
# add_to_set.operation("$addToSet")
|
39
|
+
#
|
40
|
+
# @param [ String ] modifier The modifier to use.
|
41
|
+
#
|
42
|
+
# @return [ Hash ] The atomic operation for the field and addition.
|
43
|
+
#
|
44
|
+
# @since 2.0.0
|
45
|
+
def operation(modifier)
|
46
|
+
{ modifier => { path => value.is_a?(Array) ? { "$each" => value } : value}}
|
47
|
+
end
|
32
48
|
end
|
33
49
|
end
|
34
50
|
end
|
@@ -17,7 +17,7 @@ module Mongoid #:nodoc:
|
|
17
17
|
# @ssete 2.0.0
|
18
18
|
def persist
|
19
19
|
prepare do
|
20
|
-
|
20
|
+
document[field] = value
|
21
21
|
document[field].tap do
|
22
22
|
collection.update(document.atomic_selector, operation("$set"), options)
|
23
23
|
document.remove_change(field)
|
@@ -78,7 +78,7 @@ namespace :db do
|
|
78
78
|
desc 'Create the indexes defined on your mongoid models'
|
79
79
|
task :create_indexes => :environment do
|
80
80
|
engines_models_paths = Rails.application.railties.engines.map do |engine|
|
81
|
-
engine.paths["app/models"].
|
81
|
+
engine.paths["app/models"].expanded
|
82
82
|
end
|
83
83
|
root_models_paths = Rails.application.paths["app/models"]
|
84
84
|
models_paths = engines_models_paths.push(root_models_paths).flatten
|
data/lib/mongoid/relations.rb
CHANGED
@@ -44,9 +44,7 @@ module Mongoid # :nodoc:
|
|
44
44
|
include Reflections
|
45
45
|
include Synchronization
|
46
46
|
|
47
|
-
|
48
|
-
attr_accessor :metadata
|
49
|
-
end
|
47
|
+
attr_accessor :metadata
|
50
48
|
|
51
49
|
# Determine if the document itself is embedded in another document via the
|
52
50
|
# proper channels. (If it has a parent document.)
|
@@ -25,7 +25,7 @@ module Mongoid # :nodoc:
|
|
25
25
|
set_callback :save, :after do |document|
|
26
26
|
relation = document.send(metadata.name)
|
27
27
|
if relation
|
28
|
-
(relation.do_or_do_not(:in_memory) || relation
|
28
|
+
(relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc|
|
29
29
|
doc.save
|
30
30
|
end
|
31
31
|
end
|
@@ -68,7 +68,7 @@ module Mongoid # :nodoc:
|
|
68
68
|
attributes, options = parse_args(*args)
|
69
69
|
document = Factory.build(metadata.klass, attributes, options)
|
70
70
|
_building do
|
71
|
-
send("#{name}=", document)
|
71
|
+
send("#{name}=", document).tap {|child| child.run_callbacks(:build) }
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
@@ -1,12 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require "mongoid/relations/embedded/sort"
|
3
|
-
|
4
2
|
module Mongoid # :nodoc:
|
5
3
|
module Relations #:nodoc:
|
6
4
|
module Builders #:nodoc:
|
7
5
|
module Embedded #:nodoc:
|
8
6
|
class Many < Builder #:nodoc:
|
9
|
-
include Relations::Embedded::Sort
|
10
7
|
|
11
8
|
# Builds the document out of the attributes using the provided
|
12
9
|
# metadata on the relation. Instantiates through the factory in order
|
@@ -25,12 +22,11 @@ module Mongoid # :nodoc:
|
|
25
22
|
[].tap do |docs|
|
26
23
|
object.each do |attrs|
|
27
24
|
if _loading?
|
28
|
-
docs
|
25
|
+
docs.push(Factory.from_db(klass, attrs))
|
29
26
|
else
|
30
|
-
docs
|
27
|
+
docs.push(Factory.build(klass, attrs))
|
31
28
|
end
|
32
29
|
end
|
33
|
-
sort_documents!(docs, metadata) if metadata.order
|
34
30
|
end
|
35
31
|
end
|
36
32
|
end
|
@@ -92,7 +92,7 @@ module Mongoid # :nodoc:
|
|
92
92
|
def process(parent, attrs)
|
93
93
|
return if reject?(parent, attrs)
|
94
94
|
if id = attrs.extract_id
|
95
|
-
doc = existing.find(convert_id(id))
|
95
|
+
doc = existing.find(convert_id(existing.first.class, id))
|
96
96
|
if destroyable?(attrs)
|
97
97
|
existing.delete(doc)
|
98
98
|
doc.destroy unless doc.embedded?
|
@@ -69,7 +69,7 @@ module Mongoid # :nodoc:
|
|
69
69
|
#
|
70
70
|
# True if the id part of the logic will allow an update.
|
71
71
|
def acceptable_id?
|
72
|
-
id = convert_id(attributes[:id])
|
72
|
+
id = convert_id(existing.class, attributes[:id])
|
73
73
|
existing.id == id || id.nil? || (existing.id != id && update_only?)
|
74
74
|
end
|
75
75
|
|
@@ -16,7 +16,7 @@ module Mongoid # :nodoc:
|
|
16
16
|
# @return [ Array<Document> ] The documents.
|
17
17
|
def build(type = nil)
|
18
18
|
return object.try(:dup) unless query?
|
19
|
-
metadata.criteria(object)
|
19
|
+
metadata.criteria(object || [])
|
20
20
|
end
|
21
21
|
|
22
22
|
# Do we need to perform a database query? It will be so if the object we
|
@@ -35,9 +35,11 @@ module Mongoid # :nodoc:
|
|
35
35
|
# or its children.
|
36
36
|
#
|
37
37
|
# @since 2.0.0.rc.1
|
38
|
-
def recursively_embeds_many
|
39
|
-
|
40
|
-
|
38
|
+
def recursively_embeds_many(options = {})
|
39
|
+
embeds_many(
|
40
|
+
cyclic_child_name,
|
41
|
+
options.merge(:class_name => self.name, :cyclic => true)
|
42
|
+
)
|
41
43
|
embedded_in cyclic_parent_name, :class_name => self.name, :cyclic => true
|
42
44
|
end
|
43
45
|
|
@@ -63,9 +65,11 @@ module Mongoid # :nodoc:
|
|
63
65
|
# or its children.
|
64
66
|
#
|
65
67
|
# @since 2.0.0.rc.1
|
66
|
-
def recursively_embeds_one
|
67
|
-
|
68
|
-
|
68
|
+
def recursively_embeds_one(options = {})
|
69
|
+
embeds_one(
|
70
|
+
cyclic_child_name(false),
|
71
|
+
options.merge(:class_name => self.name, :cyclic => true)
|
72
|
+
)
|
69
73
|
embedded_in cyclic_parent_name, :class_name => self.name, :cyclic => true
|
70
74
|
end
|
71
75
|
|
@@ -55,13 +55,13 @@ module Mongoid #:nodoc:
|
|
55
55
|
#
|
56
56
|
# @since 2.0.0
|
57
57
|
def atomically(modifier, &block)
|
58
|
-
updater = Threaded.update_consumer(
|
59
|
-
Threaded.set_update_consumer(
|
58
|
+
updater = Threaded.update_consumer(root_class) ||
|
59
|
+
Threaded.set_update_consumer(root_class, MODIFIERS[modifier].new)
|
60
60
|
count_executions do
|
61
61
|
block.call if block
|
62
62
|
end.tap do
|
63
63
|
if @executions.zero?
|
64
|
-
Threaded.set_update_consumer(
|
64
|
+
Threaded.set_update_consumer(root_class, nil)
|
65
65
|
updater.execute(collection)
|
66
66
|
end
|
67
67
|
end
|
@@ -17,21 +17,42 @@ module Mongoid # :nodoc:
|
|
17
17
|
# @example Push a document.
|
18
18
|
# person.addresses.push(address)
|
19
19
|
#
|
20
|
+
# @param [ Document, Array<Document> ] *args Any number of documents.
|
21
|
+
def <<(*args)
|
22
|
+
docs = args.flatten
|
23
|
+
return concat(docs) if docs.size > 1
|
24
|
+
if doc = docs.first
|
25
|
+
append(doc)
|
26
|
+
doc.save if persistable? && !_assigning?
|
27
|
+
end
|
28
|
+
end
|
29
|
+
alias :push :<<
|
30
|
+
|
31
|
+
# Appends an array of documents to the relation. Performs a batch
|
32
|
+
# insert of the documents instead of persisting one at a time.
|
33
|
+
#
|
34
|
+
# @note When performing batch inserts the *after* callbacks will get
|
35
|
+
# executed before the documents have actually been persisted to the
|
36
|
+
# database due to an issue with Active Support's callback system - we
|
37
|
+
# cannot explicitly fire the after callbacks by themselves.
|
38
|
+
#
|
20
39
|
# @example Concat with other documents.
|
21
40
|
# person.addresses.concat([ address_one, address_two ])
|
22
41
|
#
|
23
|
-
# @param [
|
24
|
-
|
42
|
+
# @param [ Array<Document> ] documents The docs to add.
|
43
|
+
#
|
44
|
+
# @return [ Array<Document> ] The documents.
|
45
|
+
#
|
46
|
+
# @since 2.4.0
|
47
|
+
def concat(documents)
|
25
48
|
atomically(:$pushAll) do
|
26
|
-
|
49
|
+
documents.each do |doc|
|
27
50
|
next unless doc
|
28
51
|
append(doc)
|
29
|
-
doc.save if persistable?
|
52
|
+
doc.save if persistable?
|
30
53
|
end
|
31
54
|
end
|
32
55
|
end
|
33
|
-
alias :concat :<<
|
34
|
-
alias :push :<<
|
35
56
|
|
36
57
|
# Builds a new document in the relation and appends it to the target.
|
37
58
|
# Takes an optional type if you want to specify a subclass.
|
@@ -58,6 +79,7 @@ module Mongoid # :nodoc:
|
|
58
79
|
doc.identify
|
59
80
|
append(doc)
|
60
81
|
yield(doc) if block_given?
|
82
|
+
doc.run_callbacks(:build) { doc }
|
61
83
|
end
|
62
84
|
end
|
63
85
|
alias :new :build
|
@@ -71,7 +93,10 @@ module Mongoid # :nodoc:
|
|
71
93
|
# @return [ Many ] The empty relation.
|
72
94
|
def clear
|
73
95
|
tap do |proxy|
|
74
|
-
atomically(:$unset)
|
96
|
+
atomically(:$unset) do
|
97
|
+
proxy.delete_all
|
98
|
+
_unscoped.clear
|
99
|
+
end
|
75
100
|
end
|
76
101
|
end
|
77
102
|
|
@@ -145,8 +170,9 @@ module Mongoid # :nodoc:
|
|
145
170
|
# @since 2.0.0.rc.1
|
146
171
|
def delete(document)
|
147
172
|
target.delete_one(document).tap do |doc|
|
173
|
+
_unscoped.delete_one(doc)
|
148
174
|
if doc && !_binding?
|
149
|
-
if _assigning?
|
175
|
+
if _assigning? && !doc.paranoid?
|
150
176
|
base.add_atomic_pull(doc)
|
151
177
|
else
|
152
178
|
doc.delete(:suppress => true)
|
@@ -224,6 +250,8 @@ module Mongoid # :nodoc:
|
|
224
250
|
integrate(doc)
|
225
251
|
doc._index = index
|
226
252
|
end
|
253
|
+
@_unscoped = target.dup
|
254
|
+
@target = scope(target)
|
227
255
|
end
|
228
256
|
end
|
229
257
|
|
@@ -263,7 +291,9 @@ module Mongoid # :nodoc:
|
|
263
291
|
if replacement.first.is_a?(Hash)
|
264
292
|
replacement = Many.builder(base, metadata, replacement).build
|
265
293
|
end
|
266
|
-
|
294
|
+
docs = replacement.compact
|
295
|
+
proxy.target = docs
|
296
|
+
self._unscoped = docs.dup
|
267
297
|
if _assigning?
|
268
298
|
base.delayed_atomic_sets[metadata.name.to_s] = proxy.as_document
|
269
299
|
end
|
@@ -287,23 +317,25 @@ module Mongoid # :nodoc:
|
|
287
317
|
# @since 2.0.0.rc.1
|
288
318
|
def as_document
|
289
319
|
[].tap do |attributes|
|
290
|
-
|
291
|
-
attributes
|
320
|
+
_unscoped.each do |doc|
|
321
|
+
attributes.push(doc.as_document)
|
292
322
|
end
|
293
323
|
end
|
294
324
|
end
|
295
325
|
|
296
|
-
#
|
297
|
-
#
|
326
|
+
# Return the relation with all previous scoping removed. This is the
|
327
|
+
# exact representation of the docs in the database.
|
298
328
|
#
|
299
|
-
# @example Get the unscoped
|
329
|
+
# @example Get the unscoped documents.
|
300
330
|
# person.addresses.unscoped
|
301
331
|
#
|
302
|
-
# @return [ Criteria ] The unscoped
|
332
|
+
# @return [ Criteria ] The unscoped relation.
|
303
333
|
#
|
304
|
-
# @since 2.
|
334
|
+
# @since 2.4.0
|
305
335
|
def unscoped
|
306
|
-
criteria(false)
|
336
|
+
klass.criteria(true, false).tap do |criterion|
|
337
|
+
criterion.documents = _unscoped
|
338
|
+
end
|
307
339
|
end
|
308
340
|
|
309
341
|
private
|
@@ -319,6 +351,7 @@ module Mongoid # :nodoc:
|
|
319
351
|
# @since 2.0.0.rc.1
|
320
352
|
def append(document)
|
321
353
|
target.push(document)
|
354
|
+
_unscoped.push(document)
|
322
355
|
integrate(document)
|
323
356
|
document._index = target.size - 1
|
324
357
|
end
|
@@ -344,8 +377,8 @@ module Mongoid # :nodoc:
|
|
344
377
|
# relation.criteria
|
345
378
|
#
|
346
379
|
# @return [ Criteria ] A new criteria.
|
347
|
-
def criteria
|
348
|
-
klass.criteria(true
|
380
|
+
def criteria
|
381
|
+
klass.criteria(true).tap do |criterion|
|
349
382
|
criterion.documents = target
|
350
383
|
end
|
351
384
|
end
|
@@ -402,11 +435,29 @@ module Mongoid # :nodoc:
|
|
402
435
|
#
|
403
436
|
# @since 2.0.0.rc.1
|
404
437
|
def reindex
|
405
|
-
|
438
|
+
_unscoped.each_with_index do |doc, index|
|
406
439
|
doc._index = index
|
407
440
|
end
|
408
441
|
end
|
409
442
|
|
443
|
+
# Apply the metadata ordering or the default scoping to the provided
|
444
|
+
# documents.
|
445
|
+
#
|
446
|
+
# @example Apply scoping.
|
447
|
+
# person.addresses.scope(target)
|
448
|
+
#
|
449
|
+
# @param [ Array<Document> ] docs The documents to scope.
|
450
|
+
#
|
451
|
+
# @return [ Array<Document> ] The scoped docs.
|
452
|
+
#
|
453
|
+
# @since 2.4.0
|
454
|
+
def scope(docs)
|
455
|
+
return docs unless metadata.order || metadata.klass.default_scoping?
|
456
|
+
metadata.klass.criteria(true).order_by(metadata.order).tap do |crit|
|
457
|
+
crit.documents = docs
|
458
|
+
end.entries
|
459
|
+
end
|
460
|
+
|
410
461
|
# Remove all documents from the relation, either with a delete or a
|
411
462
|
# destroy depending on what this was called through.
|
412
463
|
#
|
@@ -422,6 +473,7 @@ module Mongoid # :nodoc:
|
|
422
473
|
criteria.size.tap do
|
423
474
|
criteria.each do |doc|
|
424
475
|
target.delete_one(doc)
|
476
|
+
_unscoped.delete_one(doc)
|
425
477
|
doc.send(method, :suppress => true) unless _assigning?
|
426
478
|
unbind_one(doc)
|
427
479
|
end
|
@@ -429,6 +481,32 @@ module Mongoid # :nodoc:
|
|
429
481
|
end
|
430
482
|
end
|
431
483
|
|
484
|
+
# Get the internal unscoped documents.
|
485
|
+
#
|
486
|
+
# @example Get the unscoped documents.
|
487
|
+
# relation._unscoped
|
488
|
+
#
|
489
|
+
# @return [ Array<Document> ] The unscoped documents.
|
490
|
+
#
|
491
|
+
# @since 2.4.0
|
492
|
+
def _unscoped
|
493
|
+
@_unscoped ||= []
|
494
|
+
end
|
495
|
+
|
496
|
+
# Set the internal unscoped documents.
|
497
|
+
#
|
498
|
+
# @example Set the unscoped documents.
|
499
|
+
# relation._unscoped = docs
|
500
|
+
#
|
501
|
+
# @param [ Array<Document> ] docs The documents.
|
502
|
+
#
|
503
|
+
# @return [ Array<Document ] The unscoped docs.
|
504
|
+
#
|
505
|
+
# @since 2.4.0
|
506
|
+
def _unscoped=(docs)
|
507
|
+
@_unscoped = docs
|
508
|
+
end
|
509
|
+
|
432
510
|
class << self
|
433
511
|
|
434
512
|
# Return the builder that is responsible for generating the documents
|
@@ -76,6 +76,7 @@ module Mongoid # :nodoc:
|
|
76
76
|
# @param [ Proc ] block Optional block for defining extensions.
|
77
77
|
def embeds_many(name, options = {}, &block)
|
78
78
|
characterize(name, Embedded::Many, options, &block).tap do |meta|
|
79
|
+
self.cyclic = true if options[:cyclic]
|
79
80
|
relate(name, meta)
|
80
81
|
validates_relation(meta)
|
81
82
|
end
|
@@ -102,6 +103,7 @@ module Mongoid # :nodoc:
|
|
102
103
|
# @param [ Proc ] block Optional block for defining extensions.
|
103
104
|
def embeds_one(name, options = {}, &block)
|
104
105
|
characterize(name, Embedded::One, options, &block).tap do |meta|
|
106
|
+
self.cyclic = true if options[:cyclic]
|
105
107
|
relate(name, meta)
|
106
108
|
builder(name, meta).creator(name, meta)
|
107
109
|
validates_relation(meta)
|