mongoid 2.4.10 → 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 +843 -9
- 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 -9
- 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 +1 -1
- 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 +31 -19
- 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 +3 -5
- 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 -160
- 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 +2 -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 -128
- 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 +8 -10
- data/lib/mongoid/validations.rb +28 -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 +92 -154
- 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 -487
- 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 -36
- 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,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Referenced
|
|
5
5
|
|
|
6
6
|
# This class handles all behaviour for relations that are either
|
|
7
7
|
# one-to-many or one-to-one, where the foreign key is store on this side
|
|
@@ -25,6 +25,18 @@ module Mongoid # :nodoc:
|
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
# Removes the association between the base document and the target
|
|
29
|
+
# document by deleting the foreign key and the reference, orphaning
|
|
30
|
+
# the target document in the process.
|
|
31
|
+
#
|
|
32
|
+
# @example Nullify the relation.
|
|
33
|
+
# person.game.nullify
|
|
34
|
+
#
|
|
35
|
+
def nullify
|
|
36
|
+
unbind_one
|
|
37
|
+
target.save
|
|
38
|
+
end
|
|
39
|
+
|
|
28
40
|
# Substitutes the supplied target documents for the existing document
|
|
29
41
|
# in the relation.
|
|
30
42
|
#
|
|
@@ -38,12 +50,11 @@ module Mongoid # :nodoc:
|
|
|
38
50
|
#
|
|
39
51
|
# @since 2.0.0.rc.1
|
|
40
52
|
def substitute(replacement)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
end
|
|
53
|
+
unbind_one
|
|
54
|
+
return nil unless replacement
|
|
55
|
+
self.target = replacement
|
|
56
|
+
bind_one
|
|
57
|
+
self
|
|
47
58
|
end
|
|
48
59
|
|
|
49
60
|
private
|
|
@@ -107,7 +118,7 @@ module Mongoid # :nodoc:
|
|
|
107
118
|
#
|
|
108
119
|
# @since 2.1.0
|
|
109
120
|
def criteria(metadata, object, type = nil)
|
|
110
|
-
type.where(:
|
|
121
|
+
type.where(_id: object)
|
|
111
122
|
end
|
|
112
123
|
|
|
113
124
|
# Get the criteria that is used to eager load a relation of this
|
|
@@ -124,8 +135,8 @@ module Mongoid # :nodoc:
|
|
|
124
135
|
# @since 2.2.0
|
|
125
136
|
def eager_load(metadata, ids)
|
|
126
137
|
raise Errors::EagerLoad.new(metadata.name) if metadata.polymorphic?
|
|
127
|
-
klass,
|
|
128
|
-
klass.any_in("_id" => ids).each do |doc|
|
|
138
|
+
klass, _ = metadata.klass, metadata.foreign_key
|
|
139
|
+
klass.any_in("_id" => ids.uniq).each do |doc|
|
|
129
140
|
IdentityMap.set(doc)
|
|
130
141
|
end
|
|
131
142
|
end
|
|
@@ -143,6 +154,20 @@ module Mongoid # :nodoc:
|
|
|
143
154
|
false
|
|
144
155
|
end
|
|
145
156
|
|
|
157
|
+
# Get the foreign key for the provided name.
|
|
158
|
+
#
|
|
159
|
+
# @example Get the foreign key.
|
|
160
|
+
# Referenced::In.foreign_key(:person)
|
|
161
|
+
#
|
|
162
|
+
# @param [ Symbol ] name The name.
|
|
163
|
+
#
|
|
164
|
+
# @return [ String ] The foreign key.
|
|
165
|
+
#
|
|
166
|
+
# @since 3.0.0
|
|
167
|
+
def foreign_key(name)
|
|
168
|
+
"#{name}#{foreign_key_suffix}"
|
|
169
|
+
end
|
|
170
|
+
|
|
146
171
|
# Get the default value for the foreign key.
|
|
147
172
|
#
|
|
148
173
|
# @example Get the default.
|
|
@@ -173,9 +198,9 @@ module Mongoid # :nodoc:
|
|
|
173
198
|
# @example Get the macro.
|
|
174
199
|
# Referenced::In.macro
|
|
175
200
|
#
|
|
176
|
-
# @return [ Symbol ] :
|
|
201
|
+
# @return [ Symbol ] :belongs_to
|
|
177
202
|
def macro
|
|
178
|
-
:
|
|
203
|
+
:belongs_to
|
|
179
204
|
end
|
|
180
205
|
|
|
181
206
|
# Return the nested builder that is responsible for generating the documents
|
|
@@ -240,7 +265,7 @@ module Mongoid # :nodoc:
|
|
|
240
265
|
#
|
|
241
266
|
# @since 2.1.0
|
|
242
267
|
def valid_options
|
|
243
|
-
[ :autosave, :foreign_key, :index, :polymorphic ]
|
|
268
|
+
[ :autobuild, :autosave, :dependent, :foreign_key, :index, :polymorphic, :touch ]
|
|
244
269
|
end
|
|
245
270
|
|
|
246
271
|
# Get the default validation setting for the relation. Determines if
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Referenced
|
|
5
5
|
|
|
6
6
|
# This class defines the behaviour for all relations that are a
|
|
7
7
|
# one-to-many between documents in different collections.
|
|
8
8
|
class Many < Relations::Many
|
|
9
|
-
include Batch
|
|
10
9
|
|
|
11
|
-
delegate :count, :
|
|
12
|
-
delegate :first, :in_memory, :last, :reset, :uniq, :
|
|
10
|
+
delegate :count, to: :criteria
|
|
11
|
+
delegate :first, :in_memory, :last, :reset, :uniq, to: :target
|
|
13
12
|
|
|
14
13
|
# Appends a document or array of documents to the relation. Will set
|
|
15
14
|
# the parent and update the index in the process.
|
|
@@ -35,17 +34,13 @@ module Mongoid #:nodoc:
|
|
|
35
34
|
append(doc)
|
|
36
35
|
doc.save if persistable? && !_assigning? && !doc.validated?
|
|
37
36
|
end
|
|
37
|
+
self
|
|
38
38
|
end
|
|
39
39
|
alias :push :<<
|
|
40
40
|
|
|
41
41
|
# Appends an array of documents to the relation. Performs a batch
|
|
42
42
|
# insert of the documents instead of persisting one at a time.
|
|
43
43
|
#
|
|
44
|
-
# @note When performing batch inserts the *after* callbacks will get
|
|
45
|
-
# executed before the documents have actually been persisted to the
|
|
46
|
-
# database due to an issue with Active Support's callback system - we
|
|
47
|
-
# cannot explicitly fire the after callbacks by themselves.
|
|
48
|
-
#
|
|
49
44
|
# @example Concat with other documents.
|
|
50
45
|
# person.posts.concat([ post_one, post_two ])
|
|
51
46
|
#
|
|
@@ -55,13 +50,14 @@ module Mongoid #:nodoc:
|
|
|
55
50
|
#
|
|
56
51
|
# @since 2.4.0
|
|
57
52
|
def concat(documents)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
end
|
|
53
|
+
inserts = []
|
|
54
|
+
documents.each do |doc|
|
|
55
|
+
next unless doc
|
|
56
|
+
append(doc)
|
|
57
|
+
save_or_delay(doc, inserts) if persistable?
|
|
64
58
|
end
|
|
59
|
+
persist_delayed(inserts)
|
|
60
|
+
self
|
|
65
61
|
end
|
|
66
62
|
|
|
67
63
|
# Build a new document from the attributes and append it to this
|
|
@@ -87,66 +83,15 @@ module Mongoid #:nodoc:
|
|
|
87
83
|
options, type = {}, options
|
|
88
84
|
end
|
|
89
85
|
|
|
90
|
-
Factory.build(type || klass, attributes, options)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
86
|
+
doc = Factory.build(type || 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
|
|
96
92
|
end
|
|
97
93
|
alias :new :build
|
|
98
94
|
|
|
99
|
-
# Creates a new document on the references many relation. This will
|
|
100
|
-
# save the document if the parent has been persisted.
|
|
101
|
-
#
|
|
102
|
-
# @example Create and save the new document.
|
|
103
|
-
# person.posts.create(:text => "Testing")
|
|
104
|
-
#
|
|
105
|
-
# @overload create(attributes = nil, options = {}, type = nil)
|
|
106
|
-
# @param [ Hash ] attributes The attributes to create with.
|
|
107
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
108
|
-
# @param [ Class ] type The optional type of document to create.
|
|
109
|
-
#
|
|
110
|
-
# @overload create(attributes = nil, type = nil)
|
|
111
|
-
# @param [ Hash ] attributes The attributes to create with.
|
|
112
|
-
# @param [ Class ] type The optional type of document to create.
|
|
113
|
-
#
|
|
114
|
-
# @return [ Document ] The newly created document.
|
|
115
|
-
#
|
|
116
|
-
# @since 2.0.0.beta.1
|
|
117
|
-
def create(attributes = nil, options = {}, type = nil, &block)
|
|
118
|
-
build(attributes, options, type, &block).tap do |doc|
|
|
119
|
-
base.persisted? ? doc.save : raise_unsaved(doc)
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# Creates a new document on the references many relation. This will
|
|
124
|
-
# save the document if the parent has been persisted and will raise an
|
|
125
|
-
# error if validation fails.
|
|
126
|
-
#
|
|
127
|
-
# @example Create and save the new document.
|
|
128
|
-
# person.posts.create!(:text => "Testing")
|
|
129
|
-
#
|
|
130
|
-
# @overload create!(attributes = nil, options = {}, type = nil)
|
|
131
|
-
# @param [ Hash ] attributes The attributes to create with.
|
|
132
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
133
|
-
# @param [ Class ] type The optional type of document to create.
|
|
134
|
-
#
|
|
135
|
-
# @overload create!(attributes = nil, type = nil)
|
|
136
|
-
# @param [ Hash ] attributes The attributes to create with.
|
|
137
|
-
# @param [ Class ] type The optional type of document to create.
|
|
138
|
-
#
|
|
139
|
-
# @raise [ Errors::Validations ] If validation failed.
|
|
140
|
-
#
|
|
141
|
-
# @return [ Document ] The newly created document.
|
|
142
|
-
#
|
|
143
|
-
# @since 2.0.0.beta.1
|
|
144
|
-
def create!(attributes = nil, options = {}, type = nil, &block)
|
|
145
|
-
build(attributes, options, type, &block).tap do |doc|
|
|
146
|
-
base.persisted? ? doc.save! : raise_unsaved(doc)
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
95
|
# Delete the document from the relation. This will set the foreign key
|
|
151
96
|
# on the document to nil. If the dependent options on the relation are
|
|
152
97
|
# :delete or :destroy the appropriate removal will occur.
|
|
@@ -175,7 +120,7 @@ module Mongoid #:nodoc:
|
|
|
175
120
|
# person.posts.delete_all
|
|
176
121
|
#
|
|
177
122
|
# @example Conditonally delete all documents in the relation.
|
|
178
|
-
# person.posts.delete_all(
|
|
123
|
+
# person.posts.delete_all({ :title => "Testing" })
|
|
179
124
|
#
|
|
180
125
|
# @param [ Hash ] conditions Optional conditions to delete with.
|
|
181
126
|
#
|
|
@@ -193,7 +138,7 @@ module Mongoid #:nodoc:
|
|
|
193
138
|
# person.posts.destroy_all
|
|
194
139
|
#
|
|
195
140
|
# @example Conditonally destroy all documents in the relation.
|
|
196
|
-
# person.posts.destroy_all(
|
|
141
|
+
# person.posts.destroy_all({ :title => "Testing" })
|
|
197
142
|
#
|
|
198
143
|
# @param [ Hash ] conditions Optional conditions to destroy with.
|
|
199
144
|
#
|
|
@@ -230,18 +175,7 @@ module Mongoid #:nodoc:
|
|
|
230
175
|
# @example Find by multiple ids.
|
|
231
176
|
# person.posts.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
|
232
177
|
#
|
|
233
|
-
# @
|
|
234
|
-
# person.posts.find(:all, :conditions => { :title => "Sir" })
|
|
235
|
-
#
|
|
236
|
-
# @example Conditionally find the first document.
|
|
237
|
-
# person.posts.find(:first, :conditions => { :title => "Sir" })
|
|
238
|
-
#
|
|
239
|
-
# @example Conditionally find the last document.
|
|
240
|
-
# person.posts.find(:last, :conditions => { :title => "Sir" })
|
|
241
|
-
#
|
|
242
|
-
# @param [ Symbol, BSON::ObjectId, Array<BSON::ObjectId> ] arg The
|
|
243
|
-
# argument to search with.
|
|
244
|
-
# @param [ Hash ] options The options to search with.
|
|
178
|
+
# @param [ BSON::ObjectId, Array<BSON::ObjectId> ] arg The ids.
|
|
245
179
|
#
|
|
246
180
|
# @return [ Document, Criteria ] The matching document(s).
|
|
247
181
|
#
|
|
@@ -276,7 +210,7 @@ module Mongoid #:nodoc:
|
|
|
276
210
|
#
|
|
277
211
|
# @since 2.0.0.rc.1
|
|
278
212
|
def nullify
|
|
279
|
-
criteria.update(
|
|
213
|
+
criteria.update(foreign_key => nil)
|
|
280
214
|
target.clear do |doc|
|
|
281
215
|
unbind_one(doc)
|
|
282
216
|
end
|
|
@@ -318,19 +252,18 @@ module Mongoid #:nodoc:
|
|
|
318
252
|
#
|
|
319
253
|
# @since 2.0.0.rc.1
|
|
320
254
|
def substitute(replacement)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
docs.push(doc) if doc.send(metadata.foreign_key) != base.id
|
|
328
|
-
end
|
|
329
|
-
proxy.concat(docs)
|
|
330
|
-
else
|
|
331
|
-
proxy.purge
|
|
255
|
+
if replacement
|
|
256
|
+
new_docs, docs = replacement.compact, []
|
|
257
|
+
new_ids = new_docs.map { |doc| doc.id }
|
|
258
|
+
remove_not_in(new_ids)
|
|
259
|
+
new_docs.each do |doc|
|
|
260
|
+
docs.push(doc) if doc.send(foreign_key) != base.id
|
|
332
261
|
end
|
|
262
|
+
concat(docs)
|
|
263
|
+
else
|
|
264
|
+
purge
|
|
333
265
|
end
|
|
266
|
+
self
|
|
334
267
|
end
|
|
335
268
|
|
|
336
269
|
# Get a criteria for the documents without the default scoping
|
|
@@ -344,7 +277,7 @@ module Mongoid #:nodoc:
|
|
|
344
277
|
# @since 2.4.0
|
|
345
278
|
def unscoped
|
|
346
279
|
klass.unscoped.where(
|
|
347
|
-
|
|
280
|
+
foreign_key => Conversions.flag(base.id, metadata)
|
|
348
281
|
)
|
|
349
282
|
end
|
|
350
283
|
|
|
@@ -401,7 +334,7 @@ module Mongoid #:nodoc:
|
|
|
401
334
|
#
|
|
402
335
|
# @since 2.0.0.beta.1
|
|
403
336
|
def criteria
|
|
404
|
-
Many.criteria(metadata, Conversions.flag(base.id, metadata))
|
|
337
|
+
Many.criteria(metadata, Conversions.flag(base.id, metadata), base.class)
|
|
405
338
|
end
|
|
406
339
|
|
|
407
340
|
# Perform the necessary cascade operations for documents that just got
|
|
@@ -447,6 +380,27 @@ module Mongoid #:nodoc:
|
|
|
447
380
|
end
|
|
448
381
|
end
|
|
449
382
|
|
|
383
|
+
# Persist all the delayed batch inserts.
|
|
384
|
+
#
|
|
385
|
+
# @api private
|
|
386
|
+
#
|
|
387
|
+
# @example Persist the delayed batch inserts.
|
|
388
|
+
# relation.persist_delayed([ doc ])
|
|
389
|
+
#
|
|
390
|
+
# @param [ Array<Document> ] inserts The delayed inserts.
|
|
391
|
+
#
|
|
392
|
+
# @since 3.0.0
|
|
393
|
+
def persist_delayed(inserts)
|
|
394
|
+
if inserts.any?
|
|
395
|
+
collection.insert(inserts.map(&:as_document))
|
|
396
|
+
inserts.each do |doc|
|
|
397
|
+
doc.new_record = false
|
|
398
|
+
doc.run_after_callbacks(:create, :save)
|
|
399
|
+
doc.post_persist
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
450
404
|
# Are we able to persist this relation?
|
|
451
405
|
#
|
|
452
406
|
# @example Can we persist the relation?
|
|
@@ -466,7 +420,7 @@ module Mongoid #:nodoc:
|
|
|
466
420
|
# person.posts.delete_all
|
|
467
421
|
#
|
|
468
422
|
# @example Conditonally delete all documents in the relation.
|
|
469
|
-
# person.posts.delete_all(
|
|
423
|
+
# person.posts.delete_all({ :title => "Testing" })
|
|
470
424
|
#
|
|
471
425
|
# @param [ Hash ] conditions Optional conditions to delete with.
|
|
472
426
|
# @param [ Symbol ] The deletion method to call.
|
|
@@ -475,21 +429,19 @@ module Mongoid #:nodoc:
|
|
|
475
429
|
#
|
|
476
430
|
# @since 2.1.0
|
|
477
431
|
def remove_all(conditions = nil, method = :delete_all)
|
|
478
|
-
selector =
|
|
479
|
-
klass.send(method,
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
end
|
|
432
|
+
selector = conditions || {}
|
|
433
|
+
removed = klass.send(method, selector.merge!(criteria.selector))
|
|
434
|
+
target.delete_if do |doc|
|
|
435
|
+
if doc.matches?(selector)
|
|
436
|
+
unbind_one(doc) and true
|
|
484
437
|
end
|
|
485
438
|
end
|
|
439
|
+
removed
|
|
486
440
|
end
|
|
487
441
|
|
|
488
442
|
# Remove all the documents in the proxy that do not have the provided
|
|
489
443
|
# ids.
|
|
490
444
|
#
|
|
491
|
-
# @todo: Durran: Refactor 3.0. Temp for bug fix in 2.4.
|
|
492
|
-
#
|
|
493
445
|
# @example Remove all documents without the ids.
|
|
494
446
|
# proxy.remove_not_in([ id ])
|
|
495
447
|
#
|
|
@@ -497,17 +449,16 @@ module Mongoid #:nodoc:
|
|
|
497
449
|
#
|
|
498
450
|
# @since 2.4.0
|
|
499
451
|
def remove_not_in(ids)
|
|
500
|
-
removed = criteria.not_in(:
|
|
452
|
+
removed = criteria.not_in(_id: ids)
|
|
501
453
|
if metadata.destructive?
|
|
502
454
|
removed.delete_all
|
|
503
455
|
else
|
|
504
|
-
removed.update(
|
|
456
|
+
removed.update(foreign_key => nil)
|
|
505
457
|
end
|
|
506
458
|
in_memory.each do |doc|
|
|
507
459
|
if !ids.include?(doc.id)
|
|
508
460
|
unbind_one(doc)
|
|
509
|
-
|
|
510
|
-
loaded.try { |p| p.delete_one(doc) }
|
|
461
|
+
target.delete(doc)
|
|
511
462
|
if metadata.destructive?
|
|
512
463
|
doc.destroyed = true
|
|
513
464
|
end
|
|
@@ -515,6 +466,27 @@ module Mongoid #:nodoc:
|
|
|
515
466
|
end
|
|
516
467
|
end
|
|
517
468
|
|
|
469
|
+
# Save a persisted document immediately or delay a new document for
|
|
470
|
+
# batch insert.
|
|
471
|
+
#
|
|
472
|
+
# @api private
|
|
473
|
+
#
|
|
474
|
+
# @example Save or delay the document.
|
|
475
|
+
# relation.save_or_delay(doc, [])
|
|
476
|
+
#
|
|
477
|
+
# @param [ Document ] doc The document.
|
|
478
|
+
# @param [ Array<Document> ] inserts The inserts.
|
|
479
|
+
#
|
|
480
|
+
# @since 3.0.0
|
|
481
|
+
def save_or_delay(doc, inserts)
|
|
482
|
+
if doc.new_record? && doc.valid?(:create)
|
|
483
|
+
inserts.push(doc)
|
|
484
|
+
doc.run_before_callbacks(:save, :create)
|
|
485
|
+
else
|
|
486
|
+
doc.save
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
|
|
518
490
|
class << self
|
|
519
491
|
|
|
520
492
|
# Return the builder that is responsible for generating the documents
|
|
@@ -548,7 +520,18 @@ module Mongoid #:nodoc:
|
|
|
548
520
|
#
|
|
549
521
|
# @since 2.1.0
|
|
550
522
|
def criteria(metadata, object, type = nil)
|
|
551
|
-
metadata.klass.where(metadata.foreign_key => object)
|
|
523
|
+
crit = metadata.klass.where(metadata.foreign_key => object)
|
|
524
|
+
|
|
525
|
+
if metadata.polymorphic?
|
|
526
|
+
crit = crit.where(metadata.type => type.name)
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
inverse_metadata = metadata.inverse_metadata(metadata.klass)
|
|
530
|
+
if inverse_metadata && inverse_metadata.inverse_of_field
|
|
531
|
+
crit = crit.any_in(inverse_metadata.inverse_of_field => [metadata.name, nil])
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
crit
|
|
552
535
|
end
|
|
553
536
|
|
|
554
537
|
# Eager load the relation based on the criteria.
|
|
@@ -563,16 +546,7 @@ module Mongoid #:nodoc:
|
|
|
563
546
|
#
|
|
564
547
|
# @since 2.2.0
|
|
565
548
|
def eager_load(metadata, ids)
|
|
566
|
-
|
|
567
|
-
klass, foreign_key = metadata.klass, metadata.foreign_key
|
|
568
|
-
klass.any_in(foreign_key => ids).each do |doc|
|
|
569
|
-
base_id = doc.send(foreign_key)
|
|
570
|
-
unless cleared
|
|
571
|
-
IdentityMap.clear_many(klass, foreign_key => base_id)
|
|
572
|
-
cleared = true
|
|
573
|
-
end
|
|
574
|
-
IdentityMap.set_many(doc, foreign_key => base_id)
|
|
575
|
-
end
|
|
549
|
+
eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_many(doc, key) }
|
|
576
550
|
end
|
|
577
551
|
|
|
578
552
|
# Returns true if the relation is an embedded one. In this case
|
|
@@ -588,6 +562,20 @@ module Mongoid #:nodoc:
|
|
|
588
562
|
false
|
|
589
563
|
end
|
|
590
564
|
|
|
565
|
+
# Get the foreign key for the provided name.
|
|
566
|
+
#
|
|
567
|
+
# @example Get the foreign key.
|
|
568
|
+
# Referenced::Many.foreign_key(:person)
|
|
569
|
+
#
|
|
570
|
+
# @param [ Symbol ] name The name.
|
|
571
|
+
#
|
|
572
|
+
# @return [ String ] The foreign key.
|
|
573
|
+
#
|
|
574
|
+
# @since 3.0.0
|
|
575
|
+
def foreign_key(name)
|
|
576
|
+
"#{name}#{foreign_key_suffix}"
|
|
577
|
+
end
|
|
578
|
+
|
|
591
579
|
# Get the default value for the foreign key.
|
|
592
580
|
#
|
|
593
581
|
# @example Get the default.
|
|
@@ -618,9 +606,9 @@ module Mongoid #:nodoc:
|
|
|
618
606
|
# @example Get the macro.
|
|
619
607
|
# Referenced::Many.macro
|
|
620
608
|
#
|
|
621
|
-
# @return [ Symbol ] :
|
|
609
|
+
# @return [ Symbol ] :has_many
|
|
622
610
|
def macro
|
|
623
|
-
:
|
|
611
|
+
:has_many
|
|
624
612
|
end
|
|
625
613
|
|
|
626
614
|
# Return the nested builder that is responsible for generating the documents
|