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,22 +1,22 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Targets
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Targets
|
|
5
5
|
|
|
6
6
|
# This class is the wrapper for all relational associations that have a
|
|
7
|
-
# target that can be a criteria or array of
|
|
7
|
+
# target that can be a criteria or array of _loaded documents. This
|
|
8
8
|
# handles both cases or a combination of the two.
|
|
9
9
|
class Enumerable
|
|
10
10
|
include ::Enumerable
|
|
11
11
|
|
|
12
12
|
# The three main instance variables are collections of documents.
|
|
13
13
|
#
|
|
14
|
-
# @attribute [rw]
|
|
15
|
-
# @attribute [rw]
|
|
16
|
-
# @attribute [rw]
|
|
17
|
-
attr_accessor :
|
|
14
|
+
# @attribute [rw] _added Documents that have been appended.
|
|
15
|
+
# @attribute [rw] _loaded Persisted documents that have been _loaded.
|
|
16
|
+
# @attribute [rw] _unloaded A criteria representing persisted docs.
|
|
17
|
+
attr_accessor :_added, :_loaded, :_unloaded
|
|
18
18
|
|
|
19
|
-
delegate :===, :is_a?, :kind_of?, :
|
|
19
|
+
delegate :===, :is_a?, :kind_of?, to: []
|
|
20
20
|
|
|
21
21
|
# Check if the enumerable is equal to the other object.
|
|
22
22
|
#
|
|
@@ -44,7 +44,8 @@ module Mongoid #:nodoc:
|
|
|
44
44
|
#
|
|
45
45
|
# @since 2.1.0
|
|
46
46
|
def <<(document)
|
|
47
|
-
|
|
47
|
+
_added[document.id] = document
|
|
48
|
+
self
|
|
48
49
|
end
|
|
49
50
|
alias :push :<<
|
|
50
51
|
|
|
@@ -59,14 +60,14 @@ module Mongoid #:nodoc:
|
|
|
59
60
|
# doc.unbind
|
|
60
61
|
# end
|
|
61
62
|
#
|
|
62
|
-
# @return [ Array<Document> ] The cleared out
|
|
63
|
+
# @return [ Array<Document> ] The cleared out _added docs.
|
|
63
64
|
#
|
|
64
65
|
# @since 2.1.0
|
|
65
66
|
def clear
|
|
66
67
|
if block_given?
|
|
67
68
|
in_memory { |doc| yield(doc) }
|
|
68
69
|
end
|
|
69
|
-
|
|
70
|
+
_loaded.clear and _added.clear
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
# Clones each document in the enumerable.
|
|
@@ -94,15 +95,15 @@ module Mongoid #:nodoc:
|
|
|
94
95
|
#
|
|
95
96
|
# @since 2.1.0
|
|
96
97
|
def delete(document)
|
|
97
|
-
(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
end
|
|
98
|
+
doc = (_loaded.delete(document.id) || _added.delete(document.id))
|
|
99
|
+
unless doc
|
|
100
|
+
if _unloaded && _unloaded.where(_id: document.id).exists?
|
|
101
|
+
yield(document) if block_given?
|
|
102
|
+
return document
|
|
103
103
|
end
|
|
104
|
-
yield(doc) if block_given?
|
|
105
104
|
end
|
|
105
|
+
yield(doc) if block_given?
|
|
106
|
+
doc
|
|
106
107
|
end
|
|
107
108
|
|
|
108
109
|
# Deletes every document in the enumerable for where the block returns
|
|
@@ -120,50 +121,52 @@ module Mongoid #:nodoc:
|
|
|
120
121
|
# @since 2.1.0
|
|
121
122
|
def delete_if(&block)
|
|
122
123
|
load_all!
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
deleted = in_memory.select(&block)
|
|
125
|
+
deleted.each do |doc|
|
|
126
|
+
_loaded.delete(doc.id)
|
|
127
|
+
_added.delete(doc.id)
|
|
126
128
|
end
|
|
129
|
+
self
|
|
127
130
|
end
|
|
128
131
|
|
|
129
132
|
# Iterating over this enumerable has to handle a few different
|
|
130
133
|
# scenarios.
|
|
131
134
|
#
|
|
132
|
-
# If the enumerable has its criteria
|
|
133
|
-
# to all the
|
|
135
|
+
# If the enumerable has its criteria _loaded into memory then it yields
|
|
136
|
+
# to all the _loaded docs and all the _added docs.
|
|
134
137
|
#
|
|
135
|
-
# If the enumerable has not
|
|
138
|
+
# If the enumerable has not _loaded the criteria then it iterates over
|
|
136
139
|
# the cursor while loading the documents and then iterates over the
|
|
137
|
-
#
|
|
140
|
+
# _added docs.
|
|
138
141
|
#
|
|
139
142
|
# @example Iterate over the enumerable.
|
|
140
143
|
# enumerable.each do |doc|
|
|
141
144
|
# puts doc
|
|
142
145
|
# end
|
|
143
146
|
#
|
|
144
|
-
# @return [ true ] That the enumerable is now
|
|
147
|
+
# @return [ true ] That the enumerable is now _loaded.
|
|
145
148
|
#
|
|
146
149
|
# @since 2.1.0
|
|
147
150
|
def each
|
|
148
|
-
if
|
|
149
|
-
|
|
151
|
+
if _loaded?
|
|
152
|
+
_loaded.each_pair do |id, doc|
|
|
150
153
|
yield(doc)
|
|
151
154
|
end
|
|
152
155
|
else
|
|
153
|
-
|
|
154
|
-
document =
|
|
156
|
+
_unloaded.each do |doc|
|
|
157
|
+
document = _added.delete(doc.id) || _loaded.delete(doc.id) || doc
|
|
155
158
|
yield(document)
|
|
156
|
-
|
|
159
|
+
_loaded[document.id] = document
|
|
157
160
|
end
|
|
158
161
|
end
|
|
159
|
-
|
|
162
|
+
_added.each_pair do |id, doc|
|
|
160
163
|
yield(doc)
|
|
161
164
|
end
|
|
162
165
|
@executed = true
|
|
163
166
|
end
|
|
164
167
|
|
|
165
168
|
# Is the enumerable empty? Will determine if the count is zero based on
|
|
166
|
-
# whether or not it is
|
|
169
|
+
# whether or not it is _loaded.
|
|
167
170
|
#
|
|
168
171
|
# @example Is the enumerable empty?
|
|
169
172
|
# enumerable.empty?
|
|
@@ -172,10 +175,10 @@ module Mongoid #:nodoc:
|
|
|
172
175
|
#
|
|
173
176
|
# @since 2.1.0
|
|
174
177
|
def empty?
|
|
175
|
-
if
|
|
178
|
+
if _loaded?
|
|
176
179
|
in_memory.count == 0
|
|
177
180
|
else
|
|
178
|
-
|
|
181
|
+
_unloaded.count + _added.count == 0
|
|
179
182
|
end
|
|
180
183
|
end
|
|
181
184
|
|
|
@@ -189,7 +192,7 @@ module Mongoid #:nodoc:
|
|
|
189
192
|
#
|
|
190
193
|
# @since 2.1.0
|
|
191
194
|
def first
|
|
192
|
-
|
|
195
|
+
matching_document(:first)
|
|
193
196
|
end
|
|
194
197
|
|
|
195
198
|
# Initialize the new enumerable either with a criteria or an array.
|
|
@@ -205,12 +208,31 @@ module Mongoid #:nodoc:
|
|
|
205
208
|
# @since 2.1.0
|
|
206
209
|
def initialize(target)
|
|
207
210
|
if target.is_a?(Criteria)
|
|
208
|
-
@
|
|
211
|
+
@_added, @executed, @_loaded, @_unloaded = {}, false, {}, target
|
|
209
212
|
else
|
|
210
|
-
@
|
|
213
|
+
@_added, @executed = {}, true
|
|
214
|
+
@_loaded = target.inject({}) do |_target, doc|
|
|
215
|
+
_target[doc.id] = doc
|
|
216
|
+
_target
|
|
217
|
+
end
|
|
211
218
|
end
|
|
212
219
|
end
|
|
213
220
|
|
|
221
|
+
# Does the target include the provided document?
|
|
222
|
+
#
|
|
223
|
+
# @example Does the target include the document?
|
|
224
|
+
# enumerable.include?(document)
|
|
225
|
+
#
|
|
226
|
+
# @param [ Document ] doc The document to check.
|
|
227
|
+
#
|
|
228
|
+
# @return [ true, false ] If the document is in the target.
|
|
229
|
+
#
|
|
230
|
+
# @since 3.0.0
|
|
231
|
+
def include?(doc)
|
|
232
|
+
return super unless _unloaded
|
|
233
|
+
_unloaded.where(_id: doc.id).exists? || _added.has_key?(doc.id)
|
|
234
|
+
end
|
|
235
|
+
|
|
214
236
|
# Inspection will just inspect the entries for nice array-style
|
|
215
237
|
# printing.
|
|
216
238
|
#
|
|
@@ -224,8 +246,8 @@ module Mongoid #:nodoc:
|
|
|
224
246
|
entries.inspect
|
|
225
247
|
end
|
|
226
248
|
|
|
227
|
-
# Return all the documents in the enumerable that have been
|
|
228
|
-
#
|
|
249
|
+
# Return all the documents in the enumerable that have been _loaded or
|
|
250
|
+
# _added.
|
|
229
251
|
#
|
|
230
252
|
# @note When passed a block it yields to each document.
|
|
231
253
|
#
|
|
@@ -236,9 +258,9 @@ module Mongoid #:nodoc:
|
|
|
236
258
|
#
|
|
237
259
|
# @since 2.1.0
|
|
238
260
|
def in_memory
|
|
239
|
-
(
|
|
240
|
-
|
|
241
|
-
|
|
261
|
+
docs = (_loaded.values + _added.values)
|
|
262
|
+
docs.each { |doc| yield(doc) } if block_given?
|
|
263
|
+
docs
|
|
242
264
|
end
|
|
243
265
|
|
|
244
266
|
# Get the last document in the enumerable. Will check the new
|
|
@@ -251,7 +273,7 @@ module Mongoid #:nodoc:
|
|
|
251
273
|
#
|
|
252
274
|
# @since 2.1.0
|
|
253
275
|
def last
|
|
254
|
-
|
|
276
|
+
matching_document(:last)
|
|
255
277
|
end
|
|
256
278
|
|
|
257
279
|
# Loads all the documents in the enumerable from the database.
|
|
@@ -259,21 +281,21 @@ module Mongoid #:nodoc:
|
|
|
259
281
|
# @example Load all the documents.
|
|
260
282
|
# enumerable.load_all!
|
|
261
283
|
#
|
|
262
|
-
# @return [ true ] That the enumerable is
|
|
284
|
+
# @return [ true ] That the enumerable is _loaded.
|
|
263
285
|
#
|
|
264
286
|
# @since 2.1.0
|
|
265
287
|
alias :load_all! :entries
|
|
266
288
|
|
|
267
|
-
# Has the enumerable been
|
|
289
|
+
# Has the enumerable been _loaded? This will be true if the criteria has
|
|
268
290
|
# been executed or we manually load the entire thing.
|
|
269
291
|
#
|
|
270
|
-
# @example Is the enumerable
|
|
271
|
-
# enumerable.
|
|
292
|
+
# @example Is the enumerable _loaded?
|
|
293
|
+
# enumerable._loaded?
|
|
272
294
|
#
|
|
273
|
-
# @return [ true, false ] If the enumerable has been
|
|
295
|
+
# @return [ true, false ] If the enumerable has been _loaded.
|
|
274
296
|
#
|
|
275
297
|
# @since 2.1.0
|
|
276
|
-
def
|
|
298
|
+
def _loaded?
|
|
277
299
|
!!@executed
|
|
278
300
|
end
|
|
279
301
|
|
|
@@ -286,7 +308,7 @@ module Mongoid #:nodoc:
|
|
|
286
308
|
#
|
|
287
309
|
# @since 2.1.0
|
|
288
310
|
def reset
|
|
289
|
-
|
|
311
|
+
_loaded.clear and _added.clear
|
|
290
312
|
@executed = false
|
|
291
313
|
end
|
|
292
314
|
|
|
@@ -316,11 +338,11 @@ module Mongoid #:nodoc:
|
|
|
316
338
|
#
|
|
317
339
|
# @since 2.1.0
|
|
318
340
|
def size
|
|
319
|
-
count = (
|
|
341
|
+
count = (_unloaded ? _unloaded.count : _loaded.count)
|
|
320
342
|
if count.zero?
|
|
321
|
-
count +
|
|
343
|
+
count + _added.count
|
|
322
344
|
else
|
|
323
|
-
count +
|
|
345
|
+
count + _added.values.count{ |d| d.new_record? }
|
|
324
346
|
end
|
|
325
347
|
end
|
|
326
348
|
alias :length :size
|
|
@@ -332,7 +354,7 @@ module Mongoid #:nodoc:
|
|
|
332
354
|
#
|
|
333
355
|
# @param [ Hash ] options Optional parameters.
|
|
334
356
|
#
|
|
335
|
-
# @return [ String ] The entries all
|
|
357
|
+
# @return [ String ] The entries all _loaded as a string.
|
|
336
358
|
#
|
|
337
359
|
# @since 2.2.0
|
|
338
360
|
def to_json(options = {})
|
|
@@ -346,7 +368,7 @@ module Mongoid #:nodoc:
|
|
|
346
368
|
#
|
|
347
369
|
# @param [ Hash ] options Optional parameters.
|
|
348
370
|
#
|
|
349
|
-
# @return [ Hash ] The entries all
|
|
371
|
+
# @return [ Hash ] The entries all _loaded as a hash.
|
|
350
372
|
#
|
|
351
373
|
# @since 2.2.0
|
|
352
374
|
def as_json(options = {})
|
|
@@ -372,6 +394,13 @@ module Mongoid #:nodoc:
|
|
|
372
394
|
def method_missing(name, *args, &block)
|
|
373
395
|
entries.send(name, *args, &block)
|
|
374
396
|
end
|
|
397
|
+
|
|
398
|
+
def matching_document(location)
|
|
399
|
+
_loaded.try(:values).try(location) ||
|
|
400
|
+
_added[_unloaded.try(location).try(:id)] ||
|
|
401
|
+
_unloaded.try(location) ||
|
|
402
|
+
_added.values.try(location)
|
|
403
|
+
end
|
|
375
404
|
end
|
|
376
405
|
end
|
|
377
406
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Touchable
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
class_attribute :touchables
|
|
9
|
+
self.touchables = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
|
|
14
|
+
# Add the metadata to the touchable relations if the touch option was
|
|
15
|
+
# provided.
|
|
16
|
+
#
|
|
17
|
+
# @example Add the touchable.
|
|
18
|
+
# Model.touchable(meta)
|
|
19
|
+
#
|
|
20
|
+
# @param [ Metadata ] metadata The relation metadata.
|
|
21
|
+
#
|
|
22
|
+
# @return [ Class ] The model class.
|
|
23
|
+
#
|
|
24
|
+
# @since 3.0.0
|
|
25
|
+
def touchable(metadata)
|
|
26
|
+
self.touchables.push(metadata.name) if metadata.touchable?
|
|
27
|
+
self
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/mongoid/relations.rb
CHANGED
|
@@ -13,21 +13,20 @@ require "mongoid/relations/one"
|
|
|
13
13
|
require "mongoid/relations/options"
|
|
14
14
|
require "mongoid/relations/polymorphic"
|
|
15
15
|
require "mongoid/relations/targets/enumerable"
|
|
16
|
-
require "mongoid/relations/embedded/atomic"
|
|
17
16
|
require "mongoid/relations/embedded/in"
|
|
18
17
|
require "mongoid/relations/embedded/many"
|
|
19
18
|
require "mongoid/relations/embedded/one"
|
|
20
|
-
require "mongoid/relations/referenced/batch"
|
|
21
19
|
require "mongoid/relations/referenced/in"
|
|
22
20
|
require "mongoid/relations/referenced/many"
|
|
23
21
|
require "mongoid/relations/referenced/many_to_many"
|
|
24
22
|
require "mongoid/relations/referenced/one"
|
|
25
23
|
require "mongoid/relations/reflections"
|
|
26
24
|
require "mongoid/relations/synchronization"
|
|
25
|
+
require "mongoid/relations/touchable"
|
|
27
26
|
require "mongoid/relations/metadata"
|
|
28
27
|
require "mongoid/relations/macros"
|
|
29
28
|
|
|
30
|
-
module Mongoid
|
|
29
|
+
module Mongoid
|
|
31
30
|
|
|
32
31
|
# All classes and modules under the relations namespace handle the
|
|
33
32
|
# functionality that has to do with embedded and referenced (relational)
|
|
@@ -43,6 +42,7 @@ module Mongoid # :nodoc:
|
|
|
43
42
|
include Polymorphic
|
|
44
43
|
include Reflections
|
|
45
44
|
include Synchronization
|
|
45
|
+
include Touchable
|
|
46
46
|
|
|
47
47
|
attr_accessor :metadata
|
|
48
48
|
|
|
@@ -92,7 +92,7 @@ module Mongoid # :nodoc:
|
|
|
92
92
|
#
|
|
93
93
|
# @since 2.0.0.rc.1
|
|
94
94
|
def referenced_many?
|
|
95
|
-
metadata && metadata.macro == :
|
|
95
|
+
metadata && metadata.macro == :has_many
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
# Determine if the document is part of an references_one relation.
|
|
@@ -104,7 +104,7 @@ module Mongoid # :nodoc:
|
|
|
104
104
|
#
|
|
105
105
|
# @since 2.0.0.rc.1
|
|
106
106
|
def referenced_one?
|
|
107
|
-
metadata && metadata.macro == :
|
|
107
|
+
metadata && metadata.macro == :has_one
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
# Convenience method for iterating through the loaded relations and
|
|
@@ -126,7 +126,7 @@ module Mongoid # :nodoc:
|
|
|
126
126
|
end
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
-
module ClassMethods
|
|
129
|
+
module ClassMethods
|
|
130
130
|
|
|
131
131
|
# This is convenience for librarys still on the old API.
|
|
132
132
|
#
|
data/lib/mongoid/reloading.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
2
|
+
module Mongoid
|
|
3
3
|
# This module handles reloading behaviour of documents.
|
|
4
4
|
module Reloading
|
|
5
5
|
|
|
@@ -16,18 +16,16 @@ module Mongoid #:nodoc:
|
|
|
16
16
|
#
|
|
17
17
|
# @since 1.0.0
|
|
18
18
|
def reload
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
end
|
|
23
|
-
@attributes = reloaded
|
|
24
|
-
end
|
|
25
|
-
tap do |doc|
|
|
26
|
-
doc.changed_attributes.clear
|
|
27
|
-
doc.apply_defaults
|
|
28
|
-
doc.reload_relations
|
|
29
|
-
doc.run_callbacks(:initialize)
|
|
19
|
+
reloaded = _reload
|
|
20
|
+
if Mongoid.raise_not_found_error && reloaded.empty?
|
|
21
|
+
raise Errors::DocumentNotFound.new(self.class, id, id)
|
|
30
22
|
end
|
|
23
|
+
@attributes = reloaded
|
|
24
|
+
changed_attributes.clear
|
|
25
|
+
apply_defaults
|
|
26
|
+
reload_relations
|
|
27
|
+
run_callbacks(:initialize)
|
|
28
|
+
self
|
|
31
29
|
end
|
|
32
30
|
|
|
33
31
|
private
|
|
@@ -54,7 +52,7 @@ module Mongoid #:nodoc:
|
|
|
54
52
|
#
|
|
55
53
|
# @since 2.3.2
|
|
56
54
|
def reload_root_document
|
|
57
|
-
{}.merge(collection.
|
|
55
|
+
{}.merge(collection.find(_id: id).one || {})
|
|
58
56
|
end
|
|
59
57
|
|
|
60
58
|
# Reload the embedded document.
|
|
@@ -67,7 +65,7 @@ module Mongoid #:nodoc:
|
|
|
67
65
|
# @since 2.3.2
|
|
68
66
|
def reload_embedded_document
|
|
69
67
|
extract_embedded_attributes({}.merge(
|
|
70
|
-
_root.collection.
|
|
68
|
+
_root.collection.find(_id: _root.id).one
|
|
71
69
|
))
|
|
72
70
|
end
|
|
73
71
|
|