mongoid 7.5.4 → 8.1.9
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 +32 -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 +11 -6
- 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 +48 -39
- 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 +135 -36
- data/lib/mongoid/equality.rb +9 -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 +187 -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 +9 -2
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +3 -4
- data/lib/mongoid/traversable.rb +41 -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 +26 -3
- 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/association_spec.rb +60 -0
- 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/readonly_spec.rb +19 -0
- 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 +107 -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 +59 -41
- data/spec/mongoid/equality_spec.rb +6 -0
- 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 +904 -22
- data/spec/mongoid/interceptable_spec_models.rb +189 -22
- 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/created_spec.rb +23 -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 +98 -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
@@ -13,7 +13,7 @@ module Mongoid
|
|
13
13
|
# @example Reset the given counter cache
|
14
14
|
# post.reset_counters(:comments)
|
15
15
|
#
|
16
|
-
# @param [ Symbol
|
16
|
+
# @param [ Symbol... ] *counters One or more counter caches to reset.
|
17
17
|
def reset_counters(*counters)
|
18
18
|
self.class.with(persistence_context) do |_class|
|
19
19
|
_class.reset_counters(self, *counters)
|
@@ -30,7 +30,7 @@ module Mongoid
|
|
30
30
|
# Post.reset_counters('50e0edd97c71c17ea9000001', :comments)
|
31
31
|
#
|
32
32
|
# @param [ String ] id The id of the object that will be reset.
|
33
|
-
# @param [ Symbol
|
33
|
+
# @param [ Symbol... ] *counters One or more counter caches to reset.
|
34
34
|
def reset_counters(id, *counters)
|
35
35
|
document = id.is_a?(Document) ? id : find(id)
|
36
36
|
counters.each do |name|
|
@@ -97,18 +97,18 @@ module Mongoid
|
|
97
97
|
|
98
98
|
association.inverse_class.tap do |klass|
|
99
99
|
klass.after_update do
|
100
|
-
|
101
|
-
foreign_key = association.foreign_key
|
100
|
+
foreign_key = association.foreign_key
|
102
101
|
|
103
|
-
|
104
|
-
|
102
|
+
if send("#{foreign_key}_previously_changed?")
|
103
|
+
original, current = send("#{foreign_key}_previous_change")
|
105
104
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
105
|
+
unless original.nil?
|
106
|
+
association.klass.with(persistence_context) do |_class|
|
107
|
+
_class.decrement_counter(cache_column, original)
|
110
108
|
end
|
109
|
+
end
|
111
110
|
|
111
|
+
if record = __send__(name)
|
112
112
|
unless current.nil?
|
113
113
|
record[cache_column] = (record[cache_column] || 0) + 1
|
114
114
|
record.class.with(record.persistence_context) do |_class|
|
@@ -85,7 +85,7 @@ module Mongoid
|
|
85
85
|
# loader.set_on_parent("foo", docs)
|
86
86
|
#
|
87
87
|
# @param [ ObjectId ] id parent`s id
|
88
|
-
# @param [ Document
|
88
|
+
# @param [ Document | Array ] element to push into the parent
|
89
89
|
def set_on_parent(id, element)
|
90
90
|
grouped_docs[id].each do |d|
|
91
91
|
set_relation(d, element)
|
@@ -140,7 +140,7 @@ module Mongoid
|
|
140
140
|
# loader.set_relation(doc, docs)
|
141
141
|
#
|
142
142
|
# @param [ Document ] doc The object to set the association on
|
143
|
-
# @param [ Document
|
143
|
+
# @param [ Document | Array ] element to set into the parent
|
144
144
|
def set_relation(doc, element)
|
145
145
|
doc.set_relation(@association.name, element) unless doc.blank?
|
146
146
|
end
|
@@ -21,17 +21,41 @@ module Mongoid
|
|
21
21
|
# @example Concat with other documents.
|
22
22
|
# person.posts.concat([ post_one, post_two ])
|
23
23
|
#
|
24
|
-
# @param [ Document
|
24
|
+
# @param [ Document... ] *args Any number of documents.
|
25
25
|
#
|
26
26
|
# @return [ Array<Document> ] The loaded docs.
|
27
27
|
def <<(*args)
|
28
28
|
docs = args.flatten
|
29
29
|
return concat(docs) if docs.size > 1
|
30
30
|
if doc = docs.first
|
31
|
-
append(doc)
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
append(doc) do
|
32
|
+
# We ignore the changes to the value for the foreign key in the
|
33
|
+
# changed_attributes hash in this block of code for two reasons:
|
34
|
+
#
|
35
|
+
# 1) The add_to_set method deletes the value for the foreign
|
36
|
+
# key in the changed_attributes hash, but if we enter this
|
37
|
+
# method with a value for the foreign key in the
|
38
|
+
# changed_attributes hash, then we want it to exist outside
|
39
|
+
# this method as well. It's used later on in the Syncable
|
40
|
+
# module to set the inverse foreign keys.
|
41
|
+
# 2) The reset_unloaded method accesses the value for the foreign
|
42
|
+
# key on _base, which causes it to get added to the
|
43
|
+
# changed_attributes hash. This happens because when reading
|
44
|
+
# a "resizable" attribute, it is automatically added to the
|
45
|
+
# changed_attributes hash. This is true only for the foreign
|
46
|
+
# key value for HABTM associations as the other associations
|
47
|
+
# use strings for their foreign key values. For consistency
|
48
|
+
# with the other associations, we ignore this addition to
|
49
|
+
# the changed_attributes hash.
|
50
|
+
# See MONGOID-4843 for a longer discussion about this.
|
51
|
+
reset_foreign_key_changes do
|
52
|
+
_base.add_to_set(foreign_key => doc.public_send(_association.primary_key))
|
53
|
+
|
54
|
+
if child_persistable?(doc)
|
55
|
+
doc.save
|
56
|
+
end
|
57
|
+
reset_unloaded
|
58
|
+
end
|
35
59
|
end
|
36
60
|
end
|
37
61
|
unsynced(_base, foreign_key) and self
|
@@ -81,12 +105,13 @@ module Mongoid
|
|
81
105
|
#
|
82
106
|
# @return [ Document ] The new document.
|
83
107
|
def build(attributes = {}, type = nil)
|
84
|
-
doc = Factory.
|
85
|
-
_base.public_send(foreign_key).push(doc.public_send(_association.primary_key))
|
108
|
+
doc = Factory.execute_build(type || klass, attributes, execute_callbacks: false)
|
86
109
|
append(doc)
|
87
110
|
doc.apply_post_processed_defaults
|
111
|
+
_base.public_send(foreign_key).push(doc.public_send(_association.primary_key))
|
88
112
|
unsynced(doc, inverse_foreign_key)
|
89
113
|
yield(doc) if block_given?
|
114
|
+
doc.run_pending_callbacks
|
90
115
|
doc
|
91
116
|
end
|
92
117
|
|
@@ -112,6 +137,10 @@ module Mongoid
|
|
112
137
|
doc
|
113
138
|
end
|
114
139
|
|
140
|
+
# Mongoid::Extensions::Array defines Array#delete_one, so we need
|
141
|
+
# to make sure that method behaves reasonably on proxies, too.
|
142
|
+
alias delete_one delete
|
143
|
+
|
115
144
|
# Removes all associations between the base document and the target
|
116
145
|
# documents by deleting the foreign keys and the references, orphaning
|
117
146
|
# the target documents in the process.
|
@@ -178,6 +207,7 @@ module Mongoid
|
|
178
207
|
push(replacement.compact.uniq)
|
179
208
|
else
|
180
209
|
reset_unloaded
|
210
|
+
clear_foreign_key_changes
|
181
211
|
end
|
182
212
|
self
|
183
213
|
end
|
@@ -195,6 +225,32 @@ module Mongoid
|
|
195
225
|
|
196
226
|
private
|
197
227
|
|
228
|
+
# Clears the foreign key from the changed_attributes hash.
|
229
|
+
#
|
230
|
+
# This is, in general, used to clear the foreign key from the
|
231
|
+
# changed_attributes hash for consistency with the other referenced
|
232
|
+
# associations.
|
233
|
+
#
|
234
|
+
# @api private
|
235
|
+
def clear_foreign_key_changes
|
236
|
+
_base.changed_attributes.delete(foreign_key)
|
237
|
+
end
|
238
|
+
|
239
|
+
# Reset the value in the changed_attributes hash for the foreign key
|
240
|
+
# to its value before executing the given block.
|
241
|
+
#
|
242
|
+
# @api private
|
243
|
+
def reset_foreign_key_changes
|
244
|
+
if _base.changed_attributes.key?(foreign_key)
|
245
|
+
fk = _base.changed_attributes[foreign_key].dup
|
246
|
+
yield if block_given?
|
247
|
+
_base.changed_attributes[foreign_key] = fk
|
248
|
+
else
|
249
|
+
yield if block_given?
|
250
|
+
clear_foreign_key_changes
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
198
254
|
# Appends the document to the target array, updating the index on the
|
199
255
|
# document at the same time.
|
200
256
|
#
|
@@ -203,11 +259,12 @@ module Mongoid
|
|
203
259
|
#
|
204
260
|
# @param [ Document ] document The document to append to the target.
|
205
261
|
def append(document)
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
262
|
+
execute_callbacks_around(:add, document) do
|
263
|
+
_target.push(document)
|
264
|
+
characterize_one(document)
|
265
|
+
bind_one(document)
|
266
|
+
yield if block_given?
|
267
|
+
end
|
211
268
|
end
|
212
269
|
|
213
270
|
# Instantiate the binding associated with this association.
|
@@ -229,7 +286,7 @@ module Mongoid
|
|
229
286
|
#
|
230
287
|
# @param [ Document ] doc The document.
|
231
288
|
#
|
232
|
-
# @return [ true
|
289
|
+
# @return [ true | false ] If the document can be persisted.
|
233
290
|
def child_persistable?(doc)
|
234
291
|
(persistable? || _creating?) &&
|
235
292
|
!(doc.persisted? && _association.forced_nil_inverse?)
|
@@ -78,7 +78,7 @@ module Mongoid
|
|
78
78
|
|
79
79
|
# Are ids only saved on this side of the association?
|
80
80
|
#
|
81
|
-
# @return [ true
|
81
|
+
# @return [ true | false ] Whether this association has a forced nil inverse.
|
82
82
|
def forced_nil_inverse?
|
83
83
|
@forced_nil_inverse ||= @options.key?(:inverse_of) && !@options[:inverse_of]
|
84
84
|
end
|
@@ -119,6 +119,8 @@ module Mongoid
|
|
119
119
|
@options[:inverse_foreign_key]
|
120
120
|
elsif @options.key?(:inverse_of)
|
121
121
|
inverse_of ? "#{inverse_of.to_s.singularize}#{FOREIGN_KEY_SUFFIX}" : nil
|
122
|
+
elsif inv = inverse_association&.foreign_key
|
123
|
+
inv
|
122
124
|
else
|
123
125
|
"#{inverse_class_name.demodulize.underscore}#{FOREIGN_KEY_SUFFIX}"
|
124
126
|
end
|
@@ -129,7 +131,7 @@ module Mongoid
|
|
129
131
|
#
|
130
132
|
# @param [ Document ] doc The document to be bound.
|
131
133
|
#
|
132
|
-
# @return [ true
|
134
|
+
# @return [ true | false ] Whether the document can be bound.
|
133
135
|
def bindable?(doc)
|
134
136
|
forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
|
135
137
|
end
|
@@ -219,7 +221,7 @@ module Mongoid
|
|
219
221
|
def synced_save
|
220
222
|
assoc = self
|
221
223
|
inverse_class.set_callback(
|
222
|
-
:
|
224
|
+
:persist_parent,
|
223
225
|
:after,
|
224
226
|
if: ->(doc){ doc._syncable?(assoc) }
|
225
227
|
) do |doc|
|
@@ -228,6 +230,7 @@ module Mongoid
|
|
228
230
|
end
|
229
231
|
|
230
232
|
def create_foreign_key_field!
|
233
|
+
inverse_class.aliased_associations[foreign_key] = name.to_s
|
231
234
|
@owner_class.field(
|
232
235
|
foreign_key,
|
233
236
|
type: FOREIGN_KEY_FIELD_TYPE,
|
@@ -28,7 +28,7 @@ module Mongoid
|
|
28
28
|
#
|
29
29
|
# @param [ Enumerable ] other The other enumerable.
|
30
30
|
#
|
31
|
-
# @return [ true
|
31
|
+
# @return [ true | false ] If the objects are equal.
|
32
32
|
def ==(other)
|
33
33
|
return false unless other.respond_to?(:entries)
|
34
34
|
entries == other.entries
|
@@ -42,7 +42,7 @@ module Mongoid
|
|
42
42
|
#
|
43
43
|
# @param [ Object ] other The object to check.
|
44
44
|
#
|
45
|
-
# @return [ true
|
45
|
+
# @return [ true | false ] If the objects are equal in a case.
|
46
46
|
def ===(other)
|
47
47
|
return false unless other.respond_to?(:entries)
|
48
48
|
if Mongoid.legacy_triple_equals
|
@@ -192,7 +192,7 @@ module Mongoid
|
|
192
192
|
# @example Is the enumerable empty?
|
193
193
|
# enumerable.empty?
|
194
194
|
#
|
195
|
-
# @return [ true
|
195
|
+
# @return [ true | false ] If the enumerable is empty.
|
196
196
|
def empty?
|
197
197
|
if _loaded?
|
198
198
|
in_memory.empty?
|
@@ -215,16 +215,16 @@ module Mongoid
|
|
215
215
|
# completely depending on whether it is iterated to completion.
|
216
216
|
#
|
217
217
|
# This method can take a parameter and a block. The behavior with
|
218
|
-
# either the
|
218
|
+
# either the parameter or the block is delegated to the standard
|
219
219
|
# library Enumerable module.
|
220
220
|
#
|
221
221
|
# Note that when Enumerable's any? method is invoked with both
|
222
222
|
# a block and a pattern, it only uses the pattern.
|
223
223
|
#
|
224
|
-
# @param [ Object ]
|
224
|
+
# @param [ Object... ] *args The condition that documents
|
225
225
|
# must satisfy. See Enumerable documentation for details.
|
226
226
|
#
|
227
|
-
# @return [ true
|
227
|
+
# @return [ true | false ] If the association has any documents.
|
228
228
|
def any?(*args)
|
229
229
|
return super if args.any? || block_given?
|
230
230
|
|
@@ -240,19 +240,15 @@ module Mongoid
|
|
240
240
|
# @note Automatically adding a sort on _id when no other sort is
|
241
241
|
# defined on the criteria has the potential to cause bad performance issues.
|
242
242
|
# If you experience unexpected poor performance when using #first or #last,
|
243
|
-
# use
|
244
|
-
# Be aware that #
|
243
|
+
# use #take instead.
|
244
|
+
# Be aware that #take won't guarantee order.
|
245
245
|
#
|
246
|
-
# @param [ Integer
|
247
|
-
# return, or a hash of options.
|
248
|
-
#
|
249
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
250
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
246
|
+
# @param [ Integer ] limit The number of documents to return.
|
251
247
|
#
|
252
248
|
# @return [ Document ] The first document found.
|
253
|
-
def first(
|
249
|
+
def first(limit = nil)
|
254
250
|
_loaded.try(:values).try(:first) ||
|
255
|
-
_added[(ul = _unloaded.try(:first,
|
251
|
+
_added[(ul = _unloaded.try(:first, limit)).try(:_id)] ||
|
256
252
|
ul ||
|
257
253
|
_added.values.try(:first)
|
258
254
|
end
|
@@ -265,7 +261,7 @@ module Mongoid
|
|
265
261
|
# @example Initialize the enumerable with an array.
|
266
262
|
# Enumerable.new([ post ])
|
267
263
|
#
|
268
|
-
# @param [ Criteria
|
264
|
+
# @param [ Criteria | Array<Document> ] target The wrapped object.
|
269
265
|
def initialize(target, base = nil, association = nil)
|
270
266
|
@_base = base
|
271
267
|
@_association = association
|
@@ -287,7 +283,7 @@ module Mongoid
|
|
287
283
|
#
|
288
284
|
# @param [ Document ] doc The document to check.
|
289
285
|
#
|
290
|
-
# @return [ true
|
286
|
+
# @return [ true | false ] If the document is in the target.
|
291
287
|
def include?(doc)
|
292
288
|
return super unless _unloaded
|
293
289
|
_unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
|
@@ -329,20 +325,16 @@ module Mongoid
|
|
329
325
|
# @note Automatically adding a sort on _id when no other sort is
|
330
326
|
# defined on the criteria has the potential to cause bad performance issues.
|
331
327
|
# If you experience unexpected poor performance when using #first or #last,
|
332
|
-
# use
|
333
|
-
# Be aware that #
|
334
|
-
#
|
335
|
-
# @param [ Integer | Hash ] limit_or_opts The number of documents to
|
336
|
-
# return, or a hash of options.
|
328
|
+
# use #take instead.
|
329
|
+
# Be aware that #take won't guarantee order.
|
337
330
|
#
|
338
|
-
# @
|
339
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
331
|
+
# @param [ Integer ] limit The number of documents to return.
|
340
332
|
#
|
341
333
|
# @return [ Document ] The last document found.
|
342
|
-
def last(
|
334
|
+
def last(limit = nil)
|
343
335
|
_added.values.try(:last) ||
|
344
336
|
_loaded.try(:values).try(:last) ||
|
345
|
-
_added[(ul = _unloaded.try(:last,
|
337
|
+
_added[(ul = _unloaded.try(:last, limit)).try(:_id)] ||
|
346
338
|
ul
|
347
339
|
end
|
348
340
|
|
@@ -360,7 +352,7 @@ module Mongoid
|
|
360
352
|
# @example Is the enumerable _loaded?
|
361
353
|
# enumerable._loaded?
|
362
354
|
#
|
363
|
-
# @return [ true
|
355
|
+
# @return [ true | false ] If the enumerable has been _loaded.
|
364
356
|
def _loaded?
|
365
357
|
!!@executed
|
366
358
|
end
|
@@ -413,11 +405,11 @@ module Mongoid
|
|
413
405
|
# @example Does the enumerable respond to the method?
|
414
406
|
# enumerable.respond_to?(:sum)
|
415
407
|
#
|
416
|
-
# @param [ String
|
417
|
-
# @param [ true
|
408
|
+
# @param [ String | Symbol ] name The name of the method.
|
409
|
+
# @param [ true | false ] include_private Whether to include private
|
418
410
|
# methods.
|
419
411
|
#
|
420
|
-
# @return [ true
|
412
|
+
# @return [ true | false ] Whether the enumerable responds.
|
421
413
|
def respond_to?(name, include_private = false)
|
422
414
|
[].respond_to?(name, include_private) || super
|
423
415
|
end
|
@@ -25,7 +25,7 @@ module Mongoid
|
|
25
25
|
# @example Concat with other documents.
|
26
26
|
# person.posts.concat([ post_one, post_two ])
|
27
27
|
#
|
28
|
-
# @param [ Document
|
28
|
+
# @param [ Document... ] *args Any number of documents.
|
29
29
|
#
|
30
30
|
# @return [ Array<Document> ] The loaded docs.
|
31
31
|
def <<(*args)
|
@@ -71,10 +71,11 @@ module Mongoid
|
|
71
71
|
#
|
72
72
|
# @return [ Document ] The new document.
|
73
73
|
def build(attributes = {}, type = nil)
|
74
|
-
doc = Factory.
|
74
|
+
doc = Factory.execute_build(type || klass, attributes, execute_callbacks: false)
|
75
75
|
append(doc)
|
76
76
|
doc.apply_post_processed_defaults
|
77
77
|
yield(doc) if block_given?
|
78
|
+
doc.run_pending_callbacks
|
78
79
|
doc.run_callbacks(:build) { doc }
|
79
80
|
doc
|
80
81
|
end
|
@@ -92,16 +93,22 @@ module Mongoid
|
|
92
93
|
#
|
93
94
|
# @return [ Document ] The matching document.
|
94
95
|
def delete(document)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
96
|
+
execute_callbacks_around(:remove, document) do
|
97
|
+
_target.delete(document) do |doc|
|
98
|
+
if doc
|
99
|
+
unbind_one(doc)
|
100
|
+
cascade!(doc) if !_assigning?
|
101
|
+
end
|
102
|
+
end.tap do
|
103
|
+
reset_unloaded
|
100
104
|
end
|
101
|
-
execute_callback :after_remove, doc
|
102
105
|
end
|
103
106
|
end
|
104
107
|
|
108
|
+
# Mongoid::Extensions::Array defines Array#delete_one, so we need
|
109
|
+
# to make sure that method behaves reasonably on proxies, too.
|
110
|
+
alias delete_one delete
|
111
|
+
|
105
112
|
# Deletes all related documents from the database given the supplied
|
106
113
|
# conditions.
|
107
114
|
#
|
@@ -165,9 +172,18 @@ module Mongoid
|
|
165
172
|
# @example Are there persisted documents?
|
166
173
|
# person.posts.exists?
|
167
174
|
#
|
168
|
-
# @
|
169
|
-
|
170
|
-
|
175
|
+
# @param [ :none | nil | false | Hash | Object ] id_or_conditions
|
176
|
+
# When :none (the default), returns true if any persisted
|
177
|
+
# documents exist in the association. When nil or false, this
|
178
|
+
# will always return false. When a Hash is given, this queries
|
179
|
+
# the documents in the association for those that match the given
|
180
|
+
# conditions, and returns true if any match. Any other argument is
|
181
|
+
# interpreted as an id, and queries for the existence of documents
|
182
|
+
# in the association with a matching _id.
|
183
|
+
#
|
184
|
+
# @return [ true | false ] True is persisted documents exist, false if not.
|
185
|
+
def exists?(id_or_conditions = :none)
|
186
|
+
criteria.exists?(id_or_conditions)
|
171
187
|
end
|
172
188
|
|
173
189
|
# Find the matching document on the association, either based on id or
|
@@ -181,6 +197,9 @@ module Mongoid
|
|
181
197
|
# of those found by the current Criteria object for which the block
|
182
198
|
# returns a truthy value.
|
183
199
|
#
|
200
|
+
# @note Each argument can be an individual id, an array of ids or
|
201
|
+
# a nested array. Each array will be flattened.
|
202
|
+
#
|
184
203
|
# @example Find by an id.
|
185
204
|
# person.posts.find(BSON::ObjectId.new)
|
186
205
|
#
|
@@ -193,7 +212,7 @@ module Mongoid
|
|
193
212
|
# @note This will keep matching documents in memory for iteration
|
194
213
|
# later.
|
195
214
|
#
|
196
|
-
# @param [
|
215
|
+
# @param [ [ Object | Array<Object> ]... ] *args The ids.
|
197
216
|
# @param [ Proc ] block Optional block to pass.
|
198
217
|
#
|
199
218
|
# @return [ Document | Array<Document> | nil ] A document or matching documents.
|
@@ -325,7 +344,7 @@ module Mongoid
|
|
325
344
|
# relation.with_add_callbacks(document, false)
|
326
345
|
#
|
327
346
|
# @param [ Document ] document The document to append to the target.
|
328
|
-
# @param [ true
|
347
|
+
# @param [ true | false ] already_related Whether the document is already related
|
329
348
|
# to the target.
|
330
349
|
def with_add_callbacks(document, already_related)
|
331
350
|
execute_callback :before_add, document unless already_related
|
@@ -340,7 +359,7 @@ module Mongoid
|
|
340
359
|
#
|
341
360
|
# @param [ Document ] document The document to possibly append to the target.
|
342
361
|
#
|
343
|
-
# @return [ true
|
362
|
+
# @return [ true | false ] Whether the document is already related to the base and the
|
344
363
|
# association is persisted.
|
345
364
|
def already_related?(document)
|
346
365
|
document.persisted? &&
|
@@ -388,7 +407,7 @@ module Mongoid
|
|
388
407
|
#
|
389
408
|
# @param [ Document ] document The document to cascade on.
|
390
409
|
#
|
391
|
-
# @return [ true
|
410
|
+
# @return [ true | false ] If the association is destructive.
|
392
411
|
def cascade!(document)
|
393
412
|
if persistable?
|
394
413
|
case _association.dependent
|
@@ -407,11 +426,11 @@ module Mongoid
|
|
407
426
|
#
|
408
427
|
# If the method exists on the array, use the default proxy behavior.
|
409
428
|
#
|
410
|
-
# @param [ Symbol
|
411
|
-
# @param [
|
429
|
+
# @param [ Symbol | String ] name The name of the method.
|
430
|
+
# @param [ Object... ] *args The method args
|
412
431
|
# @param [ Proc ] block Optional block to pass.
|
413
432
|
#
|
414
|
-
# @return [ Criteria
|
433
|
+
# @return [ Criteria | Object ] A Criteria or return value from the target.
|
415
434
|
ruby2_keywords def method_missing(name, *args, &block)
|
416
435
|
if _target.respond_to?(name)
|
417
436
|
_target.send(name, *args, &block)
|
@@ -447,7 +466,7 @@ module Mongoid
|
|
447
466
|
# @example Can we persist the association?
|
448
467
|
# relation.persistable?
|
449
468
|
#
|
450
|
-
# @return [ true
|
469
|
+
# @return [ true | false ] If the association is persistable.
|
451
470
|
def persistable?
|
452
471
|
!_binding? && (_creating? || _base.persisted? && !_building?)
|
453
472
|
end
|
@@ -469,8 +488,8 @@ module Mongoid
|
|
469
488
|
selector = conditions || {}
|
470
489
|
removed = klass.send(method, selector.merge!(criteria.selector))
|
471
490
|
_target.delete_if do |doc|
|
472
|
-
|
473
|
-
unbind_one(doc)
|
491
|
+
doc._matches?(selector).tap do |b|
|
492
|
+
unbind_one(doc) if b
|
474
493
|
end
|
475
494
|
end
|
476
495
|
removed
|
@@ -118,7 +118,7 @@ module Mongoid
|
|
118
118
|
#
|
119
119
|
# @note Only relevant for polymorphic associations.
|
120
120
|
#
|
121
|
-
# @return [ String
|
121
|
+
# @return [ String | nil ] The type field.
|
122
122
|
def type
|
123
123
|
@type ||= "#{as}_type" if polymorphic?
|
124
124
|
end
|
@@ -140,7 +140,7 @@ module Mongoid
|
|
140
140
|
|
141
141
|
# Is this association polymorphic?
|
142
142
|
#
|
143
|
-
# @return [ true
|
143
|
+
# @return [ true | false ] Whether this association is polymorphic.
|
144
144
|
def polymorphic?
|
145
145
|
@polymorphic ||= !!as
|
146
146
|
end
|
@@ -150,7 +150,7 @@ module Mongoid
|
|
150
150
|
#
|
151
151
|
# @param [ Document ] doc The document to be bound.
|
152
152
|
#
|
153
|
-
# @return [ true
|
153
|
+
# @return [ true | false ] Whether the document can be bound.
|
154
154
|
def bindable?(doc)
|
155
155
|
forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
|
156
156
|
end
|
@@ -60,7 +60,7 @@ module Mongoid
|
|
60
60
|
# @example Is the id acceptable?
|
61
61
|
# one.acceptable_id?
|
62
62
|
#
|
63
|
-
# @return [ true
|
63
|
+
# @return [ true | false ] If the id part of the logic will allow an update.
|
64
64
|
def acceptable_id?
|
65
65
|
id = convert_id(existing.class, attributes[:_id])
|
66
66
|
existing._id == id || id.nil? || (existing._id != id && update_only?)
|
@@ -71,7 +71,7 @@ module Mongoid
|
|
71
71
|
# @example Can the existing object be deleted?
|
72
72
|
# one.delete?
|
73
73
|
#
|
74
|
-
# @return [ true
|
74
|
+
# @return [ true | false ] If the association should be deleted.
|
75
75
|
def delete?
|
76
76
|
destroyable? && !attributes[:_id].nil?
|
77
77
|
end
|
@@ -81,7 +81,7 @@ module Mongoid
|
|
81
81
|
# @example Is the object destroyable?
|
82
82
|
# one.destroyable?({ :_destroy => "1" })
|
83
83
|
#
|
84
|
-
# @return [ true
|
84
|
+
# @return [ true | false ] If the association can potentially be
|
85
85
|
# destroyed.
|
86
86
|
def destroyable?
|
87
87
|
[ 1, "1", true, "true" ].include?(destroy) && allow_destroy?
|
@@ -92,7 +92,7 @@ module Mongoid
|
|
92
92
|
# @example Is the document to be replaced?
|
93
93
|
# one.replace?
|
94
94
|
#
|
95
|
-
# @return [ true
|
95
|
+
# @return [ true | false ] If the document should be replaced.
|
96
96
|
def replace?
|
97
97
|
!existing && !destroyable? && !attributes.blank?
|
98
98
|
end
|
@@ -102,7 +102,7 @@ module Mongoid
|
|
102
102
|
# @example Should the document be updated?
|
103
103
|
# one.update?
|
104
104
|
#
|
105
|
-
# @return [ true
|
105
|
+
# @return [ true | false ] If the object should have its attributes updated.
|
106
106
|
def update?
|
107
107
|
existing && !destroyable? && acceptable_id?
|
108
108
|
end
|
@@ -49,17 +49,14 @@ module Mongoid
|
|
49
49
|
#
|
50
50
|
# @return [ One ] The association.
|
51
51
|
def substitute(replacement)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
send(_association.dependent)
|
61
|
-
else
|
62
|
-
save if persisted?
|
52
|
+
if self != replacement
|
53
|
+
unbind_one
|
54
|
+
if persistable?
|
55
|
+
if _association.destructive?
|
56
|
+
send(_association.dependent)
|
57
|
+
else
|
58
|
+
save if persisted?
|
59
|
+
end
|
63
60
|
end
|
64
61
|
end
|
65
62
|
HasOne::Proxy.new(_base, replacement, _association) if replacement
|
@@ -82,7 +79,7 @@ module Mongoid
|
|
82
79
|
# @example Can we persist the association?
|
83
80
|
# relation.persistable?
|
84
81
|
#
|
85
|
-
# @return [ true
|
82
|
+
# @return [ true | false ] If the association is persistable.
|
86
83
|
def persistable?
|
87
84
|
_base.persisted? && !_binding? && !_building?
|
88
85
|
end
|