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
@@ -27,7 +27,7 @@ module Mongoid
|
|
27
27
|
# @example Parse the args.
|
28
28
|
# doc.parse_args(:name => "Joe")
|
29
29
|
#
|
30
|
-
# @param [
|
30
|
+
# @param [ Hash... ] *args The arguments.
|
31
31
|
#
|
32
32
|
# @return [ Array<Hash> ] The attributes and options.
|
33
33
|
def parse_args(*args)
|
@@ -46,9 +46,10 @@ module Mongoid
|
|
46
46
|
association.inverse_class.tap do |klass|
|
47
47
|
klass.re_define_method("build_#{association.name}") do |*args|
|
48
48
|
attributes, _options = parse_args(*args)
|
49
|
-
document = Factory.
|
49
|
+
document = Factory.execute_build(association.relation_class, attributes, execute_callbacks: false)
|
50
50
|
_building do
|
51
51
|
child = send("#{association.name}=", document)
|
52
|
+
child.run_pending_callbacks
|
52
53
|
child.run_callbacks(:build)
|
53
54
|
child
|
54
55
|
end
|
@@ -69,10 +70,11 @@ module Mongoid
|
|
69
70
|
association.inverse_class.tap do |klass|
|
70
71
|
klass.re_define_method("create_#{association.name}") do |*args|
|
71
72
|
attributes, _options = parse_args(*args)
|
72
|
-
document = Factory.
|
73
|
+
document = Factory.execute_build(association.relation_class, attributes, execute_callbacks: false)
|
73
74
|
doc = _assigning do
|
74
75
|
send("#{association.name}=", document)
|
75
76
|
end
|
77
|
+
doc.run_pending_callbacks
|
76
78
|
doc.save
|
77
79
|
save if new_record? && association.stores_foreign_key?
|
78
80
|
doc
|
@@ -20,13 +20,38 @@ module Mongoid
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
# Load the associations for the given documents. This will be done
|
24
|
+
# recursively to load the associations of the given documents'
|
25
|
+
# subdocuments.
|
26
|
+
#
|
27
|
+
# @param [ Array<Association> ] associations The associations to load.
|
28
|
+
# @param [ Array<Document> ] document The documents.
|
29
|
+
def preload(associations, docs)
|
30
|
+
assoc_map = associations.group_by(&:inverse_class_name)
|
31
|
+
docs_map = {}
|
32
|
+
queue = [ klass.to_s ]
|
33
|
+
|
34
|
+
# account for single-collection inheritance
|
35
|
+
queue.push(klass.root_class.to_s) if klass != klass.root_class
|
36
|
+
|
37
|
+
while klass = queue.shift
|
38
|
+
if as = assoc_map.delete(klass)
|
39
|
+
as.each do |assoc|
|
40
|
+
queue << assoc.class_name
|
41
|
+
|
42
|
+
# If this class is nested in the inclusion tree, only load documents
|
43
|
+
# for the association above it. If there is no parent association,
|
44
|
+
# we will include documents from the documents passed to this method.
|
45
|
+
ds = docs
|
46
|
+
if assoc.parent_inclusions.length > 0
|
47
|
+
ds = assoc.parent_inclusions.map{ |p| docs_map[p].to_a }.flatten
|
48
|
+
end
|
49
|
+
|
50
|
+
res = assoc.relation.eager_loader([assoc], ds).run
|
51
|
+
|
52
|
+
docs_map[assoc.name] ||= [].to_set
|
53
|
+
docs_map[assoc.name].merge(res)
|
54
|
+
end
|
30
55
|
end
|
31
56
|
end
|
32
57
|
end
|
@@ -50,7 +50,7 @@ module Mongoid
|
|
50
50
|
_unscoped.clear
|
51
51
|
end
|
52
52
|
|
53
|
-
# Batch remove the provided documents as a $pullAll.
|
53
|
+
# Batch remove the provided documents as a $pullAll or $pull.
|
54
54
|
#
|
55
55
|
# @example Batch remove the documents.
|
56
56
|
# batchable.batch_remove([ doc_one, doc_two ])
|
@@ -58,13 +58,36 @@ module Mongoid
|
|
58
58
|
# @param [ Array<Document> ] docs The docs to remove.
|
59
59
|
# @param [ Symbol ] method Delete or destroy.
|
60
60
|
def batch_remove(docs, method = :delete)
|
61
|
+
# If the _id is nil, we cannot use $pull and delete by searching for
|
62
|
+
# the id. Therefore we have to use pullAll with the documents'
|
63
|
+
# attributes.
|
61
64
|
removals = pre_process_batch_remove(docs, method)
|
65
|
+
pulls, pull_alls = removals.partition { |o| !o["_id"].nil? }
|
66
|
+
|
67
|
+
if !_base.persisted?
|
68
|
+
post_process_batch_remove(docs, method) unless docs.empty?
|
69
|
+
return reindex
|
70
|
+
end
|
71
|
+
|
62
72
|
if !docs.empty?
|
63
|
-
|
64
|
-
|
73
|
+
if !pulls.empty?
|
74
|
+
collection.find(selector).update_one(
|
75
|
+
positionally(selector, "$pull" => { path => { "_id" => { "$in" => pulls.pluck("_id") } } }),
|
65
76
|
session: _session
|
66
|
-
|
77
|
+
)
|
78
|
+
end
|
79
|
+
if !pull_alls.empty?
|
80
|
+
collection.find(selector).update_one(
|
81
|
+
positionally(selector, "$pullAll" => { path => pull_alls }),
|
82
|
+
session: _session
|
83
|
+
)
|
84
|
+
end
|
67
85
|
post_process_batch_remove(docs, method)
|
86
|
+
else
|
87
|
+
collection.find(selector).update_one(
|
88
|
+
positionally(selector, "$set" => { path => [] }),
|
89
|
+
session: _session
|
90
|
+
)
|
68
91
|
end
|
69
92
|
reindex
|
70
93
|
end
|
@@ -74,7 +97,7 @@ module Mongoid
|
|
74
97
|
# @example Batch replace the documents.
|
75
98
|
# batchable.batch_replace([ doc_one, doc_two ])
|
76
99
|
#
|
77
|
-
# @param [ Array<Document> ] docs The docs to replace with.
|
100
|
+
# @param [ Array<Document> | Array<Hash> ] docs The docs to replace with.
|
78
101
|
#
|
79
102
|
# @return [ Array<Hash> ] The inserts.
|
80
103
|
def batch_replace(docs)
|
@@ -90,7 +113,7 @@ module Mongoid
|
|
90
113
|
batch_remove(_target.dup)
|
91
114
|
end
|
92
115
|
elsif _target != docs
|
93
|
-
_base.delayed_atomic_sets.
|
116
|
+
_base.delayed_atomic_sets.delete(path) unless _assigning?
|
94
117
|
docs = normalize_docs(docs).compact
|
95
118
|
_target.clear and _unscoped.clear
|
96
119
|
_base.delayed_atomic_unsets.delete(path)
|
@@ -173,7 +196,7 @@ module Mongoid
|
|
173
196
|
# @example Can inserts be performed?
|
174
197
|
# batchable.insertable?
|
175
198
|
#
|
176
|
-
# @return [ true
|
199
|
+
# @return [ true | false ] If inserts can be performed.
|
177
200
|
def insertable?
|
178
201
|
persistable? && !_assigning? && inserts_valid
|
179
202
|
end
|
@@ -185,7 +208,7 @@ module Mongoid
|
|
185
208
|
# @example Are the inserts currently valid.
|
186
209
|
# batchable.inserts_valid
|
187
210
|
#
|
188
|
-
# @return [ true
|
211
|
+
# @return [ true | false ] If inserts are currently valid.
|
189
212
|
def inserts_valid
|
190
213
|
@inserts_valid
|
191
214
|
end
|
@@ -197,9 +220,9 @@ module Mongoid
|
|
197
220
|
# @example Set the flag.
|
198
221
|
# batchable.inserts_valid = true
|
199
222
|
#
|
200
|
-
# @param [ true
|
223
|
+
# @param [ true | false ] value The flag.
|
201
224
|
#
|
202
|
-
# @return [ true
|
225
|
+
# @return [ true | false ] The flag.
|
203
226
|
def inserts_valid=(value)
|
204
227
|
@inserts_valid = value
|
205
228
|
end
|
@@ -212,7 +235,7 @@ module Mongoid
|
|
212
235
|
# @example Normalize the docs.
|
213
236
|
# batchable.normalize_docs(docs)
|
214
237
|
#
|
215
|
-
# @param [ Array<
|
238
|
+
# @param [ Array<Document> | Array<Hash> ] docs The docs to normalize.
|
216
239
|
#
|
217
240
|
# @return [ Array<Document> ] The docs.
|
218
241
|
def normalize_docs(docs)
|
@@ -88,7 +88,7 @@ module Mongoid
|
|
88
88
|
# @example Determine the child name.
|
89
89
|
# Role.cyclic_child_name
|
90
90
|
#
|
91
|
-
# @param [ true
|
91
|
+
# @param [ true | false ] many Is the a many association?
|
92
92
|
#
|
93
93
|
# @return [ String ] "child_" plus the class name underscored in
|
94
94
|
# singular or plural form.
|
@@ -19,12 +19,14 @@ module Mongoid
|
|
19
19
|
# name.person.bind(:continue => true)
|
20
20
|
# name.person = Person.new
|
21
21
|
def bind_one
|
22
|
-
_base._association = _association.inverse_association(_target) unless _base._association
|
23
|
-
_base.parentize(_target)
|
24
22
|
binding do
|
23
|
+
check_polymorphic_inverses!(_target)
|
24
|
+
_base._association = _association.inverse_association(_target) unless _base._association
|
25
|
+
_base.parentize(_target)
|
25
26
|
if _base.embedded_many?
|
26
27
|
_target.do_or_do_not(_association.inverse(_target)).push(_base)
|
27
28
|
else
|
29
|
+
remove_associated(_target)
|
28
30
|
_target.do_or_do_not(_association.inverse_setter(_target), _base)
|
29
31
|
end
|
30
32
|
end
|
@@ -45,6 +47,26 @@ module Mongoid
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Check for problems with multiple inverse definitions.
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
#
|
57
|
+
# @example Check for inverses errors.
|
58
|
+
# binding.check_inverses!(doc)
|
59
|
+
#
|
60
|
+
# @param [ Document ] doc The document to check.
|
61
|
+
def check_polymorphic_inverses!(doc)
|
62
|
+
if inverses = _association.inverses(doc)
|
63
|
+
if inverses.length > 1
|
64
|
+
raise Errors::InvalidSetPolymorphicRelation.new(
|
65
|
+
_association.name, _base.class.name, _target.class.name
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
48
70
|
end
|
49
71
|
end
|
50
72
|
end
|
@@ -15,8 +15,8 @@ module Mongoid
|
|
15
15
|
# @example Build the document.
|
16
16
|
# Builder.new(meta, attrs).build
|
17
17
|
#
|
18
|
-
# @param [
|
19
|
-
# @param [
|
18
|
+
# @param [ Document ] base The object.
|
19
|
+
# @param [ Document | Hash ] object The parent hash or document.
|
20
20
|
# @param [ String ] type Not used in this context.
|
21
21
|
# @param [ Hash ] selected_fields Fields which were retrieved via
|
22
22
|
# #only. If selected_fields are specified, fields not listed in it
|
@@ -30,9 +30,9 @@ module Mongoid
|
|
30
30
|
# @example Substitute the new document.
|
31
31
|
# person.name.substitute(new_name)
|
32
32
|
#
|
33
|
-
# @param [ Document ] replacement A document to replace the target.
|
33
|
+
# @param [ Document | Hash ] replacement A document to replace the target.
|
34
34
|
#
|
35
|
-
# @return [ Document
|
35
|
+
# @return [ Document | nil ] The association or nil.
|
36
36
|
def substitute(replacement)
|
37
37
|
unbind_one
|
38
38
|
unless replacement
|
@@ -40,6 +40,7 @@ module Mongoid
|
|
40
40
|
return nil
|
41
41
|
end
|
42
42
|
_base.new_record = true
|
43
|
+
replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
|
43
44
|
self._target = replacement
|
44
45
|
bind_one
|
45
46
|
self
|
@@ -74,7 +75,7 @@ module Mongoid
|
|
74
75
|
# @example Can we persist the association?
|
75
76
|
# relation.persistable?
|
76
77
|
#
|
77
|
-
# @return [ true
|
78
|
+
# @return [ true | false ] If the association is persistable.
|
78
79
|
def persistable?
|
79
80
|
_target.persisted? && !_binding? && !_building?
|
80
81
|
end
|
@@ -75,7 +75,7 @@ module Mongoid
|
|
75
75
|
|
76
76
|
# Is this association polymorphic?
|
77
77
|
#
|
78
|
-
# @return [ true
|
78
|
+
# @return [ true | false ] Whether this association is polymorphic.
|
79
79
|
def polymorphic?
|
80
80
|
!!@options[:polymorphic]
|
81
81
|
end
|
@@ -114,7 +114,8 @@ module Mongoid
|
|
114
114
|
rel.as == name &&
|
115
115
|
rel.relation_class_name == inverse_class_name
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
|
+
matches.map { |m| m.name }
|
118
119
|
end
|
119
120
|
end
|
120
121
|
|
@@ -17,8 +17,9 @@ module Mongoid
|
|
17
17
|
# @example Build the documents.
|
18
18
|
# Builder.new(meta, attrs).build
|
19
19
|
#
|
20
|
-
# @param [
|
21
|
-
# @param [
|
20
|
+
# @param [ Document ] base The base object.
|
21
|
+
# @param [ Array<Document> | Array<Hash> ] object The object to use
|
22
|
+
# to build the association.
|
22
23
|
# @param [ String ] type Not used in this context.
|
23
24
|
# @param [ Hash ] selected_fields Fields which were retrieved via
|
24
25
|
# #only. If selected_fields are specified, fields not listed in it
|
@@ -31,7 +32,7 @@ module Mongoid
|
|
31
32
|
docs = []
|
32
33
|
object.each do |attrs|
|
33
34
|
if _loading? && base.persisted?
|
34
|
-
docs.push(Factory.
|
35
|
+
docs.push(Factory.execute_from_db(klass, attrs, nil, selected_fields, execute_callbacks: false))
|
35
36
|
else
|
36
37
|
docs.push(Factory.build(klass, attrs))
|
37
38
|
end
|
@@ -19,7 +19,7 @@ module Mongoid
|
|
19
19
|
# @example Push a document.
|
20
20
|
# person.addresses.push(address)
|
21
21
|
#
|
22
|
-
# @param [ Document
|
22
|
+
# @param [ Document... ] *args Any number of documents.
|
23
23
|
def <<(*args)
|
24
24
|
docs = args.flatten
|
25
25
|
return concat(docs) if docs.size > 1
|
@@ -67,10 +67,11 @@ module Mongoid
|
|
67
67
|
#
|
68
68
|
# @return [ Document ] The new document.
|
69
69
|
def build(attributes = {}, type = nil)
|
70
|
-
doc = Factory.
|
70
|
+
doc = Factory.execute_build(type || _association.klass, attributes, execute_callbacks: false)
|
71
71
|
append(doc)
|
72
72
|
doc.apply_post_processed_defaults
|
73
73
|
yield(doc) if block_given?
|
74
|
+
doc.run_pending_callbacks
|
74
75
|
doc.run_callbacks(:build) { doc }
|
75
76
|
_base._reset_memoized_descendants!
|
76
77
|
doc
|
@@ -94,6 +95,7 @@ module Mongoid
|
|
94
95
|
# @return [ self ] The empty association.
|
95
96
|
def clear
|
96
97
|
batch_clear(_target.dup)
|
98
|
+
update_attributes_hash
|
97
99
|
self
|
98
100
|
end
|
99
101
|
|
@@ -115,7 +117,7 @@ module Mongoid
|
|
115
117
|
# @example Use #persisted? inside block to count persisted documents.
|
116
118
|
# person.addresses.count { |a| a.persisted? && a.country == "FR" }
|
117
119
|
#
|
118
|
-
# @param [ Object
|
120
|
+
# @param [ Object... ] *args Args to delegate to the target.
|
119
121
|
#
|
120
122
|
# @return [ Integer ] The total number of persisted embedded docs, as
|
121
123
|
# flagged by the #persisted? method.
|
@@ -133,22 +135,40 @@ module Mongoid
|
|
133
135
|
#
|
134
136
|
# @param [ Document ] document The document to be deleted.
|
135
137
|
#
|
136
|
-
# @return [ Document
|
138
|
+
# @return [ Document | nil ] The deleted document or nil if nothing deleted.
|
137
139
|
def delete(document)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
140
|
+
execute_callbacks_around(:remove, document) do
|
141
|
+
doc = _target.delete_one(document)
|
142
|
+
if doc && !_binding?
|
143
|
+
_unscoped.delete_one(doc)
|
144
|
+
if _assigning?
|
145
|
+
_base.add_atomic_pull(doc)
|
146
|
+
else
|
147
|
+
doc.delete(suppress: true)
|
148
|
+
unbind_one(doc)
|
149
|
+
end
|
150
|
+
update_attributes_hash
|
147
151
|
end
|
152
|
+
reindex
|
153
|
+
doc
|
148
154
|
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# Mongoid::Extensions::Array defines Array#delete_one, so we need
|
158
|
+
# to make sure that method behaves reasonably on proxies, too.
|
159
|
+
alias delete_one delete
|
160
|
+
|
161
|
+
# Removes a single document from the collection *in memory only*.
|
162
|
+
# It will *not* persist the change.
|
163
|
+
#
|
164
|
+
# @param [ Document ] document The document to delete.
|
165
|
+
#
|
166
|
+
# @api private
|
167
|
+
def _remove(document)
|
168
|
+
_target.delete_one(document)
|
169
|
+
_unscoped.delete_one(document)
|
170
|
+
update_attributes_hash
|
149
171
|
reindex
|
150
|
-
execute_callback :after_remove, document
|
151
|
-
doc
|
152
172
|
end
|
153
173
|
|
154
174
|
# Delete all the documents in the association without running callbacks.
|
@@ -173,7 +193,7 @@ module Mongoid
|
|
173
193
|
# doc.state == "GA"
|
174
194
|
# end
|
175
195
|
#
|
176
|
-
# @return [ Many
|
196
|
+
# @return [ Many | Enumerator ] The association or an enumerator if no
|
177
197
|
# block was provided.
|
178
198
|
def delete_if
|
179
199
|
if block_given?
|
@@ -207,9 +227,24 @@ module Mongoid
|
|
207
227
|
# @example Are there persisted documents?
|
208
228
|
# person.posts.exists?
|
209
229
|
#
|
210
|
-
# @
|
211
|
-
|
212
|
-
|
230
|
+
# @param [ :none | nil | false | Hash | Object ] id_or_conditions
|
231
|
+
# When :none (the default), returns true if any persisted
|
232
|
+
# documents exist in the association. When nil or false, this
|
233
|
+
# will always return false. When a Hash is given, this queries
|
234
|
+
# the documents in the association for those that match the given
|
235
|
+
# conditions, and returns true if any match which have been
|
236
|
+
# persisted. Any other argument is interpreted as an id, and
|
237
|
+
# queries for the existence of persisted documents in the
|
238
|
+
# association with a matching _id.
|
239
|
+
#
|
240
|
+
# @return [ true | false ] True if persisted documents exist, false if not.
|
241
|
+
def exists?(id_or_conditions = :none)
|
242
|
+
case id_or_conditions
|
243
|
+
when :none then _target.any?(&:persisted?)
|
244
|
+
when nil, false then false
|
245
|
+
when Hash then where(id_or_conditions).any?(&:persisted?)
|
246
|
+
else where(_id: id_or_conditions).any?(&:persisted?)
|
247
|
+
end
|
213
248
|
end
|
214
249
|
|
215
250
|
# Finds a document in this association through several different
|
@@ -232,7 +267,7 @@ module Mongoid
|
|
232
267
|
# @example Finds the first matching document using a block.
|
233
268
|
# person.addresses.find { |addr| addr.state == 'CA' }
|
234
269
|
#
|
235
|
-
# @param [
|
270
|
+
# @param [ Object... ] *args Various arguments.
|
236
271
|
# @param [ Proc ] block Optional block to pass.
|
237
272
|
#
|
238
273
|
# @return [ Document | Array<Document> | nil ] A document or matching documents.
|
@@ -256,6 +291,7 @@ module Mongoid
|
|
256
291
|
integrate(doc)
|
257
292
|
doc._index = index
|
258
293
|
end
|
294
|
+
update_attributes_hash
|
259
295
|
@_unscoped = _target.dup
|
260
296
|
@_target = scope(_target)
|
261
297
|
end
|
@@ -283,7 +319,7 @@ module Mongoid
|
|
283
319
|
# @param [ Integer ] count The number of documents to pop, or 1 if not
|
284
320
|
# provided.
|
285
321
|
#
|
286
|
-
# @return [ Document
|
322
|
+
# @return [ Document | Array<Document> ] The popped document(s).
|
287
323
|
def pop(count = nil)
|
288
324
|
if count
|
289
325
|
if docs = _target[_target.size - count, _target.size]
|
@@ -291,6 +327,8 @@ module Mongoid
|
|
291
327
|
end
|
292
328
|
else
|
293
329
|
delete(_target[-1])
|
330
|
+
end.tap do
|
331
|
+
update_attributes_hash
|
294
332
|
end
|
295
333
|
end
|
296
334
|
|
@@ -306,7 +344,7 @@ module Mongoid
|
|
306
344
|
# @param [ Integer ] count The number of documents to shift, or 1 if not
|
307
345
|
# provided.
|
308
346
|
#
|
309
|
-
# @return [ Document
|
347
|
+
# @return [ Document | Array<Document> ] The shifted document(s).
|
310
348
|
def shift(count = nil)
|
311
349
|
if count
|
312
350
|
if _target.size > 0 && docs = _target[0, count]
|
@@ -314,6 +352,8 @@ module Mongoid
|
|
314
352
|
end
|
315
353
|
else
|
316
354
|
delete(_target[0])
|
355
|
+
end.tap do
|
356
|
+
update_attributes_hash
|
317
357
|
end
|
318
358
|
end
|
319
359
|
|
@@ -323,11 +363,12 @@ module Mongoid
|
|
323
363
|
# @example Substitute the association's target.
|
324
364
|
# person.addresses.substitute([ address ])
|
325
365
|
#
|
326
|
-
# @param [ Array<Document> ] docs The replacement docs.
|
366
|
+
# @param [ Array<Document> | Array<Hash> ] docs The replacement docs.
|
327
367
|
#
|
328
368
|
# @return [ Many ] The proxied association.
|
329
369
|
def substitute(docs)
|
330
370
|
batch_replace(docs)
|
371
|
+
update_attributes_hash
|
331
372
|
self
|
332
373
|
end
|
333
374
|
|
@@ -365,6 +406,7 @@ module Mongoid
|
|
365
406
|
end
|
366
407
|
_unscoped.push(document)
|
367
408
|
integrate(document)
|
409
|
+
update_attributes_hash
|
368
410
|
document._index = _unscoped.size - 1
|
369
411
|
execute_callback :after_add, document
|
370
412
|
end
|
@@ -387,20 +429,6 @@ module Mongoid
|
|
387
429
|
_association.criteria(_base, _target)
|
388
430
|
end
|
389
431
|
|
390
|
-
# Deletes one document from the target and unscoped.
|
391
|
-
#
|
392
|
-
# @api private
|
393
|
-
#
|
394
|
-
# @example Delete one document.
|
395
|
-
# relation.delete_one(doc)
|
396
|
-
#
|
397
|
-
# @param [ Document ] document The document to delete.
|
398
|
-
def delete_one(document)
|
399
|
-
_target.delete_one(document)
|
400
|
-
_unscoped.delete_one(document)
|
401
|
-
reindex
|
402
|
-
end
|
403
|
-
|
404
432
|
# Integrate the document into the association. will set its metadata and
|
405
433
|
# attempt to bind the inverse.
|
406
434
|
#
|
@@ -418,11 +446,11 @@ module Mongoid
|
|
418
446
|
#
|
419
447
|
# If the method exists on the array, use the default proxy behavior.
|
420
448
|
#
|
421
|
-
# @param [ Symbol
|
422
|
-
# @param [
|
449
|
+
# @param [ Symbol | String ] name The name of the method.
|
450
|
+
# @param [ Object... ] *args The method args.
|
423
451
|
# @param [ Proc ] block Optional block to pass.
|
424
452
|
#
|
425
|
-
# @return [ Criteria
|
453
|
+
# @return [ Criteria | Object ] A Criteria or return value from the target.
|
426
454
|
ruby2_keywords def method_missing(name, *args, &block)
|
427
455
|
return super if _target.respond_to?(name)
|
428
456
|
klass.send(:with_scope, criteria) do
|
@@ -435,7 +463,7 @@ module Mongoid
|
|
435
463
|
# @example Can we persist the association?
|
436
464
|
# relation.persistable?
|
437
465
|
#
|
438
|
-
# @return [ true
|
466
|
+
# @return [ true | false ] If the association is persistable.
|
439
467
|
def persistable?
|
440
468
|
_base.persisted? && !_binding?
|
441
469
|
end
|
@@ -479,13 +507,14 @@ module Mongoid
|
|
479
507
|
# relation.remove_all({ :num => 1 }, true)
|
480
508
|
#
|
481
509
|
# @param [ Hash ] conditions Conditions to filter by.
|
482
|
-
# @param [ true
|
510
|
+
# @param [ true | false ] method :delete or :destroy.
|
483
511
|
#
|
484
512
|
# @return [ Integer ] The number of documents removed.
|
485
513
|
def remove_all(conditions = {}, method = :delete)
|
486
514
|
criteria = where(conditions || {})
|
487
515
|
removed = criteria.size
|
488
516
|
batch_remove(criteria, method)
|
517
|
+
update_attributes_hash
|
489
518
|
removed
|
490
519
|
end
|
491
520
|
|
@@ -511,12 +540,22 @@ module Mongoid
|
|
511
540
|
@_unscoped = docs
|
512
541
|
end
|
513
542
|
|
543
|
+
# Returns a list of attributes hashes for each document.
|
544
|
+
#
|
545
|
+
# @return [ Array<Hash> ] The list of attributes hashes
|
514
546
|
def as_attributes
|
515
|
-
|
516
|
-
|
517
|
-
|
547
|
+
_unscoped.map { |doc| doc.send(:as_attributes) }
|
548
|
+
end
|
549
|
+
|
550
|
+
# Update the _base's attributes hash with the _target's attributes
|
551
|
+
#
|
552
|
+
# @api private
|
553
|
+
def update_attributes_hash
|
554
|
+
if !_target.empty?
|
555
|
+
_base.attributes.merge!(_association.store_as => _target.map(&:attributes))
|
556
|
+
else
|
557
|
+
_base.attributes.delete(_association.store_as)
|
518
558
|
end
|
519
|
-
attributes
|
520
559
|
end
|
521
560
|
|
522
561
|
class << self
|
@@ -92,7 +92,7 @@ module Mongoid
|
|
92
92
|
|
93
93
|
# Is this association polymorphic?
|
94
94
|
#
|
95
|
-
# @return [ true
|
95
|
+
# @return [ true | false ] Whether this association is polymorphic.
|
96
96
|
def polymorphic?
|
97
97
|
@polymorphic ||= !!@options[:as]
|
98
98
|
end
|
@@ -101,7 +101,7 @@ module Mongoid
|
|
101
101
|
#
|
102
102
|
# @note Only relevant if the association is polymorphic.
|
103
103
|
#
|
104
|
-
# @return [ String
|
104
|
+
# @return [ String | nil ] The field for storing the associated object's type.
|
105
105
|
def type
|
106
106
|
@type ||= "#{as}_type" if polymorphic?
|
107
107
|
end
|