mongoid 2.4.9 → 3.0.0.rc
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.
- data/CHANGELOG.md +869 -8
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -17
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/atomic.rb +16 -6
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/callbacks.rb +100 -42
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +10 -22
- data/lib/mongoid/config/environment.rb +4 -3
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +436 -248
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +68 -49
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/errors.rb +22 -1
- data/lib/mongoid/extensions/array.rb +127 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +26 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +4 -4
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +39 -12
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence.rb +64 -27
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +119 -19
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +3 -3
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/cascading/delete.rb +12 -4
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/cascading.rb +6 -4
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -148
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -60
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +231 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- data/lib/mongoid/relations/one.rb +14 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +116 -122
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/relations/touchable.rb +32 -0
- data/lib/mongoid/relations.rb +6 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +13 -30
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded/lifecycle.rb +21 -21
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +34 -4
- data/lib/mongoid/validations/uniqueness.rb +103 -25
- data/lib/mongoid/validations.rb +62 -20
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/mongoid.rb +24 -39
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +69 -25
- metadata +93 -155
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/mongo.rb +0 -485
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -108
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -76
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -31
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
require "mongoid/relations/embedded/batchable"
|
|
3
|
+
|
|
4
|
+
module Mongoid
|
|
5
|
+
module Relations
|
|
6
|
+
module Embedded
|
|
5
7
|
|
|
6
8
|
# This class handles the behaviour for a document that embeds many other
|
|
7
9
|
# documents within in it as an array.
|
|
8
10
|
class Many < Relations::Many
|
|
9
|
-
include
|
|
11
|
+
include Batchable
|
|
10
12
|
|
|
11
13
|
# Appends a document or array of documents to the relation. Will set
|
|
12
14
|
# the parent and update the index in the process.
|
|
@@ -25,6 +27,7 @@ module Mongoid # :nodoc:
|
|
|
25
27
|
append(doc)
|
|
26
28
|
doc.save if persistable? && !_assigning?
|
|
27
29
|
end
|
|
30
|
+
self
|
|
28
31
|
end
|
|
29
32
|
alias :push :<<
|
|
30
33
|
|
|
@@ -37,37 +40,27 @@ module Mongoid # :nodoc:
|
|
|
37
40
|
#
|
|
38
41
|
# @since 2.0.0.rc.1
|
|
39
42
|
def as_document
|
|
40
|
-
[]
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
end
|
|
43
|
+
attributes = []
|
|
44
|
+
_unscoped.each do |doc|
|
|
45
|
+
attributes.push(doc.as_document)
|
|
44
46
|
end
|
|
47
|
+
attributes
|
|
45
48
|
end
|
|
46
49
|
|
|
47
50
|
# Appends an array of documents to the relation. Performs a batch
|
|
48
51
|
# insert of the documents instead of persisting one at a time.
|
|
49
52
|
#
|
|
50
|
-
# @note When performing batch inserts the *after* callbacks will get
|
|
51
|
-
# executed before the documents have actually been persisted to the
|
|
52
|
-
# database due to an issue with Active Support's callback system - we
|
|
53
|
-
# cannot explicitly fire the after callbacks by themselves.
|
|
54
|
-
#
|
|
55
53
|
# @example Concat with other documents.
|
|
56
54
|
# person.addresses.concat([ address_one, address_two ])
|
|
57
55
|
#
|
|
58
|
-
# @param [ Array<Document> ]
|
|
56
|
+
# @param [ Array<Document> ] docs The docs to add.
|
|
59
57
|
#
|
|
60
58
|
# @return [ Array<Document> ] The documents.
|
|
61
59
|
#
|
|
62
60
|
# @since 2.4.0
|
|
63
|
-
def concat(
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
next unless doc
|
|
67
|
-
append(doc)
|
|
68
|
-
doc.save if persistable?
|
|
69
|
-
end
|
|
70
|
-
end
|
|
61
|
+
def concat(docs)
|
|
62
|
+
batch_insert(docs)
|
|
63
|
+
self
|
|
71
64
|
end
|
|
72
65
|
|
|
73
66
|
# Builds a new document in the relation and appends it to the target.
|
|
@@ -87,17 +80,15 @@ module Mongoid # :nodoc:
|
|
|
87
80
|
#
|
|
88
81
|
# @return [ Document ] The new document.
|
|
89
82
|
def build(attributes = {}, options = {}, type = nil)
|
|
90
|
-
if options.is_a?
|
|
83
|
+
if options.is_a?(Class)
|
|
91
84
|
options, type = {}, options
|
|
92
85
|
end
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
doc.run_callbacks(:build) { doc }
|
|
100
|
-
end
|
|
86
|
+
doc = Factory.build(type || metadata.klass, attributes, options)
|
|
87
|
+
append(doc)
|
|
88
|
+
doc.apply_post_processed_defaults
|
|
89
|
+
yield(doc) if block_given?
|
|
90
|
+
doc.run_callbacks(:build) { doc }
|
|
91
|
+
doc
|
|
101
92
|
end
|
|
102
93
|
alias :new :build
|
|
103
94
|
|
|
@@ -109,12 +100,8 @@ module Mongoid # :nodoc:
|
|
|
109
100
|
#
|
|
110
101
|
# @return [ Many ] The empty relation.
|
|
111
102
|
def clear
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
proxy.delete_all
|
|
115
|
-
_unscoped.clear
|
|
116
|
-
end
|
|
117
|
-
end
|
|
103
|
+
batch_clear(target.dup)
|
|
104
|
+
self
|
|
118
105
|
end
|
|
119
106
|
|
|
120
107
|
# Returns a count of the number of documents in the association that have
|
|
@@ -131,49 +118,6 @@ module Mongoid # :nodoc:
|
|
|
131
118
|
target.select { |doc| doc.persisted? }.size
|
|
132
119
|
end
|
|
133
120
|
|
|
134
|
-
# Create a new document in the relation. This is essentially the same
|
|
135
|
-
# as doing a #build then #save on the new document.
|
|
136
|
-
#
|
|
137
|
-
# @example Create a new document in the relation.
|
|
138
|
-
# person.movies.create(:name => "Bozo")
|
|
139
|
-
#
|
|
140
|
-
# @overload create(attributes = {}, options = {}, type = nil)
|
|
141
|
-
# @param [ Hash ] attributes The attributes to build the document with.
|
|
142
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
143
|
-
# @param [ Class ] type Optional class to create the document with.
|
|
144
|
-
#
|
|
145
|
-
# @overload create(attributes = {}, type = nil)
|
|
146
|
-
# @param [ Hash ] attributes The attributes to build the document with.
|
|
147
|
-
# @param [ Class ] type Optional class to create the document with.
|
|
148
|
-
#
|
|
149
|
-
# @return [ Document ] The newly created document.
|
|
150
|
-
def create(attributes = {}, options = {}, type = nil, &block)
|
|
151
|
-
build(attributes, options, type, &block).tap { |doc| doc.save }
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
# Create a new document in the relation. This is essentially the same
|
|
155
|
-
# as doing a #build then #save on the new document. If validation
|
|
156
|
-
# failed on the document an error will get raised.
|
|
157
|
-
#
|
|
158
|
-
# @example Create the document.
|
|
159
|
-
# person.addresses.create!(:street => "Unter der Linden")</tt>
|
|
160
|
-
#
|
|
161
|
-
# @overload create!(attributes = {}, options = {}, type = nil)
|
|
162
|
-
# @param [ Hash ] attributes The attributes to build the document with.
|
|
163
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
164
|
-
# @param [ Class ] type Optional class to create the document with.
|
|
165
|
-
#
|
|
166
|
-
# @overload create!(attributes = {}, type = nil)
|
|
167
|
-
# @param [ Hash ] attributes The attributes to build the document with.
|
|
168
|
-
# @param [ Class ] type Optional class to create the document with.
|
|
169
|
-
#
|
|
170
|
-
# @raise [ Errors::Validations ] If a validation error occured.
|
|
171
|
-
#
|
|
172
|
-
# @return [ Document ] The newly created document.
|
|
173
|
-
def create!(attributes = {}, options = {}, type = nil, &block)
|
|
174
|
-
build(attributes, options, type, &block).tap { |doc| doc.save! }
|
|
175
|
-
end
|
|
176
|
-
|
|
177
121
|
# Delete the supplied document from the target. This method is proxied
|
|
178
122
|
# in order to reindex the array after the operation occurs.
|
|
179
123
|
#
|
|
@@ -186,18 +130,22 @@ module Mongoid # :nodoc:
|
|
|
186
130
|
#
|
|
187
131
|
# @since 2.0.0.rc.1
|
|
188
132
|
def delete(document)
|
|
189
|
-
target.delete_one(document)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
133
|
+
doc = target.delete_one(document)
|
|
134
|
+
_unscoped.delete_one(doc)
|
|
135
|
+
if doc && !_binding?
|
|
136
|
+
if _assigning?
|
|
137
|
+
if doc.paranoid?
|
|
138
|
+
doc.destroy(suppress: true)
|
|
194
139
|
else
|
|
195
|
-
|
|
140
|
+
base.add_atomic_pull(doc)
|
|
196
141
|
end
|
|
197
|
-
|
|
142
|
+
else
|
|
143
|
+
doc.delete(suppress: true)
|
|
198
144
|
end
|
|
199
|
-
|
|
145
|
+
unbind_one(doc)
|
|
200
146
|
end
|
|
147
|
+
reindex
|
|
148
|
+
doc
|
|
201
149
|
end
|
|
202
150
|
|
|
203
151
|
# Delete all the documents in the association without running callbacks.
|
|
@@ -206,13 +154,13 @@ module Mongoid # :nodoc:
|
|
|
206
154
|
# person.addresses.delete_all
|
|
207
155
|
#
|
|
208
156
|
# @example Conditionally delete documents from the relation.
|
|
209
|
-
# person.addresses.delete_all(
|
|
157
|
+
# person.addresses.delete_all({ :street => "Bond" })
|
|
210
158
|
#
|
|
211
159
|
# @param [ Hash ] conditions Conditions on which documents to delete.
|
|
212
160
|
#
|
|
213
161
|
# @return [ Integer ] The number of documents deleted.
|
|
214
162
|
def delete_all(conditions = {})
|
|
215
|
-
|
|
163
|
+
remove_all(conditions, :delete)
|
|
216
164
|
end
|
|
217
165
|
|
|
218
166
|
# Destroy all the documents in the association whilst running callbacks.
|
|
@@ -221,13 +169,13 @@ module Mongoid # :nodoc:
|
|
|
221
169
|
# person.addresses.destroy_all
|
|
222
170
|
#
|
|
223
171
|
# @example Conditionally destroy documents from the relation.
|
|
224
|
-
# person.addresses.destroy_all(
|
|
172
|
+
# person.addresses.destroy_all({ :street => "Bond" })
|
|
225
173
|
#
|
|
226
174
|
# @param [ Hash ] conditions Conditions on which documents to destroy.
|
|
227
175
|
#
|
|
228
176
|
# @return [ Integer ] The number of documents destroyed.
|
|
229
177
|
def destroy_all(conditions = {})
|
|
230
|
-
|
|
178
|
+
remove_all(conditions, :destroy)
|
|
231
179
|
end
|
|
232
180
|
|
|
233
181
|
# Finds a document in this association through several different
|
|
@@ -239,11 +187,6 @@ module Mongoid # :nodoc:
|
|
|
239
187
|
# @example Find documents for multiple ids.
|
|
240
188
|
# person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
|
241
189
|
#
|
|
242
|
-
# @example Find documents based on conditions.
|
|
243
|
-
# person.addresses.find(:all, :conditions => { :number => 10 })
|
|
244
|
-
# person.addresses.find(:first, :conditions => { :number => 10 })
|
|
245
|
-
# person.addresses.find(:last, :conditions => { :number => 10 })
|
|
246
|
-
#
|
|
247
190
|
# @param [ Array<Object> ] args Various arguments.
|
|
248
191
|
#
|
|
249
192
|
# @return [ Array<Document>, Document ] A single or multiple documents.
|
|
@@ -284,46 +227,45 @@ module Mongoid # :nodoc:
|
|
|
284
227
|
target
|
|
285
228
|
end
|
|
286
229
|
|
|
230
|
+
# Pop documents off the relation. This can be a single document or
|
|
231
|
+
# multiples, and will automatically persist the changes.
|
|
232
|
+
#
|
|
233
|
+
# @example Pop a single document.
|
|
234
|
+
# relation.pop
|
|
235
|
+
#
|
|
236
|
+
# @example Pop multiple documents.
|
|
237
|
+
# relation.pop(3)
|
|
238
|
+
#
|
|
239
|
+
# @param [ Integer ] count The number of documents to pop, or 1 if not
|
|
240
|
+
# provided.
|
|
241
|
+
#
|
|
242
|
+
# @return [ Document, Array<Document> ] The popped document(s).
|
|
243
|
+
#
|
|
244
|
+
# @since 3.0.0
|
|
245
|
+
def pop(count = nil)
|
|
246
|
+
if count
|
|
247
|
+
if docs = target[target.size - count, target.size]
|
|
248
|
+
docs.each { |doc| delete(doc) }
|
|
249
|
+
end
|
|
250
|
+
else
|
|
251
|
+
delete(target[-1])
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
287
255
|
# Substitutes the supplied target documents for the existing documents
|
|
288
256
|
# in the relation.
|
|
289
257
|
#
|
|
290
258
|
# @example Substitute the relation's target.
|
|
291
259
|
# person.addresses.substitute([ address ])
|
|
292
260
|
#
|
|
293
|
-
# @param [ Array<Document> ]
|
|
294
|
-
# @param [ true, false ] building Are we in build mode?
|
|
261
|
+
# @param [ Array<Document> ] docs The replacement docs.
|
|
295
262
|
#
|
|
296
263
|
# @return [ Many ] The proxied relation.
|
|
297
264
|
#
|
|
298
265
|
# @since 2.0.0.rc.1
|
|
299
|
-
def substitute(
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if _assigning? && !proxy.empty?
|
|
303
|
-
base.atomic_unsets.push(_unscoped.first.atomic_path)
|
|
304
|
-
end
|
|
305
|
-
proxy.clear
|
|
306
|
-
else
|
|
307
|
-
atomically(:$set) do
|
|
308
|
-
base.delayed_atomic_sets.clear
|
|
309
|
-
if replacement.first.is_a?(Hash)
|
|
310
|
-
replacement = Many.builder(base, metadata, replacement).build
|
|
311
|
-
end
|
|
312
|
-
docs = replacement.compact
|
|
313
|
-
proxy.target = docs
|
|
314
|
-
self._unscoped = docs.dup
|
|
315
|
-
proxy.target.each_with_index do |doc, index|
|
|
316
|
-
integrate(doc)
|
|
317
|
-
doc._index = index
|
|
318
|
-
doc.save if base.persisted? && !_assigning?
|
|
319
|
-
end
|
|
320
|
-
if _assigning?
|
|
321
|
-
name = _unscoped.first.atomic_path
|
|
322
|
-
base.delayed_atomic_sets[name] = proxy.as_document
|
|
323
|
-
end
|
|
324
|
-
end
|
|
325
|
-
end
|
|
326
|
-
end
|
|
266
|
+
def substitute(docs)
|
|
267
|
+
batch_replace(docs)
|
|
268
|
+
self
|
|
327
269
|
end
|
|
328
270
|
|
|
329
271
|
# Return the relation with all previous scoping removed. This is the
|
|
@@ -336,9 +278,10 @@ module Mongoid # :nodoc:
|
|
|
336
278
|
#
|
|
337
279
|
# @since 2.4.0
|
|
338
280
|
def unscoped
|
|
339
|
-
klass.
|
|
340
|
-
|
|
341
|
-
|
|
281
|
+
criterion = klass.unscoped
|
|
282
|
+
criterion.embedded = true
|
|
283
|
+
criterion.documents = _unscoped
|
|
284
|
+
criterion
|
|
342
285
|
end
|
|
343
286
|
|
|
344
287
|
private
|
|
@@ -381,9 +324,10 @@ module Mongoid # :nodoc:
|
|
|
381
324
|
#
|
|
382
325
|
# @return [ Criteria ] A new criteria.
|
|
383
326
|
def criteria
|
|
384
|
-
klass.
|
|
385
|
-
|
|
386
|
-
|
|
327
|
+
criterion = klass.scoped
|
|
328
|
+
criterion.embedded = true
|
|
329
|
+
criterion.documents = target
|
|
330
|
+
criterion
|
|
387
331
|
end
|
|
388
332
|
|
|
389
333
|
# Deletes one document from the target and unscoped.
|
|
@@ -472,32 +416,27 @@ module Mongoid # :nodoc:
|
|
|
472
416
|
# @since 2.4.0
|
|
473
417
|
def scope(docs)
|
|
474
418
|
return docs unless metadata.order || metadata.klass.default_scoping?
|
|
475
|
-
metadata.klass.
|
|
476
|
-
|
|
477
|
-
|
|
419
|
+
crit = metadata.klass.order_by(metadata.order)
|
|
420
|
+
crit.embedded = true
|
|
421
|
+
crit.documents = docs
|
|
422
|
+
crit.entries
|
|
478
423
|
end
|
|
479
424
|
|
|
480
425
|
# Remove all documents from the relation, either with a delete or a
|
|
481
426
|
# destroy depending on what this was called through.
|
|
482
427
|
#
|
|
483
428
|
# @example Destroy documents from the relation.
|
|
484
|
-
# relation.remove_all(
|
|
429
|
+
# relation.remove_all({ :num => 1 }, true)
|
|
485
430
|
#
|
|
486
431
|
# @param [ Hash ] conditions Conditions to filter by.
|
|
487
432
|
# @param [ true, false ] destroy If true then destroy, else delete.
|
|
488
433
|
#
|
|
489
434
|
# @return [ Integer ] The number of documents removed.
|
|
490
435
|
def remove_all(conditions = {}, method = :delete)
|
|
491
|
-
criteria =
|
|
492
|
-
criteria.size
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
_unscoped.delete_one(doc)
|
|
496
|
-
doc.send(method, :suppress => true) unless _assigning?
|
|
497
|
-
unbind_one(doc)
|
|
498
|
-
end
|
|
499
|
-
reindex
|
|
500
|
-
end
|
|
436
|
+
criteria = where(conditions || {})
|
|
437
|
+
removed = criteria.size
|
|
438
|
+
batch_remove(criteria, method)
|
|
439
|
+
removed
|
|
501
440
|
end
|
|
502
441
|
|
|
503
442
|
# Get the internal unscoped documents.
|
|
@@ -559,6 +498,18 @@ module Mongoid # :nodoc:
|
|
|
559
498
|
true
|
|
560
499
|
end
|
|
561
500
|
|
|
501
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
|
502
|
+
#
|
|
503
|
+
# @example Get the suffix for the foreign key.
|
|
504
|
+
# Referenced::Many.foreign_key_suffix
|
|
505
|
+
#
|
|
506
|
+
# @return [ nil ] nil.
|
|
507
|
+
#
|
|
508
|
+
# @since 3.0.0
|
|
509
|
+
def foreign_key_suffix
|
|
510
|
+
nil
|
|
511
|
+
end
|
|
512
|
+
|
|
562
513
|
# Returns the macro for this relation. Used mostly as a helper in
|
|
563
514
|
# reflection.
|
|
564
515
|
#
|
|
@@ -635,7 +586,7 @@ module Mongoid # :nodoc:
|
|
|
635
586
|
#
|
|
636
587
|
# @since 2.1.0
|
|
637
588
|
def valid_options
|
|
638
|
-
[ :as, :cascade_callbacks, :cyclic, :order, :versioned ]
|
|
589
|
+
[ :as, :cascade_callbacks, :cyclic, :order, :versioned, :store_as ]
|
|
639
590
|
end
|
|
640
591
|
|
|
641
592
|
# Get the default validation setting for the relation. Determines if
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Embedded
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Embedded
|
|
5
5
|
|
|
6
6
|
# This class defines the behaviour needed for embedded one to one
|
|
7
7
|
# relations.
|
|
@@ -35,17 +35,16 @@ module Mongoid # :nodoc:
|
|
|
35
35
|
#
|
|
36
36
|
# @since 2.0.0.rc.1
|
|
37
37
|
def substitute(replacement)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
proxy.delete if persistable?
|
|
43
|
-
end
|
|
44
|
-
proxy.unbind_one
|
|
45
|
-
return nil unless replacement
|
|
46
|
-
proxy.target = replacement
|
|
47
|
-
proxy.bind_one
|
|
38
|
+
if _assigning?
|
|
39
|
+
base.atomic_unsets.push(atomic_path)
|
|
40
|
+
else
|
|
41
|
+
delete if persistable?
|
|
48
42
|
end
|
|
43
|
+
unbind_one
|
|
44
|
+
return nil unless replacement
|
|
45
|
+
self.target = replacement
|
|
46
|
+
bind_one
|
|
47
|
+
self
|
|
49
48
|
end
|
|
50
49
|
|
|
51
50
|
private
|
|
@@ -108,6 +107,18 @@ module Mongoid # :nodoc:
|
|
|
108
107
|
true
|
|
109
108
|
end
|
|
110
109
|
|
|
110
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
|
111
|
+
#
|
|
112
|
+
# @example Get the suffix for the foreign key.
|
|
113
|
+
# Referenced::Many.foreign_key_suffix
|
|
114
|
+
#
|
|
115
|
+
# @return [ nil ] nil.
|
|
116
|
+
#
|
|
117
|
+
# @since 3.0.0
|
|
118
|
+
def foreign_key_suffix
|
|
119
|
+
nil
|
|
120
|
+
end
|
|
121
|
+
|
|
111
122
|
# Returns the macro for this relation. Used mostly as a helper in
|
|
112
123
|
# reflection.
|
|
113
124
|
#
|
|
@@ -184,7 +195,7 @@ module Mongoid # :nodoc:
|
|
|
184
195
|
#
|
|
185
196
|
# @since 2.1.0
|
|
186
197
|
def valid_options
|
|
187
|
-
[ :as, :cascade_callbacks, :cyclic ]
|
|
198
|
+
[ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
|
|
188
199
|
end
|
|
189
200
|
|
|
190
201
|
# Get the default validation setting for the relation. Determines if
|