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
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Fields
|
4
|
+
module Validators
|
5
|
+
|
6
|
+
# Validates the params passed to the field macro.
|
7
|
+
module Macro
|
8
|
+
extend self
|
9
|
+
|
10
|
+
OPTIONS = [
|
11
|
+
:as,
|
12
|
+
:default,
|
13
|
+
:identity,
|
14
|
+
:label,
|
15
|
+
:localize,
|
16
|
+
:metadata,
|
17
|
+
:pre_processed,
|
18
|
+
:subtype,
|
19
|
+
:type,
|
20
|
+
:versioned
|
21
|
+
]
|
22
|
+
|
23
|
+
# Validate the field definition.
|
24
|
+
#
|
25
|
+
# @example Validate the field definition.
|
26
|
+
# Macro.validate(Model, :name, { localized: true })
|
27
|
+
#
|
28
|
+
# @param [ Class ] klass The model class.
|
29
|
+
# @param [ Symbol ] name The field name.
|
30
|
+
# @param [ Hash ] options The provided options.
|
31
|
+
#
|
32
|
+
# @since 3.0.0
|
33
|
+
def validate(klass, name, options)
|
34
|
+
validate_name(klass, name)
|
35
|
+
validate_options(klass, name, options)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Determine if the field name is allowed, if not raise an error.
|
41
|
+
#
|
42
|
+
# @api private
|
43
|
+
#
|
44
|
+
# @example Check the field name.
|
45
|
+
# Macro.validate_name(Model, :name)
|
46
|
+
#
|
47
|
+
# @param [ Class ] klass The model class.
|
48
|
+
# @param [ Symbol ] name The field name.
|
49
|
+
#
|
50
|
+
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
51
|
+
#
|
52
|
+
# @since 3.0.0
|
53
|
+
def validate_name(klass, name)
|
54
|
+
if Mongoid.destructive_fields.include?(name)
|
55
|
+
raise Errors::InvalidField.new(klass, name)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Validate that the field options are allowed.
|
60
|
+
#
|
61
|
+
# @api private
|
62
|
+
#
|
63
|
+
# @example Validate the field options.
|
64
|
+
# Macro.validate_options(Model, :name, { localized: true })
|
65
|
+
#
|
66
|
+
# @param [ Class ] klass The model class.
|
67
|
+
# @param [ Symbol ] name The field name.
|
68
|
+
# @param [ Hash ] options The provided options.
|
69
|
+
#
|
70
|
+
# @raise [ Errors::InvalidFieldOption ] If an option is invalid.
|
71
|
+
#
|
72
|
+
# @since 3.0.0
|
73
|
+
def validate_options(klass, name, options)
|
74
|
+
options.keys.each do |option|
|
75
|
+
if !OPTIONS.include?(option) && !Fields.options.include?(option)
|
76
|
+
raise Errors::InvalidFieldOption.new(klass, name, option, OPTIONS)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/mongoid/finders.rb
CHANGED
@@ -1,42 +1,25 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
|
4
4
|
# This module defines the finder methods that hang off the document at the
|
5
5
|
# class level.
|
6
6
|
module Finders
|
7
|
+
extend Origin::Forwardable
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
:avg, :desc, :descending, :excludes,
|
12
|
-
:includes, :limit, :max, :min, :not_in, :only,
|
13
|
-
:order_by, :search, :skip, :sum, :without, :where,
|
14
|
-
:update, :update_all, :near ]
|
15
|
-
delegate *(critera_methods.dup << { :to => :criteria })
|
9
|
+
select_with :with_default_scope
|
10
|
+
delegate :aggregates, :avg, :each, :extras, :find_and_modify, :includes,
|
11
|
+
:map_reduce, :max, :min, :sum, :update, :update_all, to: :with_default_scope
|
16
12
|
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# @example Find all matching documents given conditions.
|
20
|
-
# Person.all(:conditions => { :attribute => "value" })
|
21
|
-
#
|
22
|
-
# @param [ Array ] args The conditions with options.
|
23
|
-
#
|
24
|
-
# @return [ Criteria ] The matching documents.
|
25
|
-
def all(*args)
|
26
|
-
find(:all, *args)
|
27
|
-
end
|
28
|
-
|
29
|
-
# Returns a count of matching records in the database based on the
|
30
|
-
# provided arguments.
|
13
|
+
# Returns a count of records in the database.
|
14
|
+
# If you want to specify conditions use where.
|
31
15
|
#
|
32
16
|
# @example Get the count of matching documents.
|
33
|
-
# Person.count
|
34
|
-
#
|
35
|
-
# @param [ Array ] args The conditions.
|
17
|
+
# Person.count
|
18
|
+
# Person.where(title: "Sir").count
|
36
19
|
#
|
37
20
|
# @return [ Integer ] The number of matching documents.
|
38
|
-
def count
|
39
|
-
|
21
|
+
def count
|
22
|
+
with_default_scope.count
|
40
23
|
end
|
41
24
|
|
42
25
|
# Returns true if count is zero
|
@@ -53,11 +36,11 @@ module Mongoid #:nodoc:
|
|
53
36
|
# provided arguments.
|
54
37
|
#
|
55
38
|
# @example Do any documents exist for the conditions?
|
56
|
-
# Person.exists?
|
39
|
+
# Person.exists?
|
57
40
|
#
|
58
41
|
# @param [ Array ] args The conditions.
|
59
|
-
def exists?
|
60
|
-
|
42
|
+
def exists?
|
43
|
+
with_default_scope.exists?
|
61
44
|
end
|
62
45
|
|
63
46
|
# Find a +Document+ in several different ways.
|
@@ -68,12 +51,6 @@ module Mongoid #:nodoc:
|
|
68
51
|
# it will attempt to find either a single +Document+ or multiples based
|
69
52
|
# on the conditions provided and the first parameter.
|
70
53
|
#
|
71
|
-
# @example Find the first matching document.
|
72
|
-
# Person.find(:first, :conditions => { :attribute => "value" })
|
73
|
-
#
|
74
|
-
# @example Find all matching documents.
|
75
|
-
# Person.find(:all, :conditions => { :attribute => "value" })
|
76
|
-
#
|
77
54
|
# @example Find a single document by an id.
|
78
55
|
# Person.find(BSON::ObjectId)
|
79
56
|
#
|
@@ -81,7 +58,7 @@ module Mongoid #:nodoc:
|
|
81
58
|
#
|
82
59
|
# @return [ Document, nil, Criteria ] A document or matching documents.
|
83
60
|
def find(*args)
|
84
|
-
|
61
|
+
with_default_scope.find(*args)
|
85
62
|
end
|
86
63
|
|
87
64
|
# Find the first +Document+ given the conditions, or creates a new document
|
@@ -110,6 +87,28 @@ module Mongoid #:nodoc:
|
|
110
87
|
find_or(:new, attrs, &block)
|
111
88
|
end
|
112
89
|
|
90
|
+
# Find the first +Document+ given the conditions, or raises
|
91
|
+
# Mongoid::Errors::DocumentNotFound
|
92
|
+
#
|
93
|
+
# @example Find the document by attribute other than id
|
94
|
+
# Person.find_by(:username => "superuser")
|
95
|
+
#
|
96
|
+
# @param [ Hash ] attrs The attributes to check.
|
97
|
+
#
|
98
|
+
# @raise [ Errors::DocumentNotFound ] If no document found.
|
99
|
+
#
|
100
|
+
# @return [ Document ] A matching document.
|
101
|
+
#
|
102
|
+
# @since 3.0.0
|
103
|
+
def find_by(attrs = {})
|
104
|
+
result = where(attrs).first
|
105
|
+
if result.nil? && Mongoid.raise_not_found_error
|
106
|
+
raise(Errors::DocumentNotFound.new(self, attrs))
|
107
|
+
end
|
108
|
+
yield(result) if result && block_given?
|
109
|
+
result
|
110
|
+
end
|
111
|
+
|
113
112
|
# Find the first +Document+ given the conditions.
|
114
113
|
#
|
115
114
|
# @example Find the first document.
|
@@ -118,8 +117,8 @@ module Mongoid #:nodoc:
|
|
118
117
|
# @param [ Array ] args The conditions with options.
|
119
118
|
#
|
120
119
|
# @return [ Document ] The first matching document.
|
121
|
-
def first
|
122
|
-
|
120
|
+
def first
|
121
|
+
with_default_scope.first
|
123
122
|
end
|
124
123
|
|
125
124
|
# Find the last +Document+ given the conditions.
|
@@ -130,8 +129,8 @@ module Mongoid #:nodoc:
|
|
130
129
|
# @param [ Array ] args The conditions with options.
|
131
130
|
#
|
132
131
|
# @return [ Document ] The last matching document.
|
133
|
-
def last
|
134
|
-
|
132
|
+
def last
|
133
|
+
with_default_scope.last
|
135
134
|
end
|
136
135
|
|
137
136
|
protected
|
@@ -146,7 +145,7 @@ module Mongoid #:nodoc:
|
|
146
145
|
#
|
147
146
|
# @return [ Document ] The first or new document.
|
148
147
|
def find_or(method, attrs = {}, &block)
|
149
|
-
|
148
|
+
where(attrs).first || send(method, attrs, &block)
|
150
149
|
end
|
151
150
|
end
|
152
151
|
end
|
data/lib/mongoid/hierarchy.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Hierarchy
|
2
|
+
module Mongoid
|
3
|
+
module Hierarchy
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
@@ -19,18 +19,29 @@ module Mongoid #:nodoc
|
|
19
19
|
#
|
20
20
|
# @return [ Array<Document> ] All child documents in the hierarchy.
|
21
21
|
def _children
|
22
|
-
@_children ||=
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
22
|
+
@_children ||= collect_children
|
23
|
+
end
|
24
|
+
|
25
|
+
# Collect all the children of this document.
|
26
|
+
#
|
27
|
+
# @example Collect all the children.
|
28
|
+
# document.collect_children
|
29
|
+
#
|
30
|
+
# @return [ Array<Document> ] The children.
|
31
|
+
#
|
32
|
+
# @since 2.4.0
|
33
|
+
def collect_children
|
34
|
+
children = []
|
35
|
+
embedded_relations.each_pair do |name, metadata|
|
36
|
+
without_autobuild do
|
37
|
+
child = send(name)
|
38
|
+
Array.wrap(child).each do |doc|
|
39
|
+
children.push(doc)
|
40
|
+
children.concat(doc._children) unless metadata.versioned?
|
41
|
+
end if child
|
33
42
|
end
|
43
|
+
end
|
44
|
+
children
|
34
45
|
end
|
35
46
|
|
36
47
|
# Determines if the document is a subclass of another document.
|
@@ -106,7 +117,7 @@ module Mongoid #:nodoc
|
|
106
117
|
object || self
|
107
118
|
end
|
108
119
|
|
109
|
-
module ClassMethods
|
120
|
+
module ClassMethods
|
110
121
|
|
111
122
|
# Determines if the document is a subclass of another document.
|
112
123
|
#
|
data/lib/mongoid/identity_map.rb
CHANGED
@@ -1,22 +1,23 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
|
4
4
|
# Defines behaviour for the identity map in Mongoid.
|
5
5
|
class IdentityMap < Hash
|
6
6
|
|
7
|
-
# Clear the
|
7
|
+
# Clear out the loaded documents for the provided selector.
|
8
8
|
#
|
9
|
-
# @example Clear the
|
10
|
-
#
|
9
|
+
# @example Clear out the documents.
|
10
|
+
# map.clear_many(Post, { person_id: person.id })
|
11
11
|
#
|
12
|
-
# @param [ Class ] klass The
|
13
|
-
# @param [ Hash ] selector The selector
|
12
|
+
# @param [ Class ] klass The class of the relation.
|
13
|
+
# @param [ Hash ] selector The selector.
|
14
14
|
#
|
15
|
-
# @return [ Array
|
15
|
+
# @return [ Array ] An empty array.
|
16
16
|
#
|
17
17
|
# @since 2.4.10
|
18
18
|
def clear_many(klass, selector)
|
19
|
-
|
19
|
+
documents = documents_for(klass)[selector]
|
20
|
+
documents.clear if documents
|
20
21
|
end
|
21
22
|
|
22
23
|
# Get a document from the identity map by its id.
|
@@ -31,8 +32,16 @@ module Mongoid #:nodoc:
|
|
31
32
|
#
|
32
33
|
# @since 2.1.0
|
33
34
|
def get(klass, identifier)
|
34
|
-
|
35
|
-
|
35
|
+
if Mongoid.using_identity_map? && klass
|
36
|
+
if identifier.is_a?(::Array)
|
37
|
+
documents = documents_for(klass)
|
38
|
+
identifier.map do |id|
|
39
|
+
documents[id] || (return nil)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
documents_for(klass)[identifier]
|
43
|
+
end
|
44
|
+
end
|
36
45
|
end
|
37
46
|
|
38
47
|
# Remove the document from the identity map.
|
@@ -46,8 +55,9 @@ module Mongoid #:nodoc:
|
|
46
55
|
#
|
47
56
|
# @since 2.1.0
|
48
57
|
def remove(document)
|
49
|
-
|
50
|
-
|
58
|
+
if Mongoid.using_identity_map? && document && document.id
|
59
|
+
documents_for(document.class).delete(document.id)
|
60
|
+
end
|
51
61
|
end
|
52
62
|
|
53
63
|
# Puts a document in the identity map, accessed by it's id.
|
@@ -61,8 +71,9 @@ module Mongoid #:nodoc:
|
|
61
71
|
#
|
62
72
|
# @since 2.1.0
|
63
73
|
def set(document)
|
64
|
-
|
65
|
-
|
74
|
+
if Mongoid.using_identity_map? && document && document.id
|
75
|
+
documents_for(document.class)[document.id] = document
|
76
|
+
end
|
66
77
|
end
|
67
78
|
|
68
79
|
# Set a document in the identity map for the provided selector.
|
@@ -108,8 +119,9 @@ module Mongoid #:nodoc:
|
|
108
119
|
#
|
109
120
|
# @since 2.1.0
|
110
121
|
def documents_for(klass)
|
111
|
-
|
112
|
-
|
122
|
+
if klass
|
123
|
+
self[klass.collection_name] ||= {}
|
124
|
+
end
|
113
125
|
end
|
114
126
|
|
115
127
|
class << self
|
@@ -125,11 +137,11 @@ module Mongoid #:nodoc:
|
|
125
137
|
# IdentityMap.set(document)
|
126
138
|
#
|
127
139
|
# @since 2.1.0
|
128
|
-
delegate
|
140
|
+
delegate(*(
|
129
141
|
Hash.public_instance_methods(false) +
|
130
142
|
IdentityMap.public_instance_methods(false) <<
|
131
|
-
{ :
|
132
|
-
)
|
143
|
+
{ to: :"Mongoid::Threaded.identity_map" }
|
144
|
+
))
|
133
145
|
end
|
134
146
|
end
|
135
147
|
end
|
data/lib/mongoid/indexes.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
2
|
+
require "mongoid/indexes/validators/options"
|
3
|
+
|
4
|
+
module Mongoid
|
5
|
+
module Indexes
|
4
6
|
extend ActiveSupport::Concern
|
5
7
|
|
6
8
|
included do
|
@@ -8,18 +10,37 @@ module Mongoid #:nodoc
|
|
8
10
|
self.index_options = {}
|
9
11
|
end
|
10
12
|
|
11
|
-
module ClassMethods
|
13
|
+
module ClassMethods
|
12
14
|
|
13
15
|
# Send the actual index creation comments to the MongoDB driver
|
14
16
|
#
|
15
17
|
# @example Create the indexes for the class.
|
16
18
|
# Person.create_indexes
|
19
|
+
#
|
20
|
+
# @return [ true ] If the operation succeeded.
|
21
|
+
#
|
22
|
+
# @since 1.0.0
|
17
23
|
def create_indexes
|
18
24
|
return unless index_options
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
25
|
+
index_options.each_pair do |spec, options|
|
26
|
+
collection.indexes.create(spec, options)
|
27
|
+
end and true
|
28
|
+
end
|
29
|
+
|
30
|
+
# Send the actual index removal comments to the MongoDB driver,
|
31
|
+
# but lets _id untouched.
|
32
|
+
#
|
33
|
+
# @example Remove the indexes for the class.
|
34
|
+
# Person.remove_indexes
|
35
|
+
#
|
36
|
+
# @return [ true ] If the operation succeeded.
|
37
|
+
#
|
38
|
+
# @since 3.0.0
|
39
|
+
def remove_indexes
|
40
|
+
collection.indexes.each do |spec|
|
41
|
+
next if spec["name"] == "_id_"
|
42
|
+
collection.indexes.drop(spec["key"])
|
43
|
+
end and true
|
23
44
|
end
|
24
45
|
|
25
46
|
# Add the default indexes to the root document if they do not already
|
@@ -27,11 +48,15 @@ module Mongoid #:nodoc
|
|
27
48
|
#
|
28
49
|
# @example Add Mongoid internal indexes.
|
29
50
|
# Person.add_indexes
|
51
|
+
#
|
52
|
+
# @return [ true ] If the operation succeeded.
|
53
|
+
#
|
54
|
+
# @since 1.0.0
|
30
55
|
def add_indexes
|
31
|
-
if hereditary? && !index_options[:
|
32
|
-
|
56
|
+
if hereditary? && !index_options[{ _type: 1 }]
|
57
|
+
index({ _type: 1 }, { unique: false, background: true })
|
33
58
|
end
|
34
|
-
|
59
|
+
true
|
35
60
|
end
|
36
61
|
|
37
62
|
# Adds an index on the field specified. Options can be :unique => true or
|
@@ -40,14 +65,40 @@ module Mongoid #:nodoc
|
|
40
65
|
# @example Create a basic index.
|
41
66
|
# class Person
|
42
67
|
# include Mongoid::Document
|
43
|
-
# field :name, :
|
44
|
-
|
68
|
+
# field :name, type: String
|
69
|
+
|
70
|
+
# index({ name: 1 }, { background: true })
|
71
|
+
# end
|
45
72
|
#
|
46
73
|
# @param [ Symbol ] name The name of the field.
|
47
74
|
# @param [ Hash ] options The index options.
|
48
|
-
|
49
|
-
|
50
|
-
|
75
|
+
#
|
76
|
+
# @return [ Hash ] The index options.
|
77
|
+
#
|
78
|
+
# @since 1.0.0
|
79
|
+
def index(spec, options = nil)
|
80
|
+
Validators::Options.validate(self, spec, options || {})
|
81
|
+
index_options[spec] = normalize_index_options(options)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
# Normalize the index options, if any are provided.
|
87
|
+
#
|
88
|
+
# @api private
|
89
|
+
#
|
90
|
+
# @example Normalize the index options.
|
91
|
+
# Model.normalize_index_options(drop_dups: true)
|
92
|
+
#
|
93
|
+
# @param [ Hash ] options The index options.
|
94
|
+
#
|
95
|
+
# @return [ Hash ] The normalized options.
|
96
|
+
#
|
97
|
+
# @since 3.0.0
|
98
|
+
def normalize_index_options(options)
|
99
|
+
opts = options || {}
|
100
|
+
opts[:dropDups] = opts.delete(:drop_dups) if opts.has_key?(:drop_dups)
|
101
|
+
opts
|
51
102
|
end
|
52
103
|
end
|
53
104
|
end
|