mongoid 7.5.4 → 8.1.7
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
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +44 -46
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +44 -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 +85 -46
- 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 +40 -21
- 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 +16 -7
- 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 +15 -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 +38 -9
- 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 +142 -28
- 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 +186 -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 +48 -14
- 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 +17 -13
- 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 +3 -4
- data/lib/mongoid/traversable.rb +10 -5
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +98 -17
- 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 +17 -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 +24 -19
- 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 +61 -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 +290 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -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 +19 -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 +215 -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 +526 -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 +2256 -1005
- 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 +503 -87
- 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 +25 -39
- 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/associated_spec.rb +27 -34
- 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/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 +5 -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/lat_lng.rb +6 -0
- data/spec/support/models/name.rb +10 -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
- metadata +101 -96
- checksums.yaml.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/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -378
- data/spec/shared/lib/mrss/docker_runner.rb +0 -291
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/session_registry.rb +0 -69
- data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -325
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/config.sh +0 -27
- data/spec/shared/shlib/distro.sh +0 -74
- data/spec/shared/shlib/server.sh +0 -392
- data/spec/shared/shlib/set_env.sh +0 -169
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
data/lib/mongoid/fields.rb
CHANGED
@@ -42,6 +42,16 @@ 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
|
+
|
50
|
+
# The suffix for generated translated fields.
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
TRANSLATIONS_SFX = '_translations'
|
54
|
+
|
45
55
|
module ClassMethods
|
46
56
|
# Returns the list of id fields for this model class, as both strings
|
47
57
|
# and symbols.
|
@@ -94,8 +104,8 @@ module Mongoid
|
|
94
104
|
ar.each_with_index do |fn, i|
|
95
105
|
key = fn
|
96
106
|
unless klass.fields.key?(fn) || klass.relations.key?(fn)
|
97
|
-
if
|
98
|
-
key =
|
107
|
+
if fn.end_with?(TRANSLATIONS_SFX)
|
108
|
+
key = fn.delete_suffix(TRANSLATIONS_SFX)
|
99
109
|
else
|
100
110
|
key = fn
|
101
111
|
end
|
@@ -142,7 +152,7 @@ module Mongoid
|
|
142
152
|
# @example Apply all the non-proc defaults.
|
143
153
|
# model.apply_pre_processed_defaults
|
144
154
|
#
|
145
|
-
# @return [ Array<String ] The names of the non-proc defaults.
|
155
|
+
# @return [ Array<String> ] The names of the non-proc defaults.
|
146
156
|
def apply_pre_processed_defaults
|
147
157
|
pre_processed_defaults.each do |name|
|
148
158
|
apply_default(name)
|
@@ -154,8 +164,9 @@ module Mongoid
|
|
154
164
|
# @example Apply all the proc defaults.
|
155
165
|
# model.apply_post_processed_defaults
|
156
166
|
#
|
157
|
-
# @return [ Array<String ] The names of the proc defaults.
|
167
|
+
# @return [ Array<String> ] The names of the proc defaults.
|
158
168
|
def apply_post_processed_defaults
|
169
|
+
pending_callbacks.delete(:apply_post_processed_defaults)
|
159
170
|
post_processed_defaults.each do |name|
|
160
171
|
apply_default(name)
|
161
172
|
end
|
@@ -184,6 +195,7 @@ module Mongoid
|
|
184
195
|
# @example Apply all the defaults.
|
185
196
|
# model.apply_defaults
|
186
197
|
def apply_defaults
|
198
|
+
pending_callbacks.delete(:apply_defaults)
|
187
199
|
apply_pre_processed_defaults
|
188
200
|
apply_post_processed_defaults
|
189
201
|
end
|
@@ -207,7 +219,7 @@ module Mongoid
|
|
207
219
|
# @example Get the database field name.
|
208
220
|
# model.database_field_name(:authorization)
|
209
221
|
#
|
210
|
-
# @param [ String
|
222
|
+
# @param [ String | Symbol ] name The name to get.
|
211
223
|
#
|
212
224
|
# @return [ String ] The name of the field as it's stored in the db.
|
213
225
|
def database_field_name(name)
|
@@ -222,7 +234,7 @@ module Mongoid
|
|
222
234
|
# @param [ Field ] field The field.
|
223
235
|
# @param [ Object ] value The current value.
|
224
236
|
#
|
225
|
-
# @return [ true
|
237
|
+
# @return [ true | false ] If we set the field lazily.
|
226
238
|
def lazy_settable?(field, value)
|
227
239
|
!frozen? && value.nil? && field.lazy?
|
228
240
|
end
|
@@ -234,11 +246,37 @@ module Mongoid
|
|
234
246
|
# @example Is the document using object ids?
|
235
247
|
# model.using_object_ids?
|
236
248
|
#
|
237
|
-
# @return [ true
|
249
|
+
# @return [ true | false ] Using object ids.
|
238
250
|
def using_object_ids?
|
239
251
|
self.class.using_object_ids?
|
240
252
|
end
|
241
253
|
|
254
|
+
# Does this field start with a dollar sign ($) or contain a dot/period (.)?
|
255
|
+
#
|
256
|
+
# @api private
|
257
|
+
#
|
258
|
+
# @param [ String ] name The field name.
|
259
|
+
#
|
260
|
+
# @return [ true | false ] If this field is dotted or dollared.
|
261
|
+
def dot_dollar_field?(name)
|
262
|
+
n = aliased_fields[name] || name
|
263
|
+
fields.key?(n) && (n.include?('.') || n.start_with?('$'))
|
264
|
+
end
|
265
|
+
|
266
|
+
# Validate whether or not the field starts with a dollar sign ($) or
|
267
|
+
# contains a dot/period (.).
|
268
|
+
#
|
269
|
+
# @api private
|
270
|
+
#
|
271
|
+
# @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
|
272
|
+
#
|
273
|
+
# @param [ String ] name The field name.
|
274
|
+
def validate_writable_field_name!(name)
|
275
|
+
if dot_dollar_field?(name)
|
276
|
+
raise Errors::InvalidDotDollarAssignment.new(self.class, name)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
242
280
|
class << self
|
243
281
|
|
244
282
|
# Stores the provided block to be run when the option name specified is
|
@@ -363,7 +401,7 @@ module Mongoid
|
|
363
401
|
# If the belongs_to association is the last part of the name, we will
|
364
402
|
# pass back the _id field.
|
365
403
|
#
|
366
|
-
# @param [ String
|
404
|
+
# @param [ String | Symbol ] name The name to get.
|
367
405
|
# @param [ Hash ] relations The associations.
|
368
406
|
# @param [ Hash ] alaiased_fields The aliased fields.
|
369
407
|
# @param [ Hash ] alaiased_associations The aliased associations.
|
@@ -372,12 +410,12 @@ module Mongoid
|
|
372
410
|
#
|
373
411
|
# @api private
|
374
412
|
def database_field_name(name, relations, aliased_fields, aliased_associations)
|
413
|
+
return '' unless name.present?
|
414
|
+
|
375
415
|
if Mongoid.broken_alias_handling
|
376
|
-
return nil unless name
|
377
416
|
normalized = name.to_s
|
378
417
|
aliased_fields[normalized] || normalized
|
379
418
|
else
|
380
|
-
return nil unless name.present?
|
381
419
|
key = name.to_s
|
382
420
|
segment, remaining = key.split('.', 2)
|
383
421
|
|
@@ -422,7 +460,7 @@ module Mongoid
|
|
422
460
|
# Get the name of the provided field as it is stored in the database.
|
423
461
|
# Used in determining if the field is aliased or not.
|
424
462
|
#
|
425
|
-
# @param [ String
|
463
|
+
# @param [ String | Symbol ] name The name to get.
|
426
464
|
#
|
427
465
|
# @return [ String ] The name of the field as it's stored in the db.
|
428
466
|
def database_field_name(name)
|
@@ -474,7 +512,7 @@ module Mongoid
|
|
474
512
|
# @example Does this class use object ids?
|
475
513
|
# person.using_object_ids?
|
476
514
|
#
|
477
|
-
# @return [ true
|
515
|
+
# @return [ true | false ] If the class uses BSON::ObjectIds for the id.
|
478
516
|
def using_object_ids?
|
479
517
|
fields["_id"].object_id_field?
|
480
518
|
end
|
@@ -505,6 +543,8 @@ module Mongoid
|
|
505
543
|
# Model.add_defaults(field)
|
506
544
|
#
|
507
545
|
# @param [ Field ] field The field to add for.
|
546
|
+
#
|
547
|
+
# @api private
|
508
548
|
def add_defaults(field)
|
509
549
|
default, name = field.default_val, field.name.to_s
|
510
550
|
remove_defaults(name)
|
@@ -524,6 +564,8 @@ module Mongoid
|
|
524
564
|
#
|
525
565
|
# @param [ Symbol ] name The name of the field.
|
526
566
|
# @param [ Hash ] options The hash of options.
|
567
|
+
#
|
568
|
+
# @api private
|
527
569
|
def add_field(name, options = {})
|
528
570
|
aliased = options[:as]
|
529
571
|
aliased_fields[aliased.to_s] = name if aliased
|
@@ -551,6 +593,8 @@ module Mongoid
|
|
551
593
|
# # => "called"
|
552
594
|
#
|
553
595
|
# @param [ Field ] field the field to process
|
596
|
+
#
|
597
|
+
# @api private
|
554
598
|
def process_options(field)
|
555
599
|
field_options = field.options
|
556
600
|
|
@@ -573,6 +617,8 @@ module Mongoid
|
|
573
617
|
# @param [ Symbol ] name The name of the field.
|
574
618
|
# @param [ Symbol ] meth The name of the accessor.
|
575
619
|
# @param [ Hash ] options The options.
|
620
|
+
#
|
621
|
+
# @api private
|
576
622
|
def create_accessors(name, meth, options = {})
|
577
623
|
field = fields[name]
|
578
624
|
|
@@ -596,6 +642,8 @@ module Mongoid
|
|
596
642
|
# @param [ String ] name The name of the attribute.
|
597
643
|
# @param [ String ] meth The name of the method.
|
598
644
|
# @param [ Field ] field The field.
|
645
|
+
#
|
646
|
+
# @api private
|
599
647
|
def create_field_getter(name, meth, field)
|
600
648
|
generated_methods.module_eval do
|
601
649
|
re_define_method(meth) do
|
@@ -603,9 +651,7 @@ module Mongoid
|
|
603
651
|
if lazy_settable?(field, raw)
|
604
652
|
write_attribute(name, field.eval_default(self))
|
605
653
|
else
|
606
|
-
|
607
|
-
attribute_will_change!(name) if value.resizable?
|
608
|
-
value
|
654
|
+
process_raw_attribute(name.to_s, raw, field)
|
609
655
|
end
|
610
656
|
end
|
611
657
|
end
|
@@ -620,6 +666,8 @@ module Mongoid
|
|
620
666
|
#
|
621
667
|
# @param [ String ] name The name of the attribute.
|
622
668
|
# @param [ String ] meth The name of the method.
|
669
|
+
#
|
670
|
+
# @api private
|
623
671
|
def create_field_getter_before_type_cast(name, meth)
|
624
672
|
generated_methods.module_eval do
|
625
673
|
re_define_method("#{meth}_before_type_cast") do
|
@@ -640,6 +688,8 @@ module Mongoid
|
|
640
688
|
# @param [ String ] name The name of the attribute.
|
641
689
|
# @param [ String ] meth The name of the method.
|
642
690
|
# @param [ Field ] field The field.
|
691
|
+
#
|
692
|
+
# @api private
|
643
693
|
def create_field_setter(name, meth, field)
|
644
694
|
generated_methods.module_eval do
|
645
695
|
re_define_method("#{meth}=") do |value|
|
@@ -659,6 +709,8 @@ module Mongoid
|
|
659
709
|
#
|
660
710
|
# @param [ String ] name The name of the attribute.
|
661
711
|
# @param [ String ] meth The name of the method.
|
712
|
+
#
|
713
|
+
# @api private
|
662
714
|
def create_field_check(name, meth)
|
663
715
|
generated_methods.module_eval do
|
664
716
|
re_define_method("#{meth}?") do
|
@@ -675,13 +727,15 @@ module Mongoid
|
|
675
727
|
#
|
676
728
|
# @param [ String ] name The name of the attribute.
|
677
729
|
# @param [ String ] meth The name of the method.
|
730
|
+
#
|
731
|
+
# @api private
|
678
732
|
def create_translations_getter(name, meth)
|
679
733
|
generated_methods.module_eval do
|
680
|
-
re_define_method("#{meth}
|
734
|
+
re_define_method("#{meth}#{TRANSLATIONS_SFX}") do
|
681
735
|
attributes[name] ||= {}
|
682
736
|
attributes[name].with_indifferent_access
|
683
737
|
end
|
684
|
-
alias_method :"#{meth}_t", :"#{meth}
|
738
|
+
alias_method :"#{meth}_t", :"#{meth}#{TRANSLATIONS_SFX}"
|
685
739
|
end
|
686
740
|
end
|
687
741
|
|
@@ -693,18 +747,18 @@ module Mongoid
|
|
693
747
|
# @param [ String ] name The name of the attribute.
|
694
748
|
# @param [ String ] meth The name of the method.
|
695
749
|
# @param [ Field ] field The field.
|
750
|
+
#
|
751
|
+
# @api private
|
696
752
|
def create_translations_setter(name, meth, field)
|
697
753
|
generated_methods.module_eval do
|
698
|
-
re_define_method("#{meth}
|
754
|
+
re_define_method("#{meth}#{TRANSLATIONS_SFX}=") do |value|
|
699
755
|
attribute_will_change!(name)
|
700
|
-
|
701
|
-
|
702
|
-
field.type.mongoize(_value)
|
703
|
-
end
|
756
|
+
value&.transform_values! do |_value|
|
757
|
+
field.type.mongoize(_value)
|
704
758
|
end
|
705
759
|
attributes[name] = value
|
706
760
|
end
|
707
|
-
alias_method :"#{meth}_t=", :"#{meth}
|
761
|
+
alias_method :"#{meth}_t=", :"#{meth}#{TRANSLATIONS_SFX}="
|
708
762
|
end
|
709
763
|
end
|
710
764
|
|
@@ -714,6 +768,8 @@ module Mongoid
|
|
714
768
|
# Person.generated_methods
|
715
769
|
#
|
716
770
|
# @return [ Module ] The module of generated methods.
|
771
|
+
#
|
772
|
+
# @api private
|
717
773
|
def generated_methods
|
718
774
|
@generated_methods ||= begin
|
719
775
|
mod = Module.new
|
@@ -728,27 +784,85 @@ module Mongoid
|
|
728
784
|
# Model.remove_defaults(name)
|
729
785
|
#
|
730
786
|
# @param [ String ] name The field name.
|
787
|
+
#
|
788
|
+
# @api private
|
731
789
|
def remove_defaults(name)
|
732
790
|
pre_processed_defaults.delete_one(name)
|
733
791
|
post_processed_defaults.delete_one(name)
|
734
792
|
end
|
735
793
|
|
794
|
+
# Create a field for the given name and options.
|
795
|
+
#
|
796
|
+
# @param [ Symbol ] name The name of the field.
|
797
|
+
# @param [ Hash ] options The hash of options.
|
798
|
+
#
|
799
|
+
# @return [ Field ] The created field.
|
800
|
+
#
|
801
|
+
# @api private
|
736
802
|
def field_for(name, options)
|
737
803
|
opts = options.merge(klass: self)
|
738
|
-
|
739
|
-
opts[:type] = type_mapping || unmapped_type(options)
|
804
|
+
opts[:type] = retrieve_and_validate_type(name, options[:type])
|
740
805
|
return Fields::Localized.new(name, opts) if options[:localize]
|
741
806
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
742
807
|
Fields::Standard.new(name, opts)
|
743
808
|
end
|
744
809
|
|
745
|
-
|
746
|
-
|
810
|
+
# Get the class for the given type.
|
811
|
+
#
|
812
|
+
# @param [ Symbol ] name The name of the field.
|
813
|
+
# @param [ Symbol | Class ] type The type of the field.
|
814
|
+
#
|
815
|
+
# @return [ Class ] The type of the field.
|
816
|
+
#
|
817
|
+
# @raises [ Mongoid::Errors::InvalidFieldType ] if given an invalid field
|
818
|
+
# type.
|
819
|
+
#
|
820
|
+
# @api private
|
821
|
+
def retrieve_and_validate_type(name, type)
|
822
|
+
result = TYPE_MAPPINGS[type] || unmapped_type(type)
|
823
|
+
raise Errors::InvalidFieldType.new(self, name, type) if !result.is_a?(Class)
|
824
|
+
|
825
|
+
if unsupported_type?(result)
|
826
|
+
warn_message = "Using #{result} as the field type is not supported. "
|
827
|
+
if result == BSON::Decimal128
|
828
|
+
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.'
|
829
|
+
else
|
830
|
+
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.'
|
831
|
+
end
|
832
|
+
Mongoid.logger.warn(warn_message)
|
833
|
+
end
|
834
|
+
|
835
|
+
result
|
836
|
+
end
|
837
|
+
|
838
|
+
# Returns the type of the field if the type was not in the TYPE_MAPPINGS
|
839
|
+
# hash.
|
840
|
+
#
|
841
|
+
# @param [ Symbol | Class ] type The type of the field.
|
842
|
+
#
|
843
|
+
# @return [ Class ] The type of the field.
|
844
|
+
#
|
845
|
+
# @api private
|
846
|
+
def unmapped_type(type)
|
847
|
+
if "Boolean" == type.to_s
|
747
848
|
Mongoid::Boolean
|
748
849
|
else
|
749
|
-
|
850
|
+
type || Object
|
750
851
|
end
|
751
852
|
end
|
853
|
+
|
854
|
+
# Queries whether or not the given type is permitted as a declared field
|
855
|
+
# type.
|
856
|
+
#
|
857
|
+
# @param [ Class ] type The type to query
|
858
|
+
#
|
859
|
+
# @return [ true | false ] whether or not the type is supported
|
860
|
+
#
|
861
|
+
# @api private
|
862
|
+
def unsupported_type?(type)
|
863
|
+
return !Mongoid::Config.allow_bson5_decimal128? if type == BSON::Decimal128
|
864
|
+
INVALID_BSON_CLASSES.include?(type)
|
865
|
+
end
|
752
866
|
end
|
753
867
|
end
|
754
868
|
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
|