mongoid 2.8.1 → 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 +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- 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/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- 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/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- 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 +69 -50
- data/lib/mongoid/errors.rb +22 -1
- 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/extensions.rb +28 -76
- 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/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- 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.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- 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.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- 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.rb +1 -1
- 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/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.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- 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/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.rb +6 -19
- 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/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- 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.rb +19 -16
- 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/cascading.rb +6 -4
- 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/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 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -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 +117 -132
- 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/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- 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/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- 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 +110 -137
- checksums.yaml +0 -7
- 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.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- 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 -110
- 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 -77
- 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.rb +0 -89
- 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/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Relations
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
4
|
module Embedded
|
5
5
|
|
6
6
|
# This class defines the behaviour necessary to handle relations that are
|
@@ -37,16 +37,15 @@ module Mongoid # :nodoc:
|
|
37
37
|
#
|
38
38
|
# @since 2.0.0.rc.1
|
39
39
|
def substitute(replacement)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
return nil
|
45
|
-
end
|
46
|
-
base.new_record = true
|
47
|
-
proxy.target = replacement
|
48
|
-
proxy.bind_one
|
40
|
+
unbind_one
|
41
|
+
unless replacement
|
42
|
+
base.delete if persistable?
|
43
|
+
return nil
|
49
44
|
end
|
45
|
+
base.new_record = true
|
46
|
+
self.target = replacement
|
47
|
+
bind_one
|
48
|
+
self
|
50
49
|
end
|
51
50
|
|
52
51
|
private
|
@@ -123,6 +122,18 @@ module Mongoid # :nodoc:
|
|
123
122
|
true
|
124
123
|
end
|
125
124
|
|
125
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
126
|
+
#
|
127
|
+
# @example Get the suffix for the foreign key.
|
128
|
+
# Referenced::Many.foreign_key_suffix
|
129
|
+
#
|
130
|
+
# @return [ nil ] nil.
|
131
|
+
#
|
132
|
+
# @since 3.0.0
|
133
|
+
def foreign_key_suffix
|
134
|
+
nil
|
135
|
+
end
|
136
|
+
|
126
137
|
# Returns the macro for this relation. Used mostly as a helper in
|
127
138
|
# reflection.
|
128
139
|
#
|
@@ -198,7 +209,7 @@ module Mongoid # :nodoc:
|
|
198
209
|
#
|
199
210
|
# @since 2.1.0
|
200
211
|
def valid_options
|
201
|
-
[ :cyclic, :polymorphic ]
|
212
|
+
[ :autobuild, :cyclic, :polymorphic ]
|
202
213
|
end
|
203
214
|
|
204
215
|
# Get the default validation setting for the relation. Determines if
|
@@ -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,22 +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
|
-
|
194
|
-
|
195
|
-
else
|
196
|
-
base.add_atomic_pull(doc)
|
197
|
-
end
|
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)
|
198
139
|
else
|
199
|
-
|
200
|
-
unbind_one(doc)
|
140
|
+
base.add_atomic_pull(doc)
|
201
141
|
end
|
142
|
+
else
|
143
|
+
doc.delete(suppress: true)
|
202
144
|
end
|
203
|
-
|
145
|
+
unbind_one(doc)
|
204
146
|
end
|
147
|
+
reindex
|
148
|
+
doc
|
205
149
|
end
|
206
150
|
|
207
151
|
# Delete all the documents in the association without running callbacks.
|
@@ -210,13 +154,13 @@ module Mongoid # :nodoc:
|
|
210
154
|
# person.addresses.delete_all
|
211
155
|
#
|
212
156
|
# @example Conditionally delete documents from the relation.
|
213
|
-
# person.addresses.delete_all(
|
157
|
+
# person.addresses.delete_all({ :street => "Bond" })
|
214
158
|
#
|
215
159
|
# @param [ Hash ] conditions Conditions on which documents to delete.
|
216
160
|
#
|
217
161
|
# @return [ Integer ] The number of documents deleted.
|
218
162
|
def delete_all(conditions = {})
|
219
|
-
|
163
|
+
remove_all(conditions, :delete)
|
220
164
|
end
|
221
165
|
|
222
166
|
# Destroy all the documents in the association whilst running callbacks.
|
@@ -225,13 +169,13 @@ module Mongoid # :nodoc:
|
|
225
169
|
# person.addresses.destroy_all
|
226
170
|
#
|
227
171
|
# @example Conditionally destroy documents from the relation.
|
228
|
-
# person.addresses.destroy_all(
|
172
|
+
# person.addresses.destroy_all({ :street => "Bond" })
|
229
173
|
#
|
230
174
|
# @param [ Hash ] conditions Conditions on which documents to destroy.
|
231
175
|
#
|
232
176
|
# @return [ Integer ] The number of documents destroyed.
|
233
177
|
def destroy_all(conditions = {})
|
234
|
-
|
178
|
+
remove_all(conditions, :destroy)
|
235
179
|
end
|
236
180
|
|
237
181
|
# Finds a document in this association through several different
|
@@ -243,11 +187,6 @@ module Mongoid # :nodoc:
|
|
243
187
|
# @example Find documents for multiple ids.
|
244
188
|
# person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
245
189
|
#
|
246
|
-
# @example Find documents based on conditions.
|
247
|
-
# person.addresses.find(:all, :conditions => { :number => 10 })
|
248
|
-
# person.addresses.find(:first, :conditions => { :number => 10 })
|
249
|
-
# person.addresses.find(:last, :conditions => { :number => 10 })
|
250
|
-
#
|
251
190
|
# @param [ Array<Object> ] args Various arguments.
|
252
191
|
#
|
253
192
|
# @return [ Array<Document>, Document ] A single or multiple documents.
|
@@ -288,55 +227,45 @@ module Mongoid # :nodoc:
|
|
288
227
|
target
|
289
228
|
end
|
290
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
|
+
|
291
255
|
# Substitutes the supplied target documents for the existing documents
|
292
256
|
# in the relation.
|
293
257
|
#
|
294
258
|
# @example Substitute the relation's target.
|
295
259
|
# person.addresses.substitute([ address ])
|
296
260
|
#
|
297
|
-
# @param [ Array<Document> ]
|
298
|
-
# @param [ true, false ] building Are we in build mode?
|
261
|
+
# @param [ Array<Document> ] docs The replacement docs.
|
299
262
|
#
|
300
263
|
# @return [ Many ] The proxied relation.
|
301
264
|
#
|
302
265
|
# @since 2.0.0.rc.1
|
303
|
-
def substitute(
|
304
|
-
|
305
|
-
|
306
|
-
if _assigning? && !proxy.empty?
|
307
|
-
base.atomic_unsets.push(_unscoped.first.atomic_path)
|
308
|
-
end
|
309
|
-
proxy.clear
|
310
|
-
else
|
311
|
-
atomically(:$set) do
|
312
|
-
base.delayed_atomic_sets.clear unless _assigning?
|
313
|
-
if replacement.first.is_a?(Hash)
|
314
|
-
replacement = replacement.map do |doc|
|
315
|
-
attributes = { :metadata => metadata, :_parent => base }
|
316
|
-
attributes.merge!(doc)
|
317
|
-
Factory.build(klass, attributes)
|
318
|
-
end
|
319
|
-
end
|
320
|
-
docs = replacement.compact
|
321
|
-
proxy.target = docs
|
322
|
-
self._unscoped = docs.dup
|
323
|
-
proxy.target.each_with_index do |doc, index|
|
324
|
-
integrate(doc)
|
325
|
-
doc._index = index
|
326
|
-
doc.save if base.persisted? && !_assigning?
|
327
|
-
end
|
328
|
-
if _assigning?
|
329
|
-
name = _unscoped.first.atomic_path
|
330
|
-
base.delayed_atomic_sets[name].try(:clear)
|
331
|
-
base._children.each do |child|
|
332
|
-
child.delayed_atomic_sets.clear
|
333
|
-
end
|
334
|
-
base.instance_variable_set(:@_children, nil)
|
335
|
-
base.delayed_atomic_sets[name] = proxy.as_document
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
339
|
-
end
|
266
|
+
def substitute(docs)
|
267
|
+
batch_replace(docs)
|
268
|
+
self
|
340
269
|
end
|
341
270
|
|
342
271
|
# Return the relation with all previous scoping removed. This is the
|
@@ -349,9 +278,10 @@ module Mongoid # :nodoc:
|
|
349
278
|
#
|
350
279
|
# @since 2.4.0
|
351
280
|
def unscoped
|
352
|
-
klass.
|
353
|
-
|
354
|
-
|
281
|
+
criterion = klass.unscoped
|
282
|
+
criterion.embedded = true
|
283
|
+
criterion.documents = _unscoped
|
284
|
+
criterion
|
355
285
|
end
|
356
286
|
|
357
287
|
private
|
@@ -394,9 +324,10 @@ module Mongoid # :nodoc:
|
|
394
324
|
#
|
395
325
|
# @return [ Criteria ] A new criteria.
|
396
326
|
def criteria
|
397
|
-
klass.
|
398
|
-
|
399
|
-
|
327
|
+
criterion = klass.scoped
|
328
|
+
criterion.embedded = true
|
329
|
+
criterion.documents = target
|
330
|
+
criterion
|
400
331
|
end
|
401
332
|
|
402
333
|
# Deletes one document from the target and unscoped.
|
@@ -485,32 +416,27 @@ module Mongoid # :nodoc:
|
|
485
416
|
# @since 2.4.0
|
486
417
|
def scope(docs)
|
487
418
|
return docs unless metadata.order || metadata.klass.default_scoping?
|
488
|
-
metadata.klass.
|
489
|
-
|
490
|
-
|
419
|
+
crit = metadata.klass.order_by(metadata.order)
|
420
|
+
crit.embedded = true
|
421
|
+
crit.documents = docs
|
422
|
+
crit.entries
|
491
423
|
end
|
492
424
|
|
493
425
|
# Remove all documents from the relation, either with a delete or a
|
494
426
|
# destroy depending on what this was called through.
|
495
427
|
#
|
496
428
|
# @example Destroy documents from the relation.
|
497
|
-
# relation.remove_all(
|
429
|
+
# relation.remove_all({ :num => 1 }, true)
|
498
430
|
#
|
499
431
|
# @param [ Hash ] conditions Conditions to filter by.
|
500
432
|
# @param [ true, false ] destroy If true then destroy, else delete.
|
501
433
|
#
|
502
434
|
# @return [ Integer ] The number of documents removed.
|
503
435
|
def remove_all(conditions = {}, method = :delete)
|
504
|
-
criteria =
|
505
|
-
criteria.size
|
506
|
-
|
507
|
-
|
508
|
-
_unscoped.delete_one(doc)
|
509
|
-
doc.send(method, :suppress => true) unless _assigning?
|
510
|
-
unbind_one(doc)
|
511
|
-
end
|
512
|
-
reindex
|
513
|
-
end
|
436
|
+
criteria = where(conditions || {})
|
437
|
+
removed = criteria.size
|
438
|
+
batch_remove(criteria, method)
|
439
|
+
removed
|
514
440
|
end
|
515
441
|
|
516
442
|
# Get the internal unscoped documents.
|
@@ -572,6 +498,18 @@ module Mongoid # :nodoc:
|
|
572
498
|
true
|
573
499
|
end
|
574
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
|
+
|
575
513
|
# Returns the macro for this relation. Used mostly as a helper in
|
576
514
|
# reflection.
|
577
515
|
#
|
@@ -648,7 +586,7 @@ module Mongoid # :nodoc:
|
|
648
586
|
#
|
649
587
|
# @since 2.1.0
|
650
588
|
def valid_options
|
651
|
-
[ :as, :cascade_callbacks, :cyclic, :order, :versioned ]
|
589
|
+
[ :as, :cascade_callbacks, :cyclic, :order, :versioned, :store_as ]
|
652
590
|
end
|
653
591
|
|
654
592
|
# Get the default validation setting for the relation. Determines if
|