mongoid 7.5.4 → 8.1.3
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +40 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +34 -11
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +69 -45
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +8 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +45 -7
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +15 -4
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
- data/lib/mongoid/association/referenced/has_many/proxy.rb +29 -19
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +4 -4
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +7 -0
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +3 -3
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/changeable.rb +147 -14
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +3 -15
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +153 -18
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +285 -58
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +540 -346
- data/lib/mongoid/contextual/none.rb +193 -20
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +14 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +8 -5
- data/lib/mongoid/criteria/includable.rb +27 -22
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +20 -40
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +127 -35
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +37 -8
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +10 -8
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +29 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +19 -4
- data/lib/mongoid/fields/standard.rb +17 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +129 -20
- data/lib/mongoid/findable.rb +54 -24
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +188 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +33 -13
- data/lib/mongoid/persistable/creatable.rb +19 -9
- data/lib/mongoid/persistable/deletable.rb +2 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +14 -2
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +69 -12
- data/lib/mongoid/persistable/upsertable.rb +21 -2
- data/lib/mongoid/persistable.rb +6 -3
- data/lib/mongoid/persistence_context.rb +6 -4
- data/lib/mongoid/query_cache.rb +13 -261
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +15 -13
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +5 -7
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +9 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +19 -4
- data/lib/mongoid.rb +17 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +10 -14
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +132 -1
- data/spec/integration/callbacks_spec.rb +381 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +255 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +173 -177
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +15 -1
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +510 -33
- data/spec/mongoid/changeable_spec.rb +429 -37
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +149 -15
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +214 -31
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +850 -88
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +2309 -1127
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +500 -84
- data/spec/mongoid/findable_spec.rb +450 -58
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +55 -30
- data/spec/mongoid/interceptable_spec.rb +824 -22
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +31 -57
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +56 -215
- data/spec/mongoid/reloadable_spec.rb +83 -6
- data/spec/mongoid/scopable_spec.rb +91 -1
- data/spec/mongoid/serializable_spec.rb +9 -30
- data/spec/mongoid/shardable_spec.rb +4 -4
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +34 -16
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/docker_runner.rb +8 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +2 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +36 -40
- data/spec/shared/shlib/server.sh +28 -4
- data/spec/shared/shlib/set_env.sh +4 -4
- data/spec/spec_helper.rb +5 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +78 -0
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +4 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/product.rb +1 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +100 -22
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
data/lib/mongoid/fields.rb
CHANGED
@@ -42,6 +42,11 @@ module Mongoid
|
|
42
42
|
# @api private
|
43
43
|
IDS = [ :_id, '_id', ].freeze
|
44
44
|
|
45
|
+
# BSON classes that are not supported as field types
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
INVALID_BSON_CLASSES = [ BSON::Decimal128, BSON::Int32, BSON::Int64 ].freeze
|
49
|
+
|
45
50
|
module ClassMethods
|
46
51
|
# Returns the list of id fields for this model class, as both strings
|
47
52
|
# and symbols.
|
@@ -142,7 +147,7 @@ module Mongoid
|
|
142
147
|
# @example Apply all the non-proc defaults.
|
143
148
|
# model.apply_pre_processed_defaults
|
144
149
|
#
|
145
|
-
# @return [ Array<String ] The names of the non-proc defaults.
|
150
|
+
# @return [ Array<String> ] The names of the non-proc defaults.
|
146
151
|
def apply_pre_processed_defaults
|
147
152
|
pre_processed_defaults.each do |name|
|
148
153
|
apply_default(name)
|
@@ -154,8 +159,9 @@ module Mongoid
|
|
154
159
|
# @example Apply all the proc defaults.
|
155
160
|
# model.apply_post_processed_defaults
|
156
161
|
#
|
157
|
-
# @return [ Array<String ] The names of the proc defaults.
|
162
|
+
# @return [ Array<String> ] The names of the proc defaults.
|
158
163
|
def apply_post_processed_defaults
|
164
|
+
pending_callbacks.delete(:apply_post_processed_defaults)
|
159
165
|
post_processed_defaults.each do |name|
|
160
166
|
apply_default(name)
|
161
167
|
end
|
@@ -184,6 +190,7 @@ module Mongoid
|
|
184
190
|
# @example Apply all the defaults.
|
185
191
|
# model.apply_defaults
|
186
192
|
def apply_defaults
|
193
|
+
pending_callbacks.delete(:apply_defaults)
|
187
194
|
apply_pre_processed_defaults
|
188
195
|
apply_post_processed_defaults
|
189
196
|
end
|
@@ -207,7 +214,7 @@ module Mongoid
|
|
207
214
|
# @example Get the database field name.
|
208
215
|
# model.database_field_name(:authorization)
|
209
216
|
#
|
210
|
-
# @param [ String
|
217
|
+
# @param [ String | Symbol ] name The name to get.
|
211
218
|
#
|
212
219
|
# @return [ String ] The name of the field as it's stored in the db.
|
213
220
|
def database_field_name(name)
|
@@ -222,7 +229,7 @@ module Mongoid
|
|
222
229
|
# @param [ Field ] field The field.
|
223
230
|
# @param [ Object ] value The current value.
|
224
231
|
#
|
225
|
-
# @return [ true
|
232
|
+
# @return [ true | false ] If we set the field lazily.
|
226
233
|
def lazy_settable?(field, value)
|
227
234
|
!frozen? && value.nil? && field.lazy?
|
228
235
|
end
|
@@ -234,11 +241,37 @@ module Mongoid
|
|
234
241
|
# @example Is the document using object ids?
|
235
242
|
# model.using_object_ids?
|
236
243
|
#
|
237
|
-
# @return [ true
|
244
|
+
# @return [ true | false ] Using object ids.
|
238
245
|
def using_object_ids?
|
239
246
|
self.class.using_object_ids?
|
240
247
|
end
|
241
248
|
|
249
|
+
# Does this field start with a dollar sign ($) or contain a dot/period (.)?
|
250
|
+
#
|
251
|
+
# @api private
|
252
|
+
#
|
253
|
+
# @param [ String ] name The field name.
|
254
|
+
#
|
255
|
+
# @return [ true | false ] If this field is dotted or dollared.
|
256
|
+
def dot_dollar_field?(name)
|
257
|
+
n = aliased_fields[name] || name
|
258
|
+
fields.key?(n) && (n.include?('.') || n.start_with?('$'))
|
259
|
+
end
|
260
|
+
|
261
|
+
# Validate whether or not the field starts with a dollar sign ($) or
|
262
|
+
# contains a dot/period (.).
|
263
|
+
#
|
264
|
+
# @api private
|
265
|
+
#
|
266
|
+
# @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
|
267
|
+
#
|
268
|
+
# @param [ String ] name The field name.
|
269
|
+
def validate_writable_field_name!(name)
|
270
|
+
if dot_dollar_field?(name)
|
271
|
+
raise Errors::InvalidDotDollarAssignment.new(self.class, name)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
242
275
|
class << self
|
243
276
|
|
244
277
|
# Stores the provided block to be run when the option name specified is
|
@@ -363,7 +396,7 @@ module Mongoid
|
|
363
396
|
# If the belongs_to association is the last part of the name, we will
|
364
397
|
# pass back the _id field.
|
365
398
|
#
|
366
|
-
# @param [ String
|
399
|
+
# @param [ String | Symbol ] name The name to get.
|
367
400
|
# @param [ Hash ] relations The associations.
|
368
401
|
# @param [ Hash ] alaiased_fields The aliased fields.
|
369
402
|
# @param [ Hash ] alaiased_associations The aliased associations.
|
@@ -422,7 +455,7 @@ module Mongoid
|
|
422
455
|
# Get the name of the provided field as it is stored in the database.
|
423
456
|
# Used in determining if the field is aliased or not.
|
424
457
|
#
|
425
|
-
# @param [ String
|
458
|
+
# @param [ String | Symbol ] name The name to get.
|
426
459
|
#
|
427
460
|
# @return [ String ] The name of the field as it's stored in the db.
|
428
461
|
def database_field_name(name)
|
@@ -474,7 +507,7 @@ module Mongoid
|
|
474
507
|
# @example Does this class use object ids?
|
475
508
|
# person.using_object_ids?
|
476
509
|
#
|
477
|
-
# @return [ true
|
510
|
+
# @return [ true | false ] If the class uses BSON::ObjectIds for the id.
|
478
511
|
def using_object_ids?
|
479
512
|
fields["_id"].object_id_field?
|
480
513
|
end
|
@@ -505,6 +538,8 @@ module Mongoid
|
|
505
538
|
# Model.add_defaults(field)
|
506
539
|
#
|
507
540
|
# @param [ Field ] field The field to add for.
|
541
|
+
#
|
542
|
+
# @api private
|
508
543
|
def add_defaults(field)
|
509
544
|
default, name = field.default_val, field.name.to_s
|
510
545
|
remove_defaults(name)
|
@@ -524,6 +559,8 @@ module Mongoid
|
|
524
559
|
#
|
525
560
|
# @param [ Symbol ] name The name of the field.
|
526
561
|
# @param [ Hash ] options The hash of options.
|
562
|
+
#
|
563
|
+
# @api private
|
527
564
|
def add_field(name, options = {})
|
528
565
|
aliased = options[:as]
|
529
566
|
aliased_fields[aliased.to_s] = name if aliased
|
@@ -551,6 +588,8 @@ module Mongoid
|
|
551
588
|
# # => "called"
|
552
589
|
#
|
553
590
|
# @param [ Field ] field the field to process
|
591
|
+
#
|
592
|
+
# @api private
|
554
593
|
def process_options(field)
|
555
594
|
field_options = field.options
|
556
595
|
|
@@ -573,6 +612,8 @@ module Mongoid
|
|
573
612
|
# @param [ Symbol ] name The name of the field.
|
574
613
|
# @param [ Symbol ] meth The name of the accessor.
|
575
614
|
# @param [ Hash ] options The options.
|
615
|
+
#
|
616
|
+
# @api private
|
576
617
|
def create_accessors(name, meth, options = {})
|
577
618
|
field = fields[name]
|
578
619
|
|
@@ -596,6 +637,8 @@ module Mongoid
|
|
596
637
|
# @param [ String ] name The name of the attribute.
|
597
638
|
# @param [ String ] meth The name of the method.
|
598
639
|
# @param [ Field ] field The field.
|
640
|
+
#
|
641
|
+
# @api private
|
599
642
|
def create_field_getter(name, meth, field)
|
600
643
|
generated_methods.module_eval do
|
601
644
|
re_define_method(meth) do
|
@@ -603,9 +646,7 @@ module Mongoid
|
|
603
646
|
if lazy_settable?(field, raw)
|
604
647
|
write_attribute(name, field.eval_default(self))
|
605
648
|
else
|
606
|
-
|
607
|
-
attribute_will_change!(name) if value.resizable?
|
608
|
-
value
|
649
|
+
process_raw_attribute(name.to_s, raw, field)
|
609
650
|
end
|
610
651
|
end
|
611
652
|
end
|
@@ -620,6 +661,8 @@ module Mongoid
|
|
620
661
|
#
|
621
662
|
# @param [ String ] name The name of the attribute.
|
622
663
|
# @param [ String ] meth The name of the method.
|
664
|
+
#
|
665
|
+
# @api private
|
623
666
|
def create_field_getter_before_type_cast(name, meth)
|
624
667
|
generated_methods.module_eval do
|
625
668
|
re_define_method("#{meth}_before_type_cast") do
|
@@ -640,6 +683,8 @@ module Mongoid
|
|
640
683
|
# @param [ String ] name The name of the attribute.
|
641
684
|
# @param [ String ] meth The name of the method.
|
642
685
|
# @param [ Field ] field The field.
|
686
|
+
#
|
687
|
+
# @api private
|
643
688
|
def create_field_setter(name, meth, field)
|
644
689
|
generated_methods.module_eval do
|
645
690
|
re_define_method("#{meth}=") do |value|
|
@@ -659,6 +704,8 @@ module Mongoid
|
|
659
704
|
#
|
660
705
|
# @param [ String ] name The name of the attribute.
|
661
706
|
# @param [ String ] meth The name of the method.
|
707
|
+
#
|
708
|
+
# @api private
|
662
709
|
def create_field_check(name, meth)
|
663
710
|
generated_methods.module_eval do
|
664
711
|
re_define_method("#{meth}?") do
|
@@ -675,6 +722,8 @@ module Mongoid
|
|
675
722
|
#
|
676
723
|
# @param [ String ] name The name of the attribute.
|
677
724
|
# @param [ String ] meth The name of the method.
|
725
|
+
#
|
726
|
+
# @api private
|
678
727
|
def create_translations_getter(name, meth)
|
679
728
|
generated_methods.module_eval do
|
680
729
|
re_define_method("#{meth}_translations") do
|
@@ -693,14 +742,14 @@ module Mongoid
|
|
693
742
|
# @param [ String ] name The name of the attribute.
|
694
743
|
# @param [ String ] meth The name of the method.
|
695
744
|
# @param [ Field ] field The field.
|
745
|
+
#
|
746
|
+
# @api private
|
696
747
|
def create_translations_setter(name, meth, field)
|
697
748
|
generated_methods.module_eval do
|
698
749
|
re_define_method("#{meth}_translations=") do |value|
|
699
750
|
attribute_will_change!(name)
|
700
|
-
|
701
|
-
|
702
|
-
field.type.mongoize(_value)
|
703
|
-
end
|
751
|
+
value&.transform_values! do |_value|
|
752
|
+
field.type.mongoize(_value)
|
704
753
|
end
|
705
754
|
attributes[name] = value
|
706
755
|
end
|
@@ -714,6 +763,8 @@ module Mongoid
|
|
714
763
|
# Person.generated_methods
|
715
764
|
#
|
716
765
|
# @return [ Module ] The module of generated methods.
|
766
|
+
#
|
767
|
+
# @api private
|
717
768
|
def generated_methods
|
718
769
|
@generated_methods ||= begin
|
719
770
|
mod = Module.new
|
@@ -728,27 +779,85 @@ module Mongoid
|
|
728
779
|
# Model.remove_defaults(name)
|
729
780
|
#
|
730
781
|
# @param [ String ] name The field name.
|
782
|
+
#
|
783
|
+
# @api private
|
731
784
|
def remove_defaults(name)
|
732
785
|
pre_processed_defaults.delete_one(name)
|
733
786
|
post_processed_defaults.delete_one(name)
|
734
787
|
end
|
735
788
|
|
789
|
+
# Create a field for the given name and options.
|
790
|
+
#
|
791
|
+
# @param [ Symbol ] name The name of the field.
|
792
|
+
# @param [ Hash ] options The hash of options.
|
793
|
+
#
|
794
|
+
# @return [ Field ] The created field.
|
795
|
+
#
|
796
|
+
# @api private
|
736
797
|
def field_for(name, options)
|
737
798
|
opts = options.merge(klass: self)
|
738
|
-
|
739
|
-
opts[:type] = type_mapping || unmapped_type(options)
|
799
|
+
opts[:type] = retrieve_and_validate_type(name, options[:type])
|
740
800
|
return Fields::Localized.new(name, opts) if options[:localize]
|
741
801
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
742
802
|
Fields::Standard.new(name, opts)
|
743
803
|
end
|
744
804
|
|
745
|
-
|
746
|
-
|
805
|
+
# Get the class for the given type.
|
806
|
+
#
|
807
|
+
# @param [ Symbol ] name The name of the field.
|
808
|
+
# @param [ Symbol | Class ] type The type of the field.
|
809
|
+
#
|
810
|
+
# @return [ Class ] The type of the field.
|
811
|
+
#
|
812
|
+
# @raises [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
|
813
|
+
# type.
|
814
|
+
#
|
815
|
+
# @api private
|
816
|
+
def retrieve_and_validate_type(name, type)
|
817
|
+
result = TYPE_MAPPINGS[type] || unmapped_type(type)
|
818
|
+
raise Errors::InvalidFieldType.new(self, name, type) if !result.is_a?(Class)
|
819
|
+
|
820
|
+
if unsupported_type?(result)
|
821
|
+
warn_message = "Using #{result} as the field type is not supported. "
|
822
|
+
if result == BSON::Decimal128
|
823
|
+
warn_message += 'In BSON <= 4, the BSON::Decimal128 type will work as expected for both storing and querying, but will return a BigDecimal on query in BSON 5+. To use literal BSON::Decimal128 fields with BSON 5, set Mongoid.allow_bson5_decimal128 to true.'
|
824
|
+
else
|
825
|
+
warn_message += 'Saving values of this type to the database will work as expected, however, querying them will return a value of the native Ruby Integer type.'
|
826
|
+
end
|
827
|
+
Mongoid.logger.warn(warn_message)
|
828
|
+
end
|
829
|
+
|
830
|
+
result
|
831
|
+
end
|
832
|
+
|
833
|
+
# Returns the type of the field if the type was not in the TYPE_MAPPINGS
|
834
|
+
# hash.
|
835
|
+
#
|
836
|
+
# @param [ Symbol | Class ] type The type of the field.
|
837
|
+
#
|
838
|
+
# @return [ Class ] The type of the field.
|
839
|
+
#
|
840
|
+
# @api private
|
841
|
+
def unmapped_type(type)
|
842
|
+
if "Boolean" == type.to_s
|
747
843
|
Mongoid::Boolean
|
748
844
|
else
|
749
|
-
|
845
|
+
type || Object
|
750
846
|
end
|
751
847
|
end
|
848
|
+
|
849
|
+
# Queries whether or not the given type is permitted as a declared field
|
850
|
+
# type.
|
851
|
+
#
|
852
|
+
# @param [ Class ] type The type to query
|
853
|
+
#
|
854
|
+
# @return [ true | false ] whether or not the type is supported
|
855
|
+
#
|
856
|
+
# @api private
|
857
|
+
def unsupported_type?(type)
|
858
|
+
return !Mongoid::Config.allow_bson5_decimal128? if type == BSON::Decimal128
|
859
|
+
INVALID_BSON_CLASSES.include?(type)
|
860
|
+
end
|
752
861
|
end
|
753
862
|
end
|
754
863
|
end
|
data/lib/mongoid/findable.rb
CHANGED
@@ -22,29 +22,44 @@ module Mongoid
|
|
22
22
|
:each,
|
23
23
|
:each_with_index,
|
24
24
|
:extras,
|
25
|
+
:fifth,
|
26
|
+
:fifth!,
|
25
27
|
:find_one_and_delete,
|
26
28
|
:find_one_and_replace,
|
27
29
|
:find_one_and_update,
|
28
30
|
:find_or_create_by,
|
29
31
|
:find_or_create_by!,
|
30
32
|
:find_or_initialize_by,
|
33
|
+
:first!,
|
31
34
|
:first_or_create,
|
32
35
|
:first_or_create!,
|
33
36
|
:first_or_initialize,
|
34
37
|
:for_js,
|
38
|
+
:fourth,
|
39
|
+
:fourth!,
|
35
40
|
:geo_near,
|
36
41
|
:includes,
|
42
|
+
:last!,
|
37
43
|
:map_reduce,
|
38
44
|
:max,
|
39
45
|
:min,
|
40
46
|
:none,
|
47
|
+
:pick,
|
41
48
|
:pluck,
|
42
49
|
:read,
|
50
|
+
:second,
|
51
|
+
:second!,
|
52
|
+
:second_to_last,
|
53
|
+
:second_to_last!,
|
43
54
|
:sum,
|
44
55
|
:take,
|
45
56
|
:take!,
|
46
57
|
:tally,
|
47
58
|
:text_search,
|
59
|
+
:third,
|
60
|
+
:third!,
|
61
|
+
:third_to_last,
|
62
|
+
:third_to_last!,
|
48
63
|
:update,
|
49
64
|
:update_all,
|
50
65
|
|
@@ -75,7 +90,7 @@ module Mongoid
|
|
75
90
|
# @example Are there no saved documents for this model?
|
76
91
|
# Person.empty?
|
77
92
|
#
|
78
|
-
# @return [ true
|
93
|
+
# @return [ true | false ] If the collection is empty.
|
79
94
|
def empty?
|
80
95
|
count == 0
|
81
96
|
end
|
@@ -86,9 +101,19 @@ module Mongoid
|
|
86
101
|
# @example Do any documents exist for the conditions?
|
87
102
|
# Person.exists?
|
88
103
|
#
|
89
|
-
# @
|
90
|
-
|
91
|
-
|
104
|
+
# @example Do any documents exist for given _id.
|
105
|
+
# Person.exists?(BSON::ObjectId(...))
|
106
|
+
#
|
107
|
+
# @example Do any documents exist for given conditions.
|
108
|
+
# Person.exists?(name: "...")
|
109
|
+
#
|
110
|
+
# @param [ Hash | Object | false ] id_or_conditions an _id to
|
111
|
+
# search for, a hash of conditions, nil or false.
|
112
|
+
#
|
113
|
+
# @return [ true | false ] If any documents exist for the conditions.
|
114
|
+
# Always false if passed nil or false.
|
115
|
+
def exists?(id_or_conditions = :none)
|
116
|
+
with_default_scope.exists?(id_or_conditions)
|
92
117
|
end
|
93
118
|
|
94
119
|
# Finds a +Document+ or multiple documents by their _id values.
|
@@ -121,18 +146,32 @@ module Mongoid
|
|
121
146
|
# strings will be transparently converted to +BSON::ObjectId+ instances
|
122
147
|
# during query construction.
|
123
148
|
#
|
149
|
+
# If this method is given a block, it delegates to +Enumerable#find+ and
|
150
|
+
# returns the first document of those found by the current Crieria object
|
151
|
+
# for which the block returns a truthy value. If both a block and ids are
|
152
|
+
# given, the block is ignored and the documents for the given ids are
|
153
|
+
# returned. If a block and a Proc are given, the method delegates to
|
154
|
+
# +Enumerable#find+ and uses the proc as the default.
|
155
|
+
#
|
124
156
|
# The +find+ method takes into account the default scope defined on the
|
125
157
|
# model class, if any.
|
126
158
|
#
|
127
|
-
# @
|
128
|
-
# array
|
159
|
+
# @note Each argument can be an individual id, an array of ids or
|
160
|
+
# a nested array. Each array will be flattened.
|
161
|
+
#
|
162
|
+
# @param [ [ Object | Array<Object> ]... ] *args The id(s) to find.
|
129
163
|
#
|
130
164
|
# @return [ Document | Array<Document> | nil ] A document or matching documents.
|
131
165
|
#
|
132
166
|
# @raise Errors::DocumentNotFound If not all documents are found and
|
133
167
|
# the +raise_not_found_error+ Mongoid configuration option is truthy.
|
134
|
-
def find(*args)
|
135
|
-
|
168
|
+
def find(*args, &block)
|
169
|
+
empty_or_proc = args.empty? || (args.length == 1 && args.first.is_a?(Proc))
|
170
|
+
if block_given? && empty_or_proc
|
171
|
+
with_default_scope.find(*args, &block)
|
172
|
+
else
|
173
|
+
with_default_scope.find(*args)
|
174
|
+
end
|
136
175
|
end
|
137
176
|
|
138
177
|
# Find the first +Document+ given the conditions.
|
@@ -148,7 +187,7 @@ module Mongoid
|
|
148
187
|
# @raise [ Errors::DocumentNotFound ] If no document found
|
149
188
|
# and Mongoid.raise_not_found_error is true.
|
150
189
|
#
|
151
|
-
# @return [ Document
|
190
|
+
# @return [ Document | nil ] A matching document.
|
152
191
|
def find_by(attrs = {})
|
153
192
|
result = where(attrs).find_first
|
154
193
|
if result.nil? && Mongoid.raise_not_found_error
|
@@ -169,7 +208,6 @@ module Mongoid
|
|
169
208
|
# @raise [ Errors::DocumentNotFound ] If no document found.
|
170
209
|
#
|
171
210
|
# @return [ Document ] A matching document.
|
172
|
-
#
|
173
211
|
def find_by!(attrs = {})
|
174
212
|
result = where(attrs).find_first
|
175
213
|
raise(Errors::DocumentNotFound.new(self, attrs)) unless result
|
@@ -182,15 +220,11 @@ module Mongoid
|
|
182
220
|
# @example Find the first document.
|
183
221
|
# Person.first
|
184
222
|
#
|
185
|
-
# @param [ Integer
|
186
|
-
# return, or a hash of options.
|
187
|
-
#
|
188
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
189
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
223
|
+
# @param [ Integer ] limit The number of documents to return.
|
190
224
|
#
|
191
225
|
# @return [ Document ] The first matching document.
|
192
|
-
def first(
|
193
|
-
with_default_scope.first(
|
226
|
+
def first(limit = nil)
|
227
|
+
with_default_scope.first(limit)
|
194
228
|
end
|
195
229
|
alias :one :first
|
196
230
|
|
@@ -199,15 +233,11 @@ module Mongoid
|
|
199
233
|
# @example Find the last document.
|
200
234
|
# Person.last
|
201
235
|
#
|
202
|
-
# @param [ Integer
|
203
|
-
# return, or a hash of options.
|
204
|
-
#
|
205
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
206
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
236
|
+
# @param [ Integer ] limit The number of documents to return.
|
207
237
|
#
|
208
238
|
# @return [ Document ] The last matching document.
|
209
|
-
def last(
|
210
|
-
with_default_scope.last(
|
239
|
+
def last(limit = nil)
|
240
|
+
with_default_scope.last(limit)
|
211
241
|
end
|
212
242
|
end
|
213
243
|
end
|
@@ -27,7 +27,7 @@ module Mongoid
|
|
27
27
|
#
|
28
28
|
# @param [ Specification ] other The spec to compare against.
|
29
29
|
#
|
30
|
-
# @return [ true
|
30
|
+
# @return [ true | false ] If the specs are equal.
|
31
31
|
def ==(other)
|
32
32
|
fields == other.fields && key == other.key
|
33
33
|
end
|
@@ -86,7 +86,7 @@ module Mongoid
|
|
86
86
|
# @api private
|
87
87
|
#
|
88
88
|
# @example Normalize the index options.
|
89
|
-
# specification.normalize_options(
|
89
|
+
# specification.normalize_options(unique: true)
|
90
90
|
#
|
91
91
|
# @param [ Hash ] opts The index options.
|
92
92
|
#
|
@@ -13,7 +13,6 @@ module Mongoid
|
|
13
13
|
:database,
|
14
14
|
:default_language,
|
15
15
|
:language_override,
|
16
|
-
:drop_dups,
|
17
16
|
:name,
|
18
17
|
:sparse,
|
19
18
|
:unique,
|
@@ -29,7 +28,8 @@ module Mongoid
|
|
29
28
|
:text_version,
|
30
29
|
:version,
|
31
30
|
:partial_filter_expression,
|
32
|
-
:collation
|
31
|
+
:collation,
|
32
|
+
:wildcard_projection,
|
33
33
|
]
|
34
34
|
|
35
35
|
VALID_TYPES = [
|
@@ -98,6 +98,10 @@ module Mongoid
|
|
98
98
|
unless VALID_TYPES.include?(value)
|
99
99
|
raise Errors::InvalidIndex.new(klass, spec, options)
|
100
100
|
end
|
101
|
+
|
102
|
+
if value == "geoHaystack"
|
103
|
+
Mongoid::Warnings.warn_geo_haystack_deprecated
|
104
|
+
end
|
101
105
|
end
|
102
106
|
end
|
103
107
|
end
|