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
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
# Builder.new(meta, attrs).build
|
18
18
|
#
|
19
19
|
# @param [ Document ] base The document this association hangs off of.
|
20
|
-
# @param [ Document ] object The related document.
|
20
|
+
# @param [ Document | Hash ] object The related document.
|
21
21
|
# @param [ String ] _type Not used in this context.
|
22
22
|
# @param [ Hash ] selected_fields Fields which were retrieved via
|
23
23
|
# #only. If selected_fields are specified, fields not listed in it
|
@@ -25,11 +25,25 @@ module Mongoid
|
|
25
25
|
#
|
26
26
|
# @return [ Document ] A single document.
|
27
27
|
def build(base, object, _type = nil, selected_fields = nil)
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
if object.is_a?(Hash)
|
29
|
+
if _loading? && base.persisted?
|
30
|
+
Factory.execute_from_db(klass, object, nil, selected_fields, execute_callbacks: false)
|
31
|
+
else
|
32
|
+
Factory.build(klass, object)
|
33
|
+
end
|
31
34
|
else
|
32
|
-
|
35
|
+
clear_associated(object)
|
36
|
+
object
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def clear_associated(doc)
|
43
|
+
if doc && (inv = inverse(doc))
|
44
|
+
if associated = doc.ivar(inv)
|
45
|
+
associated.substitute(nil)
|
46
|
+
end
|
33
47
|
end
|
34
48
|
end
|
35
49
|
end
|
@@ -31,6 +31,7 @@ module Mongoid
|
|
31
31
|
characterize_one(_target)
|
32
32
|
bind_one
|
33
33
|
characterize_one(_target)
|
34
|
+
update_attributes_hash(_target)
|
34
35
|
_base._reset_memoized_descendants!
|
35
36
|
_target.save if persistable?
|
36
37
|
end
|
@@ -42,9 +43,9 @@ module Mongoid
|
|
42
43
|
# @example Substitute the new document.
|
43
44
|
# person.name.substitute(new_name)
|
44
45
|
#
|
45
|
-
# @param [ Document ] replacement A document to replace the target.
|
46
|
+
# @param [ Document | Hash ] replacement A document to replace the target.
|
46
47
|
#
|
47
|
-
# @return [ Document
|
48
|
+
# @return [ Document | nil ] The association or nil.
|
48
49
|
def substitute(replacement)
|
49
50
|
if replacement != self
|
50
51
|
if _assigning?
|
@@ -80,11 +81,15 @@ module Mongoid
|
|
80
81
|
end
|
81
82
|
end
|
82
83
|
unbind_one
|
83
|
-
|
84
|
+
unless replacement
|
85
|
+
update_attributes_hash(replacement)
|
86
|
+
return nil
|
87
|
+
end
|
84
88
|
replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
|
85
89
|
self._target = replacement
|
86
|
-
bind_one
|
87
90
|
characterize_one(_target)
|
91
|
+
bind_one
|
92
|
+
update_attributes_hash(_target)
|
88
93
|
_target.save if persistable?
|
89
94
|
end
|
90
95
|
self
|
@@ -107,11 +112,25 @@ module Mongoid
|
|
107
112
|
# @example Can we persist the association?
|
108
113
|
# relation.persistable?
|
109
114
|
#
|
110
|
-
# @return [ true
|
115
|
+
# @return [ true | false ] If the association is persistable.
|
111
116
|
def persistable?
|
112
117
|
_base.persisted? && !_binding? && !_building? && !_assigning?
|
113
118
|
end
|
114
119
|
|
120
|
+
# Update the _base's attributes hash with the _target's attributes
|
121
|
+
#
|
122
|
+
# @param replacement [ Document | nil ] The doc to use to update the
|
123
|
+
# attributes hash.
|
124
|
+
#
|
125
|
+
# @api private
|
126
|
+
def update_attributes_hash(replacement)
|
127
|
+
if replacement
|
128
|
+
_base.attributes.merge!(_association.store_as => replacement.attributes)
|
129
|
+
else
|
130
|
+
_base.attributes.delete(_association.store_as)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
115
134
|
class << self
|
116
135
|
|
117
136
|
# Returns true if the association is an embedded one. In this case
|
@@ -66,7 +66,7 @@ module Mongoid
|
|
66
66
|
# @example Get the validation default.
|
67
67
|
# Proxy.validation_default
|
68
68
|
#
|
69
|
-
# @return [ true
|
69
|
+
# @return [ true | false ] The validation default.
|
70
70
|
def validation_default; true; end
|
71
71
|
|
72
72
|
# Does this association type store the foreign key?
|
@@ -88,7 +88,7 @@ module Mongoid
|
|
88
88
|
|
89
89
|
# Is this association polymorphic?
|
90
90
|
#
|
91
|
-
# @return [ true
|
91
|
+
# @return [ true | false ] Whether this association is polymorphic.
|
92
92
|
def polymorphic?
|
93
93
|
@polymorphic ||= !!@options[:as]
|
94
94
|
end
|
@@ -97,7 +97,7 @@ module Mongoid
|
|
97
97
|
#
|
98
98
|
# @note Only relevant if the association is polymorphic.
|
99
99
|
#
|
100
|
-
# @return [ String
|
100
|
+
# @return [ String | nil ] The field for storing the associated object's type.
|
101
101
|
def type
|
102
102
|
@type ||= "#{as}_type" if polymorphic?
|
103
103
|
end
|
@@ -34,10 +34,16 @@ module Mongoid
|
|
34
34
|
#
|
35
35
|
# @api private
|
36
36
|
class_attribute :aliased_associations
|
37
|
+
|
38
|
+
# @return [ Set<String> ] The set of associations that are configured
|
39
|
+
# with :store_as parameter.
|
40
|
+
class_attribute :stored_as_associations
|
41
|
+
|
37
42
|
self.embedded = false
|
38
43
|
self.embedded_relations = BSON::Document.new
|
39
44
|
self.relations = BSON::Document.new
|
40
45
|
self.aliased_associations = {}
|
46
|
+
self.stored_as_associations = Set.new
|
41
47
|
end
|
42
48
|
|
43
49
|
# This is convenience for libraries still on the old API.
|
@@ -216,8 +222,9 @@ module Mongoid
|
|
216
222
|
Association::MACRO_MAPPING[macro_name].new(self, name, options, &block).tap do |assoc|
|
217
223
|
assoc.setup!
|
218
224
|
self.relations = self.relations.merge(name => assoc)
|
219
|
-
if assoc.respond_to?(:store_as) && assoc.store_as != name
|
225
|
+
if assoc.embedded? && assoc.respond_to?(:store_as) && assoc.store_as != name
|
220
226
|
self.aliased_associations[assoc.store_as] = name
|
227
|
+
self.stored_as_associations << assoc.store_as
|
221
228
|
end
|
222
229
|
end
|
223
230
|
end
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
# @example Is the association empty??
|
18
18
|
# person.addresses.blank?
|
19
19
|
#
|
20
|
-
# @return [ true
|
20
|
+
# @return [ true | false ] If the association is empty or not.
|
21
21
|
def blank?
|
22
22
|
!any?
|
23
23
|
end
|
@@ -28,7 +28,6 @@ module Mongoid
|
|
28
28
|
# @example Create and save the new document.
|
29
29
|
# person.posts.create(:text => "Testing")
|
30
30
|
#
|
31
|
-
#
|
32
31
|
# @param [ Hash ] attributes The attributes to create with.
|
33
32
|
# @param [ Class ] type The optional type of document to create.
|
34
33
|
#
|
@@ -61,6 +60,11 @@ module Mongoid
|
|
61
60
|
attributes.map { |attrs| create!(attrs, type, &block) }
|
62
61
|
else
|
63
62
|
doc = build(attributes, type, &block)
|
63
|
+
|
64
|
+
Array(doc).each do |doc|
|
65
|
+
doc.try(:run_pending_callbacks)
|
66
|
+
end
|
67
|
+
|
64
68
|
_base.persisted? ? doc.save! : raise_unsaved(doc)
|
65
69
|
doc
|
66
70
|
end
|
@@ -126,9 +130,9 @@ module Mongoid
|
|
126
130
|
# relation.respond_to?(:name)
|
127
131
|
#
|
128
132
|
# @param [ Symbol ] name The method name.
|
129
|
-
# @param [ true
|
133
|
+
# @param [ true | false ] include_private Whether to include private methods.
|
130
134
|
#
|
131
|
-
# @return [ true
|
135
|
+
# @return [ true | false ] If the proxy responds to the method.
|
132
136
|
def respond_to?(name, include_private = false)
|
133
137
|
[].respond_to?(name, include_private) ||
|
134
138
|
klass.respond_to?(name, include_private) || super
|
@@ -153,9 +157,9 @@ module Mongoid
|
|
153
157
|
#
|
154
158
|
# @param [ Hash ] options The options to pass.
|
155
159
|
#
|
156
|
-
# @option options [ Symbol ] :
|
157
|
-
# @option options [ Symbol ] :
|
158
|
-
# @option options [ Symbol ] :
|
160
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :except Do not include these field(s).
|
161
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :include Which association(s) to include.
|
162
|
+
# @option options [ Symbol | String | Array<Symbol | String> ] :only Limit the field(s) to only these.
|
159
163
|
#
|
160
164
|
# @return [ Hash ] The documents, ready to be serialized.
|
161
165
|
def serializable_hash(options = {})
|
@@ -65,7 +65,7 @@ module Mongoid
|
|
65
65
|
#
|
66
66
|
# @param [ Hash ] attributes The attributes to pull the flag from.
|
67
67
|
#
|
68
|
-
# @return [ true
|
68
|
+
# @return [ true | false ] If the association can potentially be deleted.
|
69
69
|
def destroyable?(attributes)
|
70
70
|
destroy = attributes.delete(:_destroy)
|
71
71
|
Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
|
@@ -79,7 +79,7 @@ module Mongoid
|
|
79
79
|
#
|
80
80
|
# @param [ Hash ] attributes The attributes being set.
|
81
81
|
#
|
82
|
-
# @return [ true
|
82
|
+
# @return [ true | false ] If the attributes exceed the limit.
|
83
83
|
def over_limit?(attributes)
|
84
84
|
limit = options[:limit]
|
85
85
|
limit ? attributes.size > limit : false
|
@@ -134,8 +134,9 @@ module Mongoid
|
|
134
134
|
# @param [ Proxy ] relation The association proxy.
|
135
135
|
# @param [ Document ] doc The document to delete.
|
136
136
|
def destroy_document(relation, doc)
|
137
|
+
res = doc.destroy unless doc.embedded? || doc.destroyed?
|
137
138
|
relation.delete(doc)
|
138
|
-
|
139
|
+
res
|
139
140
|
end
|
140
141
|
|
141
142
|
# Update the document.
|
@@ -164,7 +165,7 @@ module Mongoid
|
|
164
165
|
# builder.update_nested_relation(parent, id, attrs)
|
165
166
|
#
|
166
167
|
# @param [ Document ] parent The parent document.
|
167
|
-
# @param [ String
|
168
|
+
# @param [ String | BSON::ObjectId ] id of the related document.
|
168
169
|
# @param [ Hash ] attrs The single document attributes to process.
|
169
170
|
def update_nested_relation(parent, id, attrs)
|
170
171
|
first = existing.first
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# @example Do we allow a destroy?
|
13
13
|
# builder.allow_destroy?
|
14
14
|
#
|
15
|
-
# @return [ true
|
15
|
+
# @return [ true | false ] True if the allow destroy option was set.
|
16
16
|
def allow_destroy?
|
17
17
|
options[:allow_destroy] || false
|
18
18
|
end
|
@@ -25,7 +25,7 @@ module Mongoid
|
|
25
25
|
# @param [ Document ] document The parent document of the association
|
26
26
|
# @param [ Hash ] attrs The attributes to check for rejection.
|
27
27
|
#
|
28
|
-
# @return [ true
|
28
|
+
# @return [ true | false ] True and call proc or method if rejectable, false if not.
|
29
29
|
def reject?(document, attrs)
|
30
30
|
case callback = options[:reject_if]
|
31
31
|
when Symbol
|
@@ -43,7 +43,7 @@ module Mongoid
|
|
43
43
|
# @example Is this update only?
|
44
44
|
# builder.update_only?
|
45
45
|
#
|
46
|
-
# @return [ true
|
46
|
+
# @return [ true | false ] True if the update_only option was set.
|
47
47
|
def update_only?
|
48
48
|
options[:update_only] || false
|
49
49
|
end
|
@@ -56,7 +56,7 @@ module Mongoid
|
|
56
56
|
# @param [ Class ] klass The class we're trying to convert for.
|
57
57
|
# @param [ String ] id The id, usually coming from the form.
|
58
58
|
#
|
59
|
-
# @return [ BSON::ObjectId
|
59
|
+
# @return [ BSON::ObjectId | String | Object ] The converted id.
|
60
60
|
def convert_id(klass, id)
|
61
61
|
klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
|
62
62
|
end
|
@@ -32,6 +32,8 @@ module Mongoid
|
|
32
32
|
parent.send(association.setter, Factory.build(@class_name, attributes))
|
33
33
|
elsif delete?
|
34
34
|
parent.send(association.setter, nil)
|
35
|
+
else
|
36
|
+
check_for_id_violation!
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
@@ -54,6 +56,17 @@ module Mongoid
|
|
54
56
|
|
55
57
|
private
|
56
58
|
|
59
|
+
# Extracts and converts the id to the expected type.
|
60
|
+
#
|
61
|
+
# @return [ BSON::ObjectId | String | Object | nil ] The converted id,
|
62
|
+
# or nil if no id is present in the attributes hash.
|
63
|
+
def extracted_id
|
64
|
+
@extracted_id ||= begin
|
65
|
+
id = association.klass.extract_id_field(attributes)
|
66
|
+
convert_id(existing.class, id)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
57
70
|
# Is the id in the attributes acceptable for allowing an update to
|
58
71
|
# the existing association?
|
59
72
|
#
|
@@ -62,10 +75,9 @@ module Mongoid
|
|
62
75
|
# @example Is the id acceptable?
|
63
76
|
# one.acceptable_id?
|
64
77
|
#
|
65
|
-
# @return [ true
|
78
|
+
# @return [ true | false ] If the id part of the logic will allow an update.
|
66
79
|
def acceptable_id?
|
67
|
-
id =
|
68
|
-
id = convert_id(existing.class, id)
|
80
|
+
id = extracted_id
|
69
81
|
existing._id == id || id.nil? || (existing._id != id && update_only?)
|
70
82
|
end
|
71
83
|
|
@@ -74,7 +86,7 @@ module Mongoid
|
|
74
86
|
# @example Can the existing object be deleted?
|
75
87
|
# one.delete?
|
76
88
|
#
|
77
|
-
# @return [ true
|
89
|
+
# @return [ true | false ] If the association should be deleted.
|
78
90
|
def delete?
|
79
91
|
id = association.klass.extract_id_field(attributes)
|
80
92
|
destroyable? && !id.nil?
|
@@ -85,7 +97,7 @@ module Mongoid
|
|
85
97
|
# @example Is the object destroyable?
|
86
98
|
# one.destroyable?({ :_destroy => "1" })
|
87
99
|
#
|
88
|
-
# @return [ true
|
100
|
+
# @return [ true | false ] If the association can potentially be
|
89
101
|
# destroyed.
|
90
102
|
def destroyable?
|
91
103
|
Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
|
@@ -96,7 +108,7 @@ module Mongoid
|
|
96
108
|
# @example Is the document to be replaced?
|
97
109
|
# one.replace?
|
98
110
|
#
|
99
|
-
# @return [ true
|
111
|
+
# @return [ true | false ] If the document should be replaced.
|
100
112
|
def replace?
|
101
113
|
!existing && !destroyable? && !attributes.blank?
|
102
114
|
end
|
@@ -106,10 +118,36 @@ module Mongoid
|
|
106
118
|
# @example Should the document be updated?
|
107
119
|
# one.update?
|
108
120
|
#
|
109
|
-
# @return [ true
|
121
|
+
# @return [ true | false ] If the object should have its attributes updated.
|
110
122
|
def update?
|
111
123
|
existing && !destroyable? && acceptable_id?
|
112
124
|
end
|
125
|
+
|
126
|
+
# Checks to see if the _id attribute (which is supposed to be
|
127
|
+
# immutable) is being asked to change. If so, raise an exception.
|
128
|
+
#
|
129
|
+
# If Mongoid::Config.immutable_ids is false, this will do nothing,
|
130
|
+
# and the update operation will fail silently.
|
131
|
+
#
|
132
|
+
# @raise [ Errors::ImmutableAttribute ] if _id has changed, and
|
133
|
+
# the document has been persisted.
|
134
|
+
def check_for_id_violation!
|
135
|
+
# look for the basic criteria of an update (see #update?)
|
136
|
+
return unless existing&.persisted? && !destroyable?
|
137
|
+
|
138
|
+
# if the id is either absent, or if it equals the existing record's
|
139
|
+
# id, there is no immutability violation.
|
140
|
+
id = extracted_id
|
141
|
+
return if existing._id == id || id.nil?
|
142
|
+
|
143
|
+
# otherwise, an attempt has been made to set the _id of an existing,
|
144
|
+
# persisted document.
|
145
|
+
if Mongoid::Config.immutable_ids
|
146
|
+
raise Errors::ImmutableAttribute.new(:_id, id)
|
147
|
+
else
|
148
|
+
Mongoid::Warnings.warn_mutable_ids
|
149
|
+
end
|
150
|
+
end
|
113
151
|
end
|
114
152
|
end
|
115
153
|
end
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# @example Clear the relation.
|
13
13
|
# relation.clear
|
14
14
|
#
|
15
|
-
# @return [ true
|
15
|
+
# @return [ true | false ] If the delete succeeded.
|
16
16
|
def clear
|
17
17
|
_target.delete
|
18
18
|
end
|
@@ -34,7 +34,7 @@ module Mongoid
|
|
34
34
|
#
|
35
35
|
# @param [ Symbol ] name The method name.
|
36
36
|
#
|
37
|
-
# @return [ true
|
37
|
+
# @return [ true | false ] If the proxy responds to the method.
|
38
38
|
def respond_to?(name, include_private = false)
|
39
39
|
_target.respond_to?(name, include_private) || super
|
40
40
|
end
|
@@ -7,7 +7,7 @@ module Mongoid
|
|
7
7
|
|
8
8
|
# Returns the name of the parent to a polymorphic child.
|
9
9
|
#
|
10
|
-
# @return [ String
|
10
|
+
# @return [ String | Symbol ] The name.
|
11
11
|
def as
|
12
12
|
@options[:as]
|
13
13
|
end
|
@@ -28,21 +28,21 @@ module Mongoid
|
|
28
28
|
|
29
29
|
# Whether to index the primary or foreign key field.
|
30
30
|
#
|
31
|
-
# @return [ true
|
31
|
+
# @return [ true | false ]
|
32
32
|
def indexed?
|
33
33
|
@indexed ||= !!@options[:index]
|
34
34
|
end
|
35
35
|
|
36
36
|
# Whether the association is autobuilding.
|
37
37
|
#
|
38
|
-
# @return [ true
|
38
|
+
# @return [ true | false ]
|
39
39
|
def autobuilding?
|
40
40
|
!!@options[:autobuild]
|
41
41
|
end
|
42
42
|
|
43
43
|
# Is the association cyclic.
|
44
44
|
#
|
45
|
-
# @return [ true
|
45
|
+
# @return [ true | false ] Whether the association is cyclic.
|
46
46
|
def cyclic?
|
47
47
|
!!@options[:cyclic]
|
48
48
|
end
|
@@ -57,7 +57,7 @@ module Mongoid
|
|
57
57
|
# Mongoid assumes that the field used to hold the primary key of the association is id.
|
58
58
|
# You can override this and explicitly specify the primary key with the :primary_key option.
|
59
59
|
#
|
60
|
-
# @return [ Symbol
|
60
|
+
# @return [ Symbol | String ] The primary key.
|
61
61
|
def primary_key
|
62
62
|
@primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
|
63
63
|
end
|
@@ -65,7 +65,7 @@ module Mongoid
|
|
65
65
|
# Options to save any loaded members and destroy members that are marked for destruction
|
66
66
|
# when the parent object is saved.
|
67
67
|
#
|
68
|
-
# @return [ true
|
68
|
+
# @return [ true | false ] The autosave option.
|
69
69
|
def autosave
|
70
70
|
!!@options[:autosave]
|
71
71
|
end
|
@@ -73,19 +73,19 @@ module Mongoid
|
|
73
73
|
|
74
74
|
# Whether the association is counter-cached.
|
75
75
|
#
|
76
|
-
# @return [ true
|
76
|
+
# @return [ true | false ]
|
77
77
|
def counter_cached?
|
78
78
|
!!@options[:counter_cache]
|
79
79
|
end
|
80
80
|
|
81
81
|
# Whether this association is polymorphic.
|
82
82
|
#
|
83
|
-
# @return [ true
|
83
|
+
# @return [ true | false ] Whether the association is polymorphic.
|
84
84
|
def polymorphic?; false; end
|
85
85
|
|
86
86
|
# Whether the association has callbacks cascaded down from the parent.
|
87
87
|
#
|
88
|
-
# @return [ true
|
88
|
+
# @return [ true | false ] Whether callbacks are cascaded.
|
89
89
|
def cascading_callbacks?
|
90
90
|
!!@options[:cascade_callbacks]
|
91
91
|
end
|
@@ -48,7 +48,7 @@ module Mongoid
|
|
48
48
|
# proxy.init(person, name, association)
|
49
49
|
#
|
50
50
|
# @param [ Document ] base The base document on the proxy.
|
51
|
-
# @param [ Document
|
51
|
+
# @param [ Document | Array<Document> ] target The target of the proxy.
|
52
52
|
# @param [ Association ] association The association metadata.
|
53
53
|
def init(base, target, association)
|
54
54
|
@_base, @_target, @_association = base, target, association
|
@@ -117,9 +117,8 @@ module Mongoid
|
|
117
117
|
# Default behavior of method missing should be to delegate all calls
|
118
118
|
# to the target of the proxy. This can be overridden in special cases.
|
119
119
|
#
|
120
|
-
# @param [ String
|
121
|
-
# @param [
|
122
|
-
#
|
120
|
+
# @param [ String | Symbol ] name The name of the method.
|
121
|
+
# @param [ Object... ] *args The arguments passed to the method.
|
123
122
|
ruby2_keywords def method_missing(name, *args, &block)
|
124
123
|
_target.send(name, *args, &block)
|
125
124
|
end
|
@@ -169,6 +168,18 @@ module Mongoid
|
|
169
168
|
end
|
170
169
|
end
|
171
170
|
|
171
|
+
# Execute the before and after callbacks for the given method.
|
172
|
+
#
|
173
|
+
# @param [ Symbol ] name The name of the callbacks to execute.
|
174
|
+
#
|
175
|
+
# @return [ Object ] The result of the given block
|
176
|
+
def execute_callbacks_around(name, doc)
|
177
|
+
execute_callback :"before_#{name.to_s}", doc
|
178
|
+
yield.tap do
|
179
|
+
execute_callback :"after_#{name.to_s}", doc
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
172
183
|
class << self
|
173
184
|
|
174
185
|
# Apply ordering to the criteria if it was defined on the association.
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
# @example Is the document autosaved?
|
13
13
|
# document.autosaved?
|
14
14
|
#
|
15
|
-
# @return [ true
|
15
|
+
# @return [ true | false ] Has the document already been autosaved?
|
16
16
|
def autosaved?
|
17
17
|
Threaded.autosaved?(self)
|
18
18
|
end
|
@@ -56,7 +56,8 @@ module Mongoid
|
|
56
56
|
__autosaving__ do
|
57
57
|
if assoc_value = ivar(association.name)
|
58
58
|
Array(assoc_value).each do |doc|
|
59
|
-
doc.
|
59
|
+
pc = doc.persistence_context? ? doc.persistence_context : persistence_context
|
60
|
+
doc.with(pc) do |d|
|
60
61
|
d.save
|
61
62
|
end
|
62
63
|
end
|
@@ -64,7 +65,7 @@ module Mongoid
|
|
64
65
|
end
|
65
66
|
end
|
66
67
|
end
|
67
|
-
klass.
|
68
|
+
klass.after_persist_parent save_method, unless: :autosaved?
|
68
69
|
end
|
69
70
|
end
|
70
71
|
end
|
@@ -18,7 +18,7 @@ module Mongoid
|
|
18
18
|
# Association::BelongsTo::Proxy.new(game, person, association)
|
19
19
|
#
|
20
20
|
# @param [ Document ] base The document this association hangs off of.
|
21
|
-
# @param [ Document
|
21
|
+
# @param [ Document | Array<Document> ] target The target (parent) of the
|
22
22
|
# association.
|
23
23
|
# @param [ Association ] association The association object.
|
24
24
|
def initialize(base, target, association)
|
@@ -34,7 +34,6 @@ module Mongoid
|
|
34
34
|
#
|
35
35
|
# @example Nullify the association.
|
36
36
|
# person.game.nullify
|
37
|
-
#
|
38
37
|
def nullify
|
39
38
|
unbind_one
|
40
39
|
_target.save
|
@@ -46,9 +45,9 @@ module Mongoid
|
|
46
45
|
# @example Substitute the association.
|
47
46
|
# name.substitute(new_name)
|
48
47
|
#
|
49
|
-
# @param [ Document
|
48
|
+
# @param [ Document | Array<Document> ] replacement The replacement.
|
50
49
|
#
|
51
|
-
# @return [ self
|
50
|
+
# @return [ self | nil ] The association or nil.
|
52
51
|
def substitute(replacement)
|
53
52
|
unbind_one
|
54
53
|
if replacement
|
@@ -77,7 +76,7 @@ module Mongoid
|
|
77
76
|
# @example Normalize the substitute.
|
78
77
|
# proxy.normalize(id)
|
79
78
|
#
|
80
|
-
# @param [ Document
|
79
|
+
# @param [ Document | Object ] replacement The replacement object.
|
81
80
|
#
|
82
81
|
# @return [ Document ] The document.
|
83
82
|
def normalize(replacement)
|
@@ -90,7 +89,7 @@ module Mongoid
|
|
90
89
|
# @example Can we persist the association?
|
91
90
|
# relation.persistable?
|
92
91
|
#
|
93
|
-
# @return [ true
|
92
|
+
# @return [ true | false ] If the association is persistable.
|
94
93
|
def persistable?
|
95
94
|
_target.persisted? && !_binding? && !_building?
|
96
95
|
end
|
@@ -97,7 +97,7 @@ module Mongoid
|
|
97
97
|
|
98
98
|
# Is this association polymorphic?
|
99
99
|
#
|
100
|
-
# @return [ true
|
100
|
+
# @return [ true | false ] Whether this association is polymorphic.
|
101
101
|
def polymorphic?
|
102
102
|
@polymorphic ||= !!@options[:polymorphic]
|
103
103
|
end
|
@@ -153,7 +153,7 @@ module Mongoid
|
|
153
153
|
create_foreign_key_field!
|
154
154
|
setup_index!
|
155
155
|
define_touchable!
|
156
|
-
@owner_class.validates_associated(name) if validate?
|
156
|
+
@owner_class.validates_associated(name) if validate? || require_association?
|
157
157
|
@owner_class.validates(name, presence: true) if require_association?
|
158
158
|
end
|
159
159
|
|