mongoid 7.2.1 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -20
- data/LICENSE +1 -1
- data/README.md +7 -12
- data/Rakefile +58 -1
- data/lib/config/locales/en.yml +191 -60
- data/lib/mongoid/association/accessors.rb +67 -53
- data/lib/mongoid/association/bindable.rb +77 -31
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +2 -5
- data/lib/mongoid/association/depending.rb +20 -12
- data/lib/mongoid/association/eager.rb +160 -0
- data/lib/mongoid/association/eager_loadable.rb +41 -11
- data/lib/mongoid/association/embedded/batchable.rb +63 -52
- data/lib/mongoid/association/embedded/cyclic.rb +4 -12
- data/lib/mongoid/association/embedded/eager.rb +23 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
- data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
- data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
- data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
- data/lib/mongoid/association/embedded.rb +2 -1
- data/lib/mongoid/association/macros.rb +47 -16
- data/lib/mongoid/association/many.rb +12 -24
- data/lib/mongoid/association/marshalable.rb +4 -5
- data/lib/mongoid/association/nested/many.rb +14 -19
- data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
- data/lib/mongoid/association/nested/one.rb +54 -26
- data/lib/mongoid/association/nested.rb +1 -3
- data/lib/mongoid/association/one.rb +3 -11
- data/lib/mongoid/association/options.rb +18 -44
- data/lib/mongoid/association/proxy.rb +49 -42
- data/lib/mongoid/association/referenced/auto_save.rb +11 -15
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
- data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
- data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
- data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
- data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
- data/lib/mongoid/association/referenced/has_many.rb +17 -43
- data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
- data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
- data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
- data/lib/mongoid/association/referenced/has_one.rb +17 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -27
- data/lib/mongoid/association/referenced.rb +1 -1
- data/lib/mongoid/association/reflections.rb +9 -9
- data/lib/mongoid/association/relatable.rb +55 -74
- data/lib/mongoid/association.rb +10 -22
- data/lib/mongoid/atomic/modifiers.rb +7 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
- data/lib/mongoid/atomic/paths/embedded.rb +1 -3
- data/lib/mongoid/atomic/paths/root.rb +1 -5
- data/lib/mongoid/atomic/paths.rb +1 -1
- data/lib/mongoid/atomic.rb +39 -86
- data/lib/mongoid/atomic_update_preparer.rb +88 -0
- data/lib/mongoid/attributes/dynamic.rb +5 -21
- data/lib/mongoid/attributes/embedded.rb +34 -0
- data/lib/mongoid/attributes/nested.rb +9 -13
- data/lib/mongoid/attributes/processing.rb +43 -28
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes/readonly.rb +4 -8
- data/lib/mongoid/attributes.rb +85 -89
- data/lib/mongoid/cacheable.rb +5 -9
- data/lib/mongoid/changeable.rb +183 -97
- data/lib/mongoid/clients/factory.rb +58 -15
- data/lib/mongoid/clients/options.rb +117 -8
- data/lib/mongoid/clients/sessions.rb +246 -84
- data/lib/mongoid/clients/storage_options.rb +37 -11
- data/lib/mongoid/clients/validators/storage.rb +4 -24
- data/lib/mongoid/clients/validators.rb +1 -1
- data/lib/mongoid/clients.rb +37 -14
- data/lib/mongoid/collection_configurable.rb +59 -0
- data/lib/mongoid/composable.rb +7 -7
- data/lib/mongoid/config/defaults.rb +40 -0
- data/lib/mongoid/config/encryption.rb +213 -0
- data/lib/mongoid/config/environment.rb +25 -5
- data/lib/mongoid/config/introspection.rb +152 -0
- data/lib/mongoid/config/options.rb +11 -14
- data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
- data/lib/mongoid/config/validators/client.rb +7 -23
- data/lib/mongoid/config/validators/option.rb +1 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +183 -46
- data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
- data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
- data/lib/mongoid/contextual/aggregable/none.rb +66 -0
- data/lib/mongoid/contextual/aggregable.rb +18 -0
- data/lib/mongoid/contextual/atomic.rb +97 -30
- data/lib/mongoid/contextual/command.rb +3 -5
- data/lib/mongoid/contextual/map_reduce.rb +8 -33
- data/lib/mongoid/contextual/memory.rb +396 -89
- data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
- data/lib/mongoid/contextual/mongo.rb +640 -311
- data/lib/mongoid/contextual/none.rb +244 -30
- data/lib/mongoid/contextual/queryable.rb +5 -4
- data/lib/mongoid/contextual.rb +18 -7
- data/lib/mongoid/copyable.rb +34 -14
- data/lib/mongoid/criteria/findable.rb +52 -22
- data/lib/mongoid/criteria/includable.rb +31 -34
- data/lib/mongoid/criteria/inspectable.rb +4 -3
- data/lib/mongoid/criteria/marshalable.rb +14 -7
- data/lib/mongoid/criteria/modifiable.rb +5 -19
- data/lib/mongoid/criteria/options.rb +1 -3
- data/lib/mongoid/criteria/permission.rb +6 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
- data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
- data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
- data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
- data/lib/mongoid/criteria/queryable/key.rb +15 -18
- data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
- data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
- data/lib/mongoid/criteria/queryable/optional.rb +12 -62
- data/lib/mongoid/criteria/queryable/options.rb +3 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
- data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
- data/lib/mongoid/criteria/queryable/selector.rb +96 -25
- data/lib/mongoid/criteria/queryable/smash.rb +41 -18
- data/lib/mongoid/criteria/queryable/storable.rb +14 -9
- data/lib/mongoid/criteria/queryable.rb +12 -13
- data/lib/mongoid/criteria/scopable.rb +32 -21
- data/lib/mongoid/criteria/translator.rb +46 -0
- data/lib/mongoid/criteria.rb +60 -109
- data/lib/mongoid/deprecable.rb +38 -0
- data/lib/mongoid/deprecation.rb +29 -0
- data/lib/mongoid/document.rb +263 -173
- data/lib/mongoid/encryptable.rb +53 -0
- data/lib/mongoid/equality.rb +22 -25
- data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
- data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
- data/lib/mongoid/errors/callback.rb +1 -3
- data/lib/mongoid/errors/create_collection_failure.rb +34 -0
- data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +9 -12
- data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
- data/lib/mongoid/errors/document_not_found.rb +34 -21
- data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
- data/lib/mongoid/errors/empty_config_file.rb +26 -0
- data/lib/mongoid/errors/immutable_attribute.rb +27 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
- data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
- data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
- data/lib/mongoid/errors/invalid_collection.rb +1 -1
- data/lib/mongoid/errors/invalid_config_file.rb +26 -0
- data/lib/mongoid/errors/invalid_config_option.rb +2 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
- data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +7 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
- data/lib/mongoid/errors/invalid_field_option.rb +1 -3
- data/lib/mongoid/errors/invalid_field_type.rb +27 -0
- data/lib/mongoid/errors/invalid_find.rb +1 -3
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
- data/lib/mongoid/errors/invalid_includes.rb +1 -3
- data/lib/mongoid/errors/invalid_index.rb +1 -3
- data/lib/mongoid/errors/invalid_options.rb +1 -3
- data/lib/mongoid/errors/invalid_path.rb +1 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
- data/lib/mongoid/errors/invalid_query.rb +1 -1
- data/lib/mongoid/errors/invalid_relation.rb +2 -8
- data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
- data/lib/mongoid/errors/invalid_scope.rb +1 -3
- data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
- data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
- data/lib/mongoid/errors/invalid_time.rb +1 -3
- data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -3
- data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
- data/lib/mongoid/errors/mixed_relations.rb +1 -3
- data/lib/mongoid/errors/mongoid_error.rb +8 -16
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
- data/lib/mongoid/errors/no_client_config.rb +1 -3
- data/lib/mongoid/errors/no_client_database.rb +2 -4
- data/lib/mongoid/errors/no_client_hosts.rb +2 -4
- data/lib/mongoid/errors/no_clients_config.rb +1 -3
- data/lib/mongoid/errors/no_default_client.rb +1 -3
- data/lib/mongoid/errors/no_environment.rb +1 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
- data/lib/mongoid/errors/no_metadata.rb +1 -3
- data/lib/mongoid/errors/no_parent.rb +1 -3
- data/lib/mongoid/errors/readonly_attribute.rb +2 -4
- data/lib/mongoid/errors/readonly_document.rb +2 -6
- data/lib/mongoid/errors/rollback.rb +15 -0
- data/lib/mongoid/errors/scope_overwrite.rb +1 -1
- data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
- data/lib/mongoid/errors/transaction_error.rb +25 -0
- data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
- data/lib/mongoid/errors/unknown_attribute.rb +2 -4
- data/lib/mongoid/errors/unknown_model.rb +1 -3
- data/lib/mongoid/errors/unsaved_document.rb +2 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
- data/lib/mongoid/errors/validations.rb +1 -1
- data/lib/mongoid/errors.rb +18 -5
- data/lib/mongoid/evolvable.rb +2 -4
- data/lib/mongoid/extensions/array.rb +20 -58
- data/lib/mongoid/extensions/big_decimal.rb +44 -24
- data/lib/mongoid/extensions/binary.rb +45 -0
- data/lib/mongoid/extensions/boolean.rb +11 -6
- data/lib/mongoid/extensions/date.rb +31 -29
- data/lib/mongoid/extensions/date_time.rb +5 -16
- data/lib/mongoid/extensions/decimal128.rb +3 -5
- data/lib/mongoid/extensions/false_class.rb +8 -10
- data/lib/mongoid/extensions/float.rb +11 -12
- data/lib/mongoid/extensions/hash.rb +28 -148
- data/lib/mongoid/extensions/integer.rb +13 -14
- data/lib/mongoid/extensions/module.rb +5 -5
- data/lib/mongoid/extensions/nil_class.rb +5 -7
- data/lib/mongoid/extensions/object.rb +32 -81
- data/lib/mongoid/extensions/object_id.rb +3 -7
- data/lib/mongoid/extensions/range.rb +47 -24
- data/lib/mongoid/extensions/raw_value.rb +34 -0
- data/lib/mongoid/extensions/regexp.rb +14 -7
- data/lib/mongoid/extensions/set.rb +24 -13
- data/lib/mongoid/extensions/string.rb +30 -62
- data/lib/mongoid/extensions/symbol.rb +9 -22
- data/lib/mongoid/extensions/time.rb +30 -40
- data/lib/mongoid/extensions/time_with_zone.rb +18 -11
- data/lib/mongoid/extensions/true_class.rb +8 -10
- data/lib/mongoid/extensions.rb +3 -20
- data/lib/mongoid/factory.rb +178 -37
- data/lib/mongoid/fields/encrypted.rb +48 -0
- data/lib/mongoid/fields/foreign_key.rb +39 -27
- data/lib/mongoid/fields/localized.rb +25 -15
- data/lib/mongoid/fields/standard.rb +22 -40
- data/lib/mongoid/fields/validators/macro.rb +6 -19
- data/lib/mongoid/fields/validators.rb +1 -1
- data/lib/mongoid/fields.rb +354 -76
- data/lib/mongoid/findable.rb +62 -22
- data/lib/mongoid/indexable/specification.rb +55 -34
- data/lib/mongoid/indexable/validators/options.rb +7 -9
- data/lib/mongoid/indexable.rb +2 -18
- data/lib/mongoid/inspectable.rb +34 -11
- data/lib/mongoid/interceptable.rb +197 -41
- data/lib/mongoid/loadable.rb +83 -0
- data/lib/mongoid/loggable.rb +1 -9
- data/lib/mongoid/matchable.rb +2 -6
- data/lib/mongoid/matcher/all.rb +15 -0
- data/lib/mongoid/matcher/and.rb +14 -0
- data/lib/mongoid/matcher/bits.rb +60 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_all_set.rb +41 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
- data/lib/mongoid/matcher/bits_any_set.rb +41 -0
- data/lib/mongoid/matcher/elem_match.rb +17 -1
- data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
- data/lib/mongoid/matcher/eq.rb +15 -0
- data/lib/mongoid/matcher/eq_impl.rb +54 -2
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +22 -14
- data/lib/mongoid/matcher/expression_operator.rb +14 -0
- data/lib/mongoid/matcher/field_expression.rb +19 -5
- data/lib/mongoid/matcher/field_operator.rb +30 -0
- data/lib/mongoid/matcher/gt.rb +15 -0
- data/lib/mongoid/matcher/gte.rb +15 -0
- data/lib/mongoid/matcher/in.rb +15 -0
- data/lib/mongoid/matcher/lt.rb +15 -0
- data/lib/mongoid/matcher/lte.rb +15 -0
- data/lib/mongoid/matcher/mod.rb +33 -0
- data/lib/mongoid/matcher/ne.rb +15 -0
- data/lib/mongoid/matcher/nin.rb +15 -0
- data/lib/mongoid/matcher/nor.rb +14 -0
- data/lib/mongoid/matcher/not.rb +16 -0
- data/lib/mongoid/matcher/or.rb +14 -0
- data/lib/mongoid/matcher/regex.rb +24 -0
- data/lib/mongoid/matcher/size.rb +16 -0
- data/lib/mongoid/matcher/type.rb +124 -0
- data/lib/mongoid/matcher.rb +59 -52
- data/lib/mongoid/persistable/creatable.rb +25 -29
- data/lib/mongoid/persistable/deletable.rb +10 -23
- data/lib/mongoid/persistable/destroyable.rb +37 -11
- data/lib/mongoid/persistable/incrementable.rb +2 -6
- data/lib/mongoid/persistable/logical.rb +1 -5
- data/lib/mongoid/persistable/maxable.rb +37 -0
- data/lib/mongoid/persistable/minable.rb +37 -0
- data/lib/mongoid/persistable/multipliable.rb +36 -0
- data/lib/mongoid/persistable/poppable.rb +1 -5
- data/lib/mongoid/persistable/pullable.rb +1 -7
- data/lib/mongoid/persistable/pushable.rb +1 -7
- data/lib/mongoid/persistable/renamable.rb +1 -5
- data/lib/mongoid/persistable/savable.rb +14 -8
- data/lib/mongoid/persistable/settable.rb +1 -5
- data/lib/mongoid/persistable/unsettable.rb +3 -7
- data/lib/mongoid/persistable/updatable.rb +114 -28
- data/lib/mongoid/persistable/upsertable.rb +33 -8
- data/lib/mongoid/persistable.rb +17 -27
- data/lib/mongoid/persistence_context.rb +111 -43
- data/lib/mongoid/positional.rb +1 -5
- data/lib/mongoid/railtie.rb +23 -15
- data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
- data/lib/mongoid/railties/console_sandbox.rb +42 -0
- data/lib/mongoid/railties/controller_runtime.rb +21 -6
- data/lib/mongoid/railties/database.rake +19 -2
- data/lib/mongoid/reloadable.rb +45 -42
- data/lib/mongoid/scopable.rb +25 -53
- data/lib/mongoid/search_indexable.rb +167 -0
- data/lib/mongoid/selectable.rb +6 -17
- data/lib/mongoid/serializable.rb +11 -21
- data/lib/mongoid/shardable.rb +50 -16
- data/lib/mongoid/stateful.rb +66 -22
- data/lib/mongoid/stringified_symbol.rb +19 -7
- data/lib/mongoid/tasks/database.rake +25 -0
- data/lib/mongoid/tasks/database.rb +84 -8
- data/lib/mongoid/tasks/encryption.rake +59 -0
- data/lib/mongoid/tasks/encryption.rb +108 -0
- data/lib/mongoid/threaded/lifecycle.rb +6 -26
- data/lib/mongoid/threaded.rb +131 -92
- data/lib/mongoid/timestamps/created/short.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +4 -4
- data/lib/mongoid/timestamps/short.rb +1 -1
- data/lib/mongoid/timestamps/timeless.rb +29 -7
- data/lib/mongoid/timestamps/updated/short.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +3 -5
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/touchable.rb +155 -29
- data/lib/mongoid/traversable.rb +180 -125
- data/lib/mongoid/utils.rb +52 -0
- data/lib/mongoid/validatable/associated.rb +97 -21
- data/lib/mongoid/validatable/format.rb +1 -1
- data/lib/mongoid/validatable/length.rb +1 -1
- data/lib/mongoid/validatable/localizable.rb +2 -4
- data/lib/mongoid/validatable/macros.rb +10 -14
- data/lib/mongoid/validatable/presence.rb +7 -13
- data/lib/mongoid/validatable/queryable.rb +9 -3
- data/lib/mongoid/validatable/uniqueness.rb +26 -39
- data/lib/mongoid/validatable.rb +20 -29
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +37 -0
- data/lib/mongoid.rb +56 -22
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
- data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
- data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
- data/lib/rails/generators/mongoid_generator.rb +13 -1
- data/lib/rails/mongoid.rb +4 -32
- data/spec/config/mongoid.yml +16 -1
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/active_job_spec.rb +32 -0
- data/spec/integration/app_spec.rb +180 -89
- data/spec/integration/associations/belongs_to_spec.rb +19 -1
- data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
- data/spec/integration/associations/embedded_spec.rb +90 -7
- data/spec/integration/associations/embeds_many_spec.rb +197 -1
- data/spec/integration/associations/embeds_one_spec.rb +19 -1
- data/spec/integration/associations/foreign_key_spec.rb +10 -1
- data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
- data/spec/integration/associations/has_many_spec.rb +1 -1
- data/spec/integration/associations/has_one_spec.rb +145 -1
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec.rb +1 -1
- data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
- data/spec/integration/associations/scope_option_spec.rb +102 -0
- data/spec/integration/atomic/modifiers_spec.rb +1 -1
- data/spec/integration/bson_regexp_raw_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +147 -3
- data/spec/integration/callbacks_spec.rb +398 -8
- data/spec/integration/contextual/empty_spec.rb +142 -0
- data/spec/integration/criteria/alias_query_spec.rb +98 -0
- data/spec/integration/criteria/date_field_spec.rb +2 -2
- data/spec/integration/criteria/default_scope_spec.rb +52 -0
- data/spec/integration/criteria/logical_spec.rb +12 -0
- data/spec/integration/criteria/range_spec.rb +358 -0
- data/spec/integration/criteria/raw_value_spec.rb +525 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
- data/spec/integration/discriminator_key_spec.rb +119 -81
- data/spec/integration/discriminator_value_spec.rb +1 -1
- data/spec/integration/document_spec.rb +31 -1
- data/spec/integration/dots_and_dollars_spec.rb +278 -0
- data/spec/integration/encryption_spec.rb +100 -0
- data/spec/integration/i18n_fallbacks_spec.rb +10 -52
- data/spec/integration/matcher_examples_spec.rb +21 -14
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/size.yml +0 -3
- data/spec/integration/matcher_operator_data/type.yml +64 -0
- data/spec/integration/matcher_operator_data/type_array.yml +15 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +26 -3
- data/spec/integration/matcher_spec.rb +50 -1
- data/spec/integration/persistence/range_field_spec.rb +351 -0
- data/spec/integration/server_query_spec.rb +1 -1
- data/spec/integration/shardable_spec.rb +1 -1
- data/spec/integration/stringified_symbol_field_spec.rb +17 -3
- data/spec/lite_spec_helper.rb +47 -14
- data/spec/mongoid/association/accessors_spec.rb +31 -19
- data/spec/mongoid/association/auto_save_spec.rb +73 -34
- data/spec/mongoid/association/builders_spec.rb +2 -2
- data/spec/mongoid/association/constrainable_spec.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +34 -34
- data/spec/mongoid/association/depending_spec.rb +397 -358
- data/spec/mongoid/association/eager_spec.rb +56 -6
- data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
- data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
- data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
- data/spec/mongoid/association/macros_spec.rb +10 -10
- data/spec/mongoid/association/nested/many_spec.rb +1 -1
- data/spec/mongoid/association/nested/one_spec.rb +17 -13
- data/spec/mongoid/association/options_spec.rb +1 -1
- data/spec/mongoid/association/polymorphic_spec.rb +1 -1
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
- data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
- data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
- data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
- data/spec/mongoid/association/reflections_spec.rb +1 -1
- data/spec/mongoid/association/syncable_spec.rb +47 -33
- data/spec/mongoid/association_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
- data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
- data/spec/mongoid/atomic/paths_spec.rb +65 -27
- data/spec/mongoid/atomic_spec.rb +29 -7
- data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
- data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
- data/spec/mongoid/attributes/embedded_spec.rb +118 -0
- data/spec/mongoid/attributes/nested_spec.rb +147 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes/readonly_spec.rb +23 -23
- data/spec/mongoid/attributes_spec.rb +921 -69
- data/spec/mongoid/cacheable_spec.rb +5 -5
- data/spec/mongoid/changeable_spec.rb +468 -76
- data/spec/mongoid/clients/factory_spec.rb +152 -30
- data/spec/mongoid/clients/options_spec.rb +24 -12
- data/spec/mongoid/clients/sessions_spec.rb +49 -71
- data/spec/mongoid/clients/transactions_spec.rb +971 -176
- data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
- data/spec/mongoid/clients_spec.rb +230 -22
- data/spec/mongoid/collection_configurable_spec.rb +159 -0
- data/spec/mongoid/composable_spec.rb +1 -1
- data/spec/mongoid/config/defaults_spec.rb +99 -0
- data/spec/mongoid/config/encryption_spec.rb +152 -0
- data/spec/mongoid/config/environment_spec.rb +126 -39
- data/spec/mongoid/config/introspection_spec.rb +114 -0
- data/spec/mongoid/config/options_spec.rb +1 -1
- data/spec/mongoid/config_spec.rb +375 -43
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
- data/spec/mongoid/contextual/atomic_spec.rb +329 -87
- data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
- data/spec/mongoid/contextual/memory_spec.rb +1479 -127
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
- data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
- data/spec/mongoid/contextual/none_spec.rb +79 -68
- data/spec/mongoid/copyable_spec.rb +465 -23
- data/spec/mongoid/copyable_spec_models.rb +1 -1
- data/spec/mongoid/criteria/findable_spec.rb +295 -229
- data/spec/mongoid/criteria/includable_spec.rb +1493 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
- data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
- data/spec/mongoid/criteria/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
- data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
- data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
- data/spec/mongoid/criteria/scopable_spec.rb +128 -1
- data/spec/mongoid/criteria/translator_spec.rb +133 -0
- data/spec/mongoid/criteria_projection_spec.rb +407 -0
- data/spec/mongoid/criteria_spec.rb +1029 -1806
- data/spec/mongoid/document_fields_spec.rb +180 -5
- data/spec/mongoid/document_persistence_context_spec.rb +77 -1
- data/spec/mongoid/document_query_spec.rb +55 -4
- data/spec/mongoid/document_spec.rb +43 -172
- data/spec/mongoid/equality_spec.rb +7 -8
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
- data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
- data/spec/mongoid/errors/callback_spec.rb +1 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
- data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
- data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
- data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
- data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
- data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
- data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
- data/spec/mongoid/errors/no_environment_spec.rb +4 -4
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
- data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
- data/spec/mongoid/errors/no_parent_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
- data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
- data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
- data/spec/mongoid/errors/validations_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +19 -265
- data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
- data/spec/mongoid/extensions/binary_spec.rb +45 -10
- data/spec/mongoid/extensions/boolean_spec.rb +69 -83
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
- data/spec/mongoid/extensions/date_spec.rb +74 -22
- data/spec/mongoid/extensions/date_time_spec.rb +18 -19
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +2 -9
- data/spec/mongoid/extensions/float_spec.rb +56 -84
- data/spec/mongoid/extensions/hash_spec.rb +45 -219
- data/spec/mongoid/extensions/integer_spec.rb +53 -73
- data/spec/mongoid/extensions/module_spec.rb +1 -1
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +1 -1
- data/spec/mongoid/extensions/object_spec.rb +1 -177
- data/spec/mongoid/extensions/range_spec.rb +254 -64
- data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
- data/spec/mongoid/extensions/regexp_spec.rb +59 -34
- data/spec/mongoid/extensions/set_spec.rb +105 -1
- data/spec/mongoid/extensions/string_spec.rb +21 -104
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
- data/spec/mongoid/extensions/symbol_spec.rb +15 -53
- data/spec/mongoid/extensions/time_spec.rb +345 -131
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
- data/spec/mongoid/extensions/true_class_spec.rb +2 -9
- data/spec/mongoid/factory_spec.rb +63 -2
- data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
- data/spec/mongoid/fields/localized_spec.rb +85 -42
- data/spec/mongoid/fields/standard_spec.rb +1 -1
- data/spec/mongoid/fields_spec.rb +826 -121
- data/spec/mongoid/findable_spec.rb +442 -80
- data/spec/mongoid/indexable/specification_spec.rb +132 -14
- data/spec/mongoid/indexable_spec.rb +361 -23
- data/spec/mongoid/inspectable_spec.rb +93 -5
- data/spec/mongoid/interceptable_spec.rb +926 -116
- data/spec/mongoid/interceptable_spec_models.rb +236 -4
- data/spec/mongoid/loading_spec.rb +110 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
- data/spec/mongoid/mongoizable_spec.rb +286 -0
- data/spec/mongoid/monkey_patches_spec.rb +211 -0
- data/spec/mongoid/persistable/creatable_spec.rb +5 -5
- data/spec/mongoid/persistable/deletable_spec.rb +267 -27
- data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
- data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
- data/spec/mongoid/persistable/logical_spec.rb +42 -5
- data/spec/mongoid/persistable/maxable_spec.rb +147 -0
- data/spec/mongoid/persistable/minable_spec.rb +147 -0
- data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
- data/spec/mongoid/persistable/poppable_spec.rb +41 -5
- data/spec/mongoid/persistable/pullable_spec.rb +81 -9
- data/spec/mongoid/persistable/pushable_spec.rb +81 -9
- data/spec/mongoid/persistable/renamable_spec.rb +40 -4
- data/spec/mongoid/persistable/savable_spec.rb +114 -20
- data/spec/mongoid/persistable/settable_spec.rb +77 -10
- data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
- data/spec/mongoid/persistable/updatable_spec.rb +64 -52
- data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
- data/spec/mongoid/persistable_spec.rb +4 -4
- data/spec/mongoid/persistence_context_spec.rb +58 -59
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
- data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
- data/spec/mongoid/relations/proxy_spec.rb +7 -7
- data/spec/mongoid/reloadable_spec.rb +255 -30
- data/spec/mongoid/scopable_spec.rb +198 -58
- data/spec/mongoid/search_indexable_spec.rb +147 -0
- data/spec/mongoid/selectable_spec.rb +7 -7
- data/spec/mongoid/serializable_spec.rb +19 -40
- data/spec/mongoid/shardable_models.rb +15 -0
- data/spec/mongoid/shardable_spec.rb +181 -31
- data/spec/mongoid/stateful_spec.rb +152 -10
- data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
- data/spec/mongoid/tasks/database_spec.rb +175 -2
- data/spec/mongoid/tasks/encryption_spec.rb +187 -0
- data/spec/mongoid/threaded_spec.rb +40 -3
- data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
- data/spec/mongoid/timestamps/created_spec.rb +2 -2
- data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
- data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
- data/spec/mongoid/timestamps/updated_spec.rb +4 -4
- data/spec/mongoid/timestamps_spec.rb +399 -11
- data/spec/mongoid/timestamps_spec_models.rb +68 -0
- data/spec/mongoid/touchable_spec.rb +971 -54
- data/spec/mongoid/touchable_spec_models.rb +154 -0
- data/spec/mongoid/traversable_spec.rb +79 -37
- data/spec/mongoid/validatable/associated_spec.rb +14 -31
- data/spec/mongoid/validatable/format_spec.rb +1 -1
- data/spec/mongoid/validatable/length_spec.rb +1 -1
- data/spec/mongoid/validatable/numericality_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +27 -23
- data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
- data/spec/mongoid/validatable_spec.rb +4 -4
- data/spec/mongoid/warnings_spec.rb +36 -0
- data/spec/mongoid_spec.rb +61 -11
- data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
- data/spec/rails/mongoid_spec.rb +28 -132
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +24 -4
- data/spec/shared/lib/mrss/constraints.rb +77 -29
- data/spec/shared/lib/mrss/docker_runner.rb +40 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +123 -71
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +187 -40
- data/spec/shared/shlib/set_env.sh +49 -31
- data/spec/spec_helper.rb +46 -49
- data/spec/support/authorization.rb +1 -1
- data/spec/support/client_registry.rb +10 -0
- data/spec/support/constraints.rb +25 -1
- data/spec/support/crypt/models.rb +50 -0
- data/spec/support/crypt.rb +80 -0
- data/spec/support/expectations.rb +1 -1
- data/spec/support/feature_sandbox.rb +72 -0
- data/spec/support/helpers.rb +1 -0
- data/spec/support/immutable_ids.rb +119 -0
- data/spec/support/macros.rb +107 -1
- data/spec/support/models/account.rb +2 -2
- data/spec/support/models/acolyte.rb +1 -1
- data/spec/support/models/actor.rb +1 -1
- data/spec/support/models/actress.rb +1 -1
- data/spec/support/models/address.rb +7 -1
- data/spec/support/models/address_component.rb +1 -1
- data/spec/support/models/address_number.rb +1 -1
- data/spec/support/models/agency.rb +1 -1
- data/spec/support/models/agent.rb +1 -1
- data/spec/support/models/album.rb +1 -1
- data/spec/support/models/alert.rb +1 -1
- data/spec/support/models/animal.rb +1 -1
- data/spec/support/models/answer.rb +1 -1
- data/spec/support/models/appointment.rb +1 -1
- data/spec/support/models/armrest.rb +1 -1
- data/spec/support/models/array_field.rb +1 -1
- data/spec/support/models/article.rb +1 -1
- data/spec/support/models/artist.rb +3 -2
- data/spec/support/models/artwork.rb +1 -1
- data/spec/support/models/audible_sound.rb +4 -0
- data/spec/support/models/audio.rb +1 -1
- data/spec/support/models/augmentation.rb +13 -1
- data/spec/support/models/author.rb +1 -1
- data/spec/support/models/baby.rb +1 -1
- data/spec/support/models/band.rb +13 -1
- data/spec/support/models/bar.rb +1 -1
- data/spec/support/models/basic.rb +1 -1
- data/spec/support/models/bed.rb +1 -1
- data/spec/support/models/big_palette.rb +1 -1
- data/spec/support/models/birthday.rb +1 -1
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/bomb.rb +1 -1
- data/spec/support/models/book.rb +2 -1
- data/spec/support/models/breed.rb +1 -1
- data/spec/support/models/browser.rb +1 -1
- data/spec/support/models/building.rb +3 -1
- data/spec/support/models/building_address.rb +1 -1
- data/spec/support/models/bus.rb +1 -1
- data/spec/support/models/business.rb +1 -1
- data/spec/support/models/callback_test.rb +1 -1
- data/spec/support/models/canvas.rb +1 -1
- data/spec/support/models/car.rb +1 -1
- data/spec/support/models/cat.rb +1 -1
- data/spec/support/models/catalog.rb +25 -0
- data/spec/support/models/category.rb +1 -1
- data/spec/support/models/child.rb +1 -1
- data/spec/support/models/child_doc.rb +4 -4
- data/spec/support/models/church.rb +1 -1
- data/spec/support/models/circle.rb +1 -1
- data/spec/support/models/circuit.rb +1 -1
- data/spec/support/models/circus.rb +4 -1
- data/spec/support/models/code.rb +3 -1
- data/spec/support/models/coding/pull_request.rb +1 -1
- data/spec/support/models/coding.rb +1 -1
- data/spec/support/models/comment.rb +1 -1
- data/spec/support/models/company.rb +1 -1
- data/spec/support/models/consumption_period.rb +1 -1
- data/spec/support/models/contextable_item.rb +1 -1
- data/spec/support/models/contractor.rb +1 -1
- data/spec/support/models/cookie.rb +1 -1
- data/spec/support/models/country_code.rb +3 -1
- data/spec/support/models/courier_job.rb +1 -1
- data/spec/support/models/cover.rb +11 -0
- data/spec/support/models/crate.rb +1 -1
- data/spec/support/models/customer.rb +1 -1
- data/spec/support/models/customer_address.rb +1 -1
- data/spec/support/models/deed.rb +1 -1
- data/spec/support/models/definition.rb +1 -1
- data/spec/support/models/delegating_patient.rb +1 -1
- data/spec/support/models/description.rb +1 -1
- data/spec/support/models/dictionary.rb +1 -1
- data/spec/support/models/division.rb +1 -1
- data/spec/support/models/doctor.rb +1 -1
- data/spec/support/models/dog.rb +1 -1
- data/spec/support/models/dokument.rb +1 -1
- data/spec/support/models/draft.rb +1 -1
- data/spec/support/models/dragon.rb +1 -1
- data/spec/support/models/driver.rb +1 -1
- data/spec/support/models/drug.rb +1 -1
- data/spec/support/models/dungeon.rb +1 -1
- data/spec/support/models/edit.rb +1 -1
- data/spec/support/models/email.rb +1 -1
- data/spec/support/models/employer.rb +1 -1
- data/spec/support/models/entry.rb +1 -1
- data/spec/support/models/eraser.rb +1 -1
- data/spec/support/models/even.rb +1 -1
- data/spec/support/models/event.rb +1 -1
- data/spec/support/models/exhibition.rb +1 -1
- data/spec/support/models/exhibitor.rb +1 -1
- data/spec/support/models/explosion.rb +1 -1
- data/spec/support/models/eye.rb +1 -1
- data/spec/support/models/eye_bowl.rb +1 -1
- data/spec/support/models/face.rb +1 -1
- data/spec/support/models/fanatic.rb +9 -0
- data/spec/support/models/favorite.rb +8 -2
- data/spec/support/models/filesystem.rb +1 -1
- data/spec/support/models/fire_hydrant.rb +1 -1
- data/spec/support/models/firefox.rb +1 -1
- data/spec/support/models/fish.rb +1 -1
- data/spec/support/models/folder.rb +1 -1
- data/spec/support/models/folder_item.rb +1 -1
- data/spec/support/models/fruits.rb +1 -1
- data/spec/support/models/game.rb +1 -1
- data/spec/support/models/ghost.rb +1 -1
- data/spec/support/models/guitar.rb +1 -1
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/home.rb +1 -1
- data/spec/support/models/house.rb +1 -1
- data/spec/support/models/html_writer.rb +1 -1
- data/spec/support/models/id_key.rb +1 -1
- data/spec/support/models/idnodef.rb +1 -1
- data/spec/support/models/image.rb +1 -1
- data/spec/support/models/implant.rb +10 -1
- data/spec/support/models/instrument.rb +1 -1
- data/spec/support/models/item.rb +1 -1
- data/spec/support/models/jar.rb +1 -1
- data/spec/support/models/kaleidoscope.rb +1 -1
- data/spec/support/models/kangaroo.rb +1 -1
- data/spec/support/models/label.rb +5 -2
- data/spec/support/models/language.rb +1 -1
- data/spec/support/models/lat_lng.rb +1 -1
- data/spec/support/models/league.rb +1 -1
- data/spec/support/models/learner.rb +1 -1
- data/spec/support/models/line_item.rb +1 -1
- data/spec/support/models/location.rb +1 -1
- data/spec/support/models/login.rb +1 -1
- data/spec/support/models/manufacturer.rb +1 -1
- data/spec/support/models/meat.rb +1 -1
- data/spec/support/models/membership.rb +2 -1
- data/spec/support/models/message.rb +1 -1
- data/spec/support/models/minim.rb +1 -1
- data/spec/support/models/mixed_drink.rb +1 -1
- data/spec/support/models/mop.rb +10 -1
- data/spec/support/models/movie.rb +1 -1
- data/spec/support/models/my_hash.rb +1 -1
- data/spec/support/models/name.rb +11 -1
- data/spec/support/models/name_only.rb +1 -1
- data/spec/support/models/node.rb +1 -1
- data/spec/support/models/note.rb +1 -1
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/odd.rb +1 -1
- data/spec/support/models/order.rb +3 -1
- data/spec/support/models/ordered_post.rb +2 -2
- data/spec/support/models/ordered_preference.rb +1 -1
- data/spec/support/models/oscar.rb +1 -1
- data/spec/support/models/other_owner_object.rb +1 -1
- data/spec/support/models/override.rb +1 -1
- data/spec/support/models/ownable.rb +1 -1
- data/spec/support/models/owner.rb +1 -1
- data/spec/support/models/pack.rb +1 -1
- data/spec/support/models/page.rb +1 -1
- data/spec/support/models/page_question.rb +1 -1
- data/spec/support/models/palette.rb +1 -1
- data/spec/support/models/parent.rb +1 -1
- data/spec/support/models/parent_doc.rb +1 -1
- data/spec/support/models/passport.rb +15 -1
- data/spec/support/models/patient.rb +1 -1
- data/spec/support/models/pdf_writer.rb +1 -1
- data/spec/support/models/pencil.rb +1 -1
- data/spec/support/models/person.rb +19 -1
- data/spec/support/models/pet.rb +1 -1
- data/spec/support/models/pet_owner.rb +1 -1
- data/spec/support/models/phone.rb +3 -2
- data/spec/support/models/piano.rb +1 -1
- data/spec/support/models/pizza.rb +1 -1
- data/spec/support/models/player.rb +3 -1
- data/spec/support/models/post.rb +1 -1
- data/spec/support/models/post_genre.rb +1 -1
- data/spec/support/models/powerup.rb +13 -1
- data/spec/support/models/preference.rb +1 -1
- data/spec/support/models/princess.rb +1 -1
- data/spec/support/models/product.rb +2 -1
- data/spec/support/models/profile.rb +1 -1
- data/spec/support/models/pronunciation.rb +1 -1
- data/spec/support/models/pub.rb +1 -1
- data/spec/support/models/publication/encyclopedia.rb +1 -1
- data/spec/support/models/publication/review.rb +1 -1
- data/spec/support/models/publication.rb +1 -1
- data/spec/support/models/purchase.rb +1 -1
- data/spec/support/models/purchased_item.rb +11 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/support/models/question.rb +1 -1
- data/spec/support/models/quiz.rb +1 -1
- data/spec/support/models/rating.rb +1 -1
- data/spec/support/models/record.rb +1 -1
- data/spec/support/models/registry.rb +2 -1
- data/spec/support/models/role.rb +1 -1
- data/spec/support/models/root_category.rb +1 -1
- data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
- data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_message.rb +4 -0
- data/spec/support/models/sandbox/sandbox_user.rb +4 -0
- data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
- data/spec/support/models/sandwich.rb +1 -1
- data/spec/support/models/scheduler.rb +1 -1
- data/spec/support/models/school.rb +15 -0
- data/spec/support/models/scribe.rb +1 -1
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/seat.rb +1 -1
- data/spec/support/models/seo.rb +1 -1
- data/spec/support/models/series.rb +1 -1
- data/spec/support/models/server.rb +1 -1
- data/spec/support/models/service.rb +1 -1
- data/spec/support/models/shape.rb +1 -1
- data/spec/support/models/shelf.rb +1 -1
- data/spec/support/models/shield.rb +19 -0
- data/spec/support/models/shipment_address.rb +1 -1
- data/spec/support/models/shipping_container.rb +1 -1
- data/spec/support/models/shipping_pack.rb +1 -1
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/shop.rb +1 -1
- data/spec/support/models/short_agent.rb +1 -1
- data/spec/support/models/short_quiz.rb +1 -1
- data/spec/support/models/simple.rb +1 -1
- data/spec/support/models/slave.rb +1 -1
- data/spec/support/models/song.rb +1 -1
- data/spec/support/models/sound.rb +1 -1
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/square.rb +1 -1
- data/spec/support/models/staff.rb +1 -1
- data/spec/support/models/store_as_dup_test1.rb +1 -1
- data/spec/support/models/store_as_dup_test2.rb +1 -1
- data/spec/support/models/store_as_dup_test3.rb +1 -1
- data/spec/support/models/store_as_dup_test4.rb +1 -1
- data/spec/support/models/strategy.rb +1 -1
- data/spec/support/models/student.rb +15 -0
- data/spec/support/models/sub_item.rb +1 -1
- data/spec/support/models/subscription.rb +1 -1
- data/spec/support/models/survey.rb +1 -1
- data/spec/support/models/symptom.rb +1 -1
- data/spec/support/models/system_role.rb +1 -0
- data/spec/support/models/tag.rb +1 -1
- data/spec/support/models/target.rb +1 -1
- data/spec/support/models/template.rb +1 -1
- data/spec/support/models/thing.rb +1 -1
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/title.rb +1 -1
- data/spec/support/models/tool.rb +1 -1
- data/spec/support/models/topping.rb +1 -1
- data/spec/support/models/toy.rb +1 -1
- data/spec/support/models/track.rb +1 -1
- data/spec/support/models/translation.rb +1 -1
- data/spec/support/models/tree.rb +1 -1
- data/spec/support/models/truck.rb +1 -1
- data/spec/support/models/updatable.rb +1 -1
- data/spec/support/models/user.rb +1 -1
- data/spec/support/models/user_account.rb +1 -1
- data/spec/support/models/validation_callback.rb +1 -1
- data/spec/support/models/vehicle.rb +1 -1
- data/spec/support/models/version.rb +1 -1
- data/spec/support/models/vertex.rb +1 -1
- data/spec/support/models/vet_visit.rb +1 -1
- data/spec/support/models/video.rb +1 -1
- data/spec/support/models/video_game.rb +1 -1
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/models/weapon.rb +13 -1
- data/spec/support/models/wiki_page.rb +1 -1
- data/spec/support/models/word.rb +1 -1
- data/spec/support/models/word_origin.rb +1 -1
- data/spec/support/models/writer.rb +1 -1
- data/spec/support/rails_mock.rb +32 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/shared/time.rb +3 -22
- data/spec/support/sinatra_mock.rb +7 -0
- data/spec/support/spec_config.rb +42 -7
- data.tar.gz.sig +0 -0
- metadata +883 -562
- metadata.gz.sig +0 -0
- data/lib/mongoid/association/referenced/eager.rb +0 -184
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
- data/lib/mongoid/contextual/geo_near.rb +0 -269
- data/lib/mongoid/errors/eager_load.rb +0 -26
- data/lib/mongoid/errors/invalid_session_use.rb +0 -26
- data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
- data/lib/mongoid/errors/invalid_value.rb +0 -18
- data/lib/mongoid/query_cache.rb +0 -333
- data/lib/support/ruby_version.rb +0 -29
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
- data/spec/mongoid/extensions_spec.rb +0 -32
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
- data/spec/mongoid/query_cache_spec.rb +0 -978
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Association
|
|
@@ -16,16 +16,14 @@ module Mongoid
|
|
|
16
16
|
# @example Build the association.
|
|
17
17
|
# person.__build__(:addresses, { :_id => 1 }, association)
|
|
18
18
|
#
|
|
19
|
-
# @param [ String
|
|
20
|
-
# @param [ Hash
|
|
21
|
-
# @param [ Association ] association The association metadata.
|
|
19
|
+
# @param [ String | Symbol ] name The name of the association.
|
|
20
|
+
# @param [ Hash | BSON::ObjectId ] object The id or attributes to use.
|
|
21
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
22
22
|
# @param [ Hash ] selected_fields Fields which were retrieved via #only.
|
|
23
23
|
# If selected_fields is specified, fields not listed in it will not be
|
|
24
24
|
# accessible in the built document.
|
|
25
25
|
#
|
|
26
26
|
# @return [ Proxy ] The association.
|
|
27
|
-
#
|
|
28
|
-
# @since 2.0.0.rc.1
|
|
29
27
|
def __build__(name, object, association, selected_fields = nil)
|
|
30
28
|
relation = create_relation(object, association, selected_fields)
|
|
31
29
|
set_relation(name, relation)
|
|
@@ -36,19 +34,32 @@ module Mongoid
|
|
|
36
34
|
# @example Create the association.
|
|
37
35
|
# person.create_relation(document, association)
|
|
38
36
|
#
|
|
39
|
-
# @param [ Document
|
|
40
|
-
# @param [ Association ] association The association metadata.
|
|
37
|
+
# @param [ Document | Array<Document> ] object The association target.
|
|
38
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
41
39
|
# @param [ Hash ] selected_fields Fields which were retrieved via #only.
|
|
42
40
|
# If selected_fields is specified, fields not listed in it will not be
|
|
43
41
|
# accessible in the created association document.
|
|
44
42
|
#
|
|
45
43
|
# @return [ Proxy ] The association.
|
|
46
|
-
#
|
|
47
|
-
# @since 2.0.0.rc.1
|
|
48
44
|
def create_relation(object, association, selected_fields = nil)
|
|
49
45
|
type = @attributes[association.inverse_type]
|
|
50
|
-
target = association.build(self, object, type, selected_fields)
|
|
51
|
-
|
|
46
|
+
target = if t = association.build(self, object, type, selected_fields)
|
|
47
|
+
association.create_relation(self, t)
|
|
48
|
+
else
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Only need to do this on embedded associations. The pending callbacks
|
|
53
|
+
# are only added when materializing the documents, which only happens
|
|
54
|
+
# on embedded associations. There is no call to the database in the
|
|
55
|
+
# construction of a referenced association.
|
|
56
|
+
if association.embedded?
|
|
57
|
+
Array(target).each do |doc|
|
|
58
|
+
doc.try(:run_pending_callbacks)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
target
|
|
52
63
|
end
|
|
53
64
|
|
|
54
65
|
# Resets the criteria inside the association proxy. Used by many-to-many
|
|
@@ -58,8 +69,6 @@ module Mongoid
|
|
|
58
69
|
# person.reset_relation_criteria(:preferences)
|
|
59
70
|
#
|
|
60
71
|
# @param [ Symbol ] name The name of the association.
|
|
61
|
-
#
|
|
62
|
-
# @since 3.0.14
|
|
63
72
|
def reset_relation_criteria(name)
|
|
64
73
|
if instance_variable_defined?("@_#{name}")
|
|
65
74
|
send(name).reset_unloaded
|
|
@@ -72,12 +81,10 @@ module Mongoid
|
|
|
72
81
|
# @example Set the proxy on the document.
|
|
73
82
|
# person.set(:addresses, addresses)
|
|
74
83
|
#
|
|
75
|
-
# @param [ String
|
|
84
|
+
# @param [ String | Symbol ] name The name of the association.
|
|
76
85
|
# @param [ Proxy ] relation The association to set.
|
|
77
86
|
#
|
|
78
87
|
# @return [ Proxy ] The association.
|
|
79
|
-
#
|
|
80
|
-
# @since 2.0.0.rc.1
|
|
81
88
|
def set_relation(name, relation)
|
|
82
89
|
instance_variable_set("@_#{name}", relation)
|
|
83
90
|
end
|
|
@@ -93,14 +100,25 @@ module Mongoid
|
|
|
93
100
|
# document.get_relation(:name, association)
|
|
94
101
|
#
|
|
95
102
|
# @param [ Symbol ] name The name of the association.
|
|
96
|
-
# @param [ Association ] association The association metadata.
|
|
103
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
97
104
|
# @param [ Object ] object The object used to build the association.
|
|
98
|
-
# @param [ true
|
|
105
|
+
# @param [ true | false ] reload If the association is to be reloaded.
|
|
99
106
|
#
|
|
100
107
|
# @return [ Proxy ] The association.
|
|
101
|
-
#
|
|
102
|
-
# @since 3.0.16
|
|
103
108
|
def get_relation(name, association, object, reload = false)
|
|
109
|
+
field_name = database_field_name(name)
|
|
110
|
+
|
|
111
|
+
# As per the comments under MONGOID-5034, I've decided to only raise on
|
|
112
|
+
# embedded associations for a missing attribute. Rails does not raise
|
|
113
|
+
# for a missing attribute on referenced associations.
|
|
114
|
+
# We also don't want to raise if we're retrieving an association within
|
|
115
|
+
# the codebase. This is often done when retrieving the inverse association
|
|
116
|
+
# during binding or when cascading callbacks. Whenever we retrieve
|
|
117
|
+
# associations within the codebase, we use without_autobuild.
|
|
118
|
+
if !without_autobuild? && association.embedded? && attribute_missing?(field_name)
|
|
119
|
+
raise Mongoid::Errors::AttributeNotLoaded.new(self.class, field_name)
|
|
120
|
+
end
|
|
121
|
+
|
|
104
122
|
if !reload && (value = ivar(name)) != false
|
|
105
123
|
value
|
|
106
124
|
else
|
|
@@ -121,6 +139,9 @@ module Mongoid
|
|
|
121
139
|
# (embedded) association with the given key, or nil if no projection
|
|
122
140
|
# is to be performed.
|
|
123
141
|
#
|
|
142
|
+
# Also returns nil if exclusionary projection was requested but it does
|
|
143
|
+
# not exclude the field of the association.
|
|
144
|
+
#
|
|
124
145
|
# For example, if __selected_fields is {'a' => 1, 'b.c' => 2, 'b.c.f' => 3},
|
|
125
146
|
# and assoc_key is 'b', return value would be {'c' => 2, 'c.f' => 3}.
|
|
126
147
|
#
|
|
@@ -132,6 +153,15 @@ module Mongoid
|
|
|
132
153
|
def _mongoid_filter_selected_fields(assoc_key)
|
|
133
154
|
return nil unless __selected_fields
|
|
134
155
|
|
|
156
|
+
# If the list of fields was specified using #without instead of #only
|
|
157
|
+
# and the provided list does not include the association, any of its
|
|
158
|
+
# fields should be allowed.
|
|
159
|
+
if __selected_fields.values.all? { |v| v == 0 } &&
|
|
160
|
+
__selected_fields.keys.none? { |k| k.split('.', 2).first == assoc_key }
|
|
161
|
+
then
|
|
162
|
+
return nil
|
|
163
|
+
end
|
|
164
|
+
|
|
135
165
|
projecting_assoc = false
|
|
136
166
|
|
|
137
167
|
filtered = {}
|
|
@@ -177,7 +207,7 @@ module Mongoid
|
|
|
177
207
|
|
|
178
208
|
# Positional projection is specified as "foo.$". In this case the
|
|
179
209
|
# document that the $ is referring to should be retrieved with all
|
|
180
|
-
# fields. See https://
|
|
210
|
+
# fields. See https://www.mongodb.com/docs/manual/reference/operator/projection/positional/
|
|
181
211
|
# and https://jira.mongodb.org/browse/MONGOID-4769.
|
|
182
212
|
if filtered.keys == %w($)
|
|
183
213
|
filtered = nil
|
|
@@ -196,9 +226,7 @@ module Mongoid
|
|
|
196
226
|
# @example Is autobuild disabled?
|
|
197
227
|
# document.without_autobuild?
|
|
198
228
|
#
|
|
199
|
-
# @return [ true
|
|
200
|
-
#
|
|
201
|
-
# @since 3.0.0
|
|
229
|
+
# @return [ true | false ] If autobuild is disabled.
|
|
202
230
|
def without_autobuild?
|
|
203
231
|
Threaded.executing?(:without_autobuild)
|
|
204
232
|
end
|
|
@@ -211,8 +239,6 @@ module Mongoid
|
|
|
211
239
|
# end
|
|
212
240
|
#
|
|
213
241
|
# @return [ Object ] The result of the yield.
|
|
214
|
-
#
|
|
215
|
-
# @since 3.0.0
|
|
216
242
|
def without_autobuild
|
|
217
243
|
Threaded.begin_execution("without_autobuild")
|
|
218
244
|
yield
|
|
@@ -226,11 +252,9 @@ module Mongoid
|
|
|
226
252
|
# @example Parse the args.
|
|
227
253
|
# doc.parse_args(:name => "Joe")
|
|
228
254
|
#
|
|
229
|
-
# @param [
|
|
255
|
+
# @param [ Hash... ] *args The arguments.
|
|
230
256
|
#
|
|
231
257
|
# @return [ Array<Hash> ] The attributes and options.
|
|
232
|
-
#
|
|
233
|
-
# @since 2.3.4
|
|
234
258
|
def parse_args(*args)
|
|
235
259
|
[args.first || {}, args.size > 1 ? args[1] : {}]
|
|
236
260
|
end
|
|
@@ -245,11 +269,9 @@ module Mongoid
|
|
|
245
269
|
# person.has_game?
|
|
246
270
|
# person.game?
|
|
247
271
|
#
|
|
248
|
-
# @param [ Association ] association The association.
|
|
272
|
+
# @param [ Mongoid::Association::Relatable ] association The association.
|
|
249
273
|
#
|
|
250
274
|
# @return [ Class ] The model being set up.
|
|
251
|
-
#
|
|
252
|
-
# @since 3.0.0
|
|
253
275
|
def self.define_existence_check!(association)
|
|
254
276
|
name = association.name
|
|
255
277
|
association.inverse_class.tap do |klass|
|
|
@@ -269,11 +291,9 @@ module Mongoid
|
|
|
269
291
|
# @example Set up the getter for the association.
|
|
270
292
|
# Person.define_getter!(association)
|
|
271
293
|
#
|
|
272
|
-
# @param [ Association ] association The association metadata for the association.
|
|
294
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata for the association.
|
|
273
295
|
#
|
|
274
296
|
# @return [ Class ] The class being set up.
|
|
275
|
-
#
|
|
276
|
-
# @since 2.0.0.rc.1
|
|
277
297
|
def self.define_getter!(association)
|
|
278
298
|
name = association.name
|
|
279
299
|
association.inverse_class.tap do |klass|
|
|
@@ -293,14 +313,14 @@ module Mongoid
|
|
|
293
313
|
# @example Set up the ids getter for the association.
|
|
294
314
|
# Person.define_ids_getter!(association)
|
|
295
315
|
#
|
|
296
|
-
# @param [ Association ] association The association metadata for the association.
|
|
316
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata for the association.
|
|
297
317
|
#
|
|
298
318
|
# @return [ Class ] The class being set up.
|
|
299
319
|
def self.define_ids_getter!(association)
|
|
300
320
|
ids_method = "#{association.name.to_s.singularize}_ids"
|
|
301
321
|
association.inverse_class.tap do |klass|
|
|
302
322
|
klass.re_define_method(ids_method) do
|
|
303
|
-
send(association.name).
|
|
323
|
+
send(association.name).pluck(:_id)
|
|
304
324
|
end
|
|
305
325
|
end
|
|
306
326
|
end
|
|
@@ -313,23 +333,20 @@ module Mongoid
|
|
|
313
333
|
# @example Set up the setter for the association.
|
|
314
334
|
# Person.define_setter!(association)
|
|
315
335
|
#
|
|
316
|
-
# @param [ Association ] association The association metadata for the association.
|
|
336
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata for the association.
|
|
317
337
|
#
|
|
318
338
|
# @return [ Class ] The class being set up.
|
|
319
|
-
#
|
|
320
|
-
# @since 2.0.0.rc.1
|
|
321
339
|
def self.define_setter!(association)
|
|
322
340
|
name = association.name
|
|
323
341
|
association.inverse_class.tap do |klass|
|
|
324
342
|
klass.re_define_method("#{name}=") do |object|
|
|
325
343
|
without_autobuild do
|
|
326
344
|
if value = get_relation(name, association, object)
|
|
327
|
-
if value.respond_to?(:substitute)
|
|
328
|
-
|
|
329
|
-
else
|
|
330
|
-
value = __build__(name, value, association)
|
|
331
|
-
set_relation(name, value.substitute(object.substitutable))
|
|
345
|
+
if !value.respond_to?(:substitute)
|
|
346
|
+
value = __build__(name, value, association)
|
|
332
347
|
end
|
|
348
|
+
|
|
349
|
+
set_relation(name, value.substitute(object.substitutable))
|
|
333
350
|
else
|
|
334
351
|
__build__(name, object.substitutable, association)
|
|
335
352
|
end
|
|
@@ -347,11 +364,12 @@ module Mongoid
|
|
|
347
364
|
# @example Set up the id_setter for the association.
|
|
348
365
|
# Person.define_ids_setter!(association)
|
|
349
366
|
#
|
|
350
|
-
# @param [ Association ] association The association for the association.
|
|
367
|
+
# @param [ Mongoid::Association::Relatable ] association The association for the association.
|
|
351
368
|
#
|
|
352
369
|
# @return [ Class ] The class being set up.
|
|
353
370
|
def self.define_ids_setter!(association)
|
|
354
371
|
ids_method = "#{association.name.to_s.singularize}_ids="
|
|
372
|
+
association.inverse_class.aliased_associations[ids_method.chop] = association.name.to_s
|
|
355
373
|
association.inverse_class.tap do |klass|
|
|
356
374
|
klass.re_define_method(ids_method) do |ids|
|
|
357
375
|
send(association.setter, association.relation_class.find(ids.reject(&:blank?)))
|
|
@@ -365,11 +383,9 @@ module Mongoid
|
|
|
365
383
|
# @example
|
|
366
384
|
# Person.define_builder!(association)
|
|
367
385
|
#
|
|
368
|
-
# @param [ Association ] association The association for the association.
|
|
386
|
+
# @param [ Mongoid::Association::Relatable ] association The association for the association.
|
|
369
387
|
#
|
|
370
388
|
# @return [ Class ] The class being set up.
|
|
371
|
-
#
|
|
372
|
-
# @since 2.0.0.rc.1
|
|
373
389
|
def self.define_builder!(association)
|
|
374
390
|
name = association.name
|
|
375
391
|
association.inverse_class.tap do |klass|
|
|
@@ -392,11 +408,9 @@ module Mongoid
|
|
|
392
408
|
# @example
|
|
393
409
|
# Person.define_creator!(association)
|
|
394
410
|
#
|
|
395
|
-
# @param [ Association ] association The association for the association.
|
|
411
|
+
# @param [ Mongoid::Association::Relatable ] association The association for the association.
|
|
396
412
|
#
|
|
397
413
|
# @return [ Class ] The class being set up.
|
|
398
|
-
#
|
|
399
|
-
# @since 2.0.0.rc.1
|
|
400
414
|
def self.define_creator!(association)
|
|
401
415
|
name = association.name
|
|
402
416
|
association.inverse_class.tap do |klass|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Association
|
|
@@ -16,10 +16,8 @@ module Mongoid
|
|
|
16
16
|
# Binding.new(base, target, association)
|
|
17
17
|
#
|
|
18
18
|
# @param [ Document ] base The base of the binding.
|
|
19
|
-
# @param [ Document
|
|
20
|
-
# @param [ Association ] association The association metadata.
|
|
21
|
-
#
|
|
22
|
-
# @since 2.0.0.rc.1
|
|
19
|
+
# @param [ Document | Array<Document> ] target The target of the binding.
|
|
20
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
23
21
|
def initialize(base, target, association)
|
|
24
22
|
@_base, @_target, @_association = base, target, association
|
|
25
23
|
end
|
|
@@ -32,8 +30,6 @@ module Mongoid
|
|
|
32
30
|
# end
|
|
33
31
|
#
|
|
34
32
|
# @return [ Object ] The result of the yield.
|
|
35
|
-
#
|
|
36
|
-
# @since 3.0.0
|
|
37
33
|
def binding
|
|
38
34
|
unless _binding?
|
|
39
35
|
_binding do
|
|
@@ -54,8 +50,6 @@ module Mongoid
|
|
|
54
50
|
# @param [ Document ] doc The document getting bound.
|
|
55
51
|
#
|
|
56
52
|
# @raise [ Errors::InverseNotFound ] If no inverse found.
|
|
57
|
-
#
|
|
58
|
-
# @since 3.0.0
|
|
59
53
|
def check_inverse!(doc)
|
|
60
54
|
unless _association.bindable?(doc)
|
|
61
55
|
raise Errors::InverseNotFound.new(
|
|
@@ -67,6 +61,53 @@ module Mongoid
|
|
|
67
61
|
end
|
|
68
62
|
end
|
|
69
63
|
|
|
64
|
+
# Remove the associated document from the inverse's association.
|
|
65
|
+
#
|
|
66
|
+
# @param [ Document ] doc The document to remove.
|
|
67
|
+
def remove_associated(doc)
|
|
68
|
+
if inverse = _association.inverse(doc)
|
|
69
|
+
if _association.many?
|
|
70
|
+
remove_associated_many(doc, inverse)
|
|
71
|
+
elsif _association.in_to?
|
|
72
|
+
remove_associated_in_to(doc, inverse)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Remove the associated document from the inverse's association.
|
|
78
|
+
#
|
|
79
|
+
# This method removes the associated on *_many relationships.
|
|
80
|
+
#
|
|
81
|
+
# @param [ Document ] doc The document to remove.
|
|
82
|
+
# @param [ Symbol ] inverse The name of the inverse.
|
|
83
|
+
def remove_associated_many(doc, inverse)
|
|
84
|
+
# We only want to remove the inverse association when the inverse
|
|
85
|
+
# document is in memory.
|
|
86
|
+
if inv = doc.ivar(inverse)
|
|
87
|
+
# This first condition is needed because when assigning the
|
|
88
|
+
# embeds_many association using the same embeds_many
|
|
89
|
+
# association, we delete from the array we are about to assign.
|
|
90
|
+
if _base != inv && (associated = inv.ivar(_association.name))
|
|
91
|
+
associated.delete(doc)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Remove the associated document from the inverse's association.
|
|
97
|
+
#
|
|
98
|
+
# This method removes associated on belongs_to and embedded_in
|
|
99
|
+
# associations.
|
|
100
|
+
#
|
|
101
|
+
# @param [ Document ] doc The document to remove.
|
|
102
|
+
# @param [ Symbol ] inverse The name of the inverse.
|
|
103
|
+
def remove_associated_in_to(doc, inverse)
|
|
104
|
+
# We only want to remove the inverse association when the inverse
|
|
105
|
+
# document is in memory.
|
|
106
|
+
if associated = doc.ivar(inverse)
|
|
107
|
+
associated.send(_association.setter, nil)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
70
111
|
# Set the id of the related document in the foreign key field on the
|
|
71
112
|
# keyed document.
|
|
72
113
|
#
|
|
@@ -77,11 +118,9 @@ module Mongoid
|
|
|
77
118
|
#
|
|
78
119
|
# @param [ Document ] keyed The document that stores the foreign key.
|
|
79
120
|
# @param [ Object ] id The id of the bound document.
|
|
80
|
-
#
|
|
81
|
-
# @since 3.0.0
|
|
82
121
|
def bind_foreign_key(keyed, id)
|
|
83
122
|
unless keyed.frozen?
|
|
84
|
-
keyed
|
|
123
|
+
try_method(keyed, _association.foreign_key_setter, id)
|
|
85
124
|
end
|
|
86
125
|
end
|
|
87
126
|
|
|
@@ -95,11 +134,9 @@ module Mongoid
|
|
|
95
134
|
#
|
|
96
135
|
# @param [ Document ] typed The document that stores the type field.
|
|
97
136
|
# @param [ String ] name The name of the model.
|
|
98
|
-
#
|
|
99
|
-
# @since 3.0.0
|
|
100
137
|
def bind_polymorphic_type(typed, name)
|
|
101
|
-
if _association.type
|
|
102
|
-
typed
|
|
138
|
+
if _association.type && !typed.frozen?
|
|
139
|
+
try_method(typed, _association.type_setter, name)
|
|
103
140
|
end
|
|
104
141
|
end
|
|
105
142
|
|
|
@@ -113,11 +150,9 @@ module Mongoid
|
|
|
113
150
|
#
|
|
114
151
|
# @param [ Document ] typed The document that stores the type field.
|
|
115
152
|
# @param [ String ] name The name of the model.
|
|
116
|
-
#
|
|
117
|
-
# @since 3.0.0
|
|
118
153
|
def bind_polymorphic_inverse_type(typed, name)
|
|
119
|
-
if _association.inverse_type
|
|
120
|
-
typed
|
|
154
|
+
if _association.inverse_type && !typed.frozen?
|
|
155
|
+
try_method(typed, _association.inverse_type_setter, name)
|
|
121
156
|
end
|
|
122
157
|
end
|
|
123
158
|
|
|
@@ -131,11 +166,9 @@ module Mongoid
|
|
|
131
166
|
#
|
|
132
167
|
# @param [ Document ] doc The base document.
|
|
133
168
|
# @param [ Document ] inverse The inverse document.
|
|
134
|
-
#
|
|
135
|
-
# @since 3.0.0
|
|
136
169
|
def bind_inverse(doc, inverse)
|
|
137
|
-
if doc.respond_to?(_association.inverse_setter)
|
|
138
|
-
doc
|
|
170
|
+
if doc.respond_to?(_association.inverse_setter) && !doc.frozen?
|
|
171
|
+
try_method(doc, _association.inverse_setter, inverse)
|
|
139
172
|
end
|
|
140
173
|
end
|
|
141
174
|
|
|
@@ -147,10 +180,9 @@ module Mongoid
|
|
|
147
180
|
# binding.bind_from_relational_parent(doc)
|
|
148
181
|
#
|
|
149
182
|
# @param [ Document ] doc The document to bind.
|
|
150
|
-
#
|
|
151
|
-
# @since 3.0.0
|
|
152
183
|
def bind_from_relational_parent(doc)
|
|
153
184
|
check_inverse!(doc)
|
|
185
|
+
remove_associated(doc)
|
|
154
186
|
bind_foreign_key(doc, record_id(_base))
|
|
155
187
|
bind_polymorphic_type(doc, _base.class.name)
|
|
156
188
|
bind_inverse(doc, _base)
|
|
@@ -169,9 +201,7 @@ module Mongoid
|
|
|
169
201
|
# @example Set the base association.
|
|
170
202
|
# binding.set_base_association
|
|
171
203
|
#
|
|
172
|
-
# @return [ true
|
|
173
|
-
#
|
|
174
|
-
# @since 2.4.4
|
|
204
|
+
# @return [ true | false ] If the association changed.
|
|
175
205
|
def set_base_association
|
|
176
206
|
inverse_association = _association.inverse_association(_target)
|
|
177
207
|
if inverse_association != _association && !inverse_association.nil?
|
|
@@ -187,14 +217,30 @@ module Mongoid
|
|
|
187
217
|
# unbinding.unbind_from_relational_parent(doc)
|
|
188
218
|
#
|
|
189
219
|
# @param [ Document ] doc The document to unbind.
|
|
190
|
-
#
|
|
191
|
-
# @since 3.0.0
|
|
192
220
|
def unbind_from_relational_parent(doc)
|
|
193
221
|
check_inverse!(doc)
|
|
194
222
|
bind_foreign_key(doc, nil)
|
|
195
223
|
bind_polymorphic_type(doc, nil)
|
|
196
224
|
bind_inverse(doc, nil)
|
|
197
225
|
end
|
|
226
|
+
|
|
227
|
+
# Convenience method to perform +#try+ but return
|
|
228
|
+
# nil if the method argument is nil.
|
|
229
|
+
#
|
|
230
|
+
# @example Call method if it exists.
|
|
231
|
+
# object.try_method(:use, "The Force")
|
|
232
|
+
#
|
|
233
|
+
# @example Return nil if method argument is nil.
|
|
234
|
+
# object.try_method(nil, "The Force") #=> nil
|
|
235
|
+
#
|
|
236
|
+
# @param [ String | Symbol ] method_name The method name.
|
|
237
|
+
# @param [ Object... ] *args The arguments.
|
|
238
|
+
#
|
|
239
|
+
# @return [ Object | nil ] The result of the try or nil if the
|
|
240
|
+
# method does not exist.
|
|
241
|
+
def try_method(object, method_name, *args)
|
|
242
|
+
object.try(method_name, *args) if method_name
|
|
243
|
+
end
|
|
198
244
|
end
|
|
199
245
|
end
|
|
200
246
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Association
|
|
@@ -17,8 +17,6 @@ module Mongoid
|
|
|
17
17
|
# # The following methods get created:
|
|
18
18
|
# person.build_name({ :first_name => "Durran" })
|
|
19
19
|
# person.create_name({ :first_name => "Durran" })
|
|
20
|
-
#
|
|
21
|
-
# @since 2.0.0.rc.1
|
|
22
20
|
module Builders
|
|
23
21
|
extend ActiveSupport::Concern
|
|
24
22
|
|
|
@@ -30,11 +28,9 @@ module Mongoid
|
|
|
30
28
|
# @example Parse the args.
|
|
31
29
|
# doc.parse_args(:name => "Joe")
|
|
32
30
|
#
|
|
33
|
-
# @param [
|
|
31
|
+
# @param [ Hash... ] *args The arguments.
|
|
34
32
|
#
|
|
35
33
|
# @return [ Array<Hash> ] The attributes and options.
|
|
36
|
-
#
|
|
37
|
-
# @since 2.3.4
|
|
38
34
|
def parse_args(*args)
|
|
39
35
|
[ args.first || {}, args.size > 1 ? args[1] : {} ]
|
|
40
36
|
end
|
|
@@ -44,18 +40,17 @@ module Mongoid
|
|
|
44
40
|
# @example
|
|
45
41
|
# Person.define_builder!(association)
|
|
46
42
|
#
|
|
47
|
-
# @param [ Association ] association The association metadata
|
|
43
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
48
44
|
#
|
|
49
45
|
# @return [ Class ] The class being set up.
|
|
50
|
-
#
|
|
51
|
-
# @since 2.0.0.rc.1
|
|
52
46
|
def self.define_builder!(association)
|
|
53
47
|
association.inverse_class.tap do |klass|
|
|
54
48
|
klass.re_define_method("build_#{association.name}") do |*args|
|
|
55
49
|
attributes, _options = parse_args(*args)
|
|
56
|
-
document = Factory.
|
|
50
|
+
document = Factory.execute_build(association.relation_class, attributes, execute_callbacks: false)
|
|
57
51
|
_building do
|
|
58
52
|
child = send("#{association.name}=", document)
|
|
53
|
+
child.run_pending_callbacks
|
|
59
54
|
child.run_callbacks(:build)
|
|
60
55
|
child
|
|
61
56
|
end
|
|
@@ -69,19 +64,18 @@ module Mongoid
|
|
|
69
64
|
# @example
|
|
70
65
|
# Person.define_creator!(association)
|
|
71
66
|
#
|
|
72
|
-
# @param [ Association ] association The association metadata
|
|
67
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
73
68
|
#
|
|
74
69
|
# @return [ Class ] The class being set up.
|
|
75
|
-
#
|
|
76
|
-
# @since 2.0.0.rc.1
|
|
77
70
|
def self.define_creator!(association)
|
|
78
71
|
association.inverse_class.tap do |klass|
|
|
79
72
|
klass.re_define_method("create_#{association.name}") do |*args|
|
|
80
73
|
attributes, _options = parse_args(*args)
|
|
81
|
-
document = Factory.
|
|
74
|
+
document = Factory.execute_build(association.relation_class, attributes, execute_callbacks: false)
|
|
82
75
|
doc = _assigning do
|
|
83
76
|
send("#{association.name}=", document)
|
|
84
77
|
end
|
|
78
|
+
doc.run_pending_callbacks
|
|
85
79
|
doc.save
|
|
86
80
|
save if new_record? && association.stores_foreign_key?
|
|
87
81
|
doc
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Association
|
|
6
6
|
|
|
7
7
|
# Used for converting foreign key values to the correct type based on the
|
|
8
8
|
# types of ids that the document stores.
|
|
9
|
-
#
|
|
10
9
|
module Constrainable
|
|
11
10
|
|
|
12
11
|
# Convert the supplied object to the appropriate type to set as the
|
|
@@ -18,8 +17,6 @@ module Mongoid
|
|
|
18
17
|
# @param [ Object ] object The object to convert.
|
|
19
18
|
#
|
|
20
19
|
# @return [ Object ] The object cast to the correct type.
|
|
21
|
-
#
|
|
22
|
-
# @since 2.0.0.rc.7
|
|
23
20
|
def convert_to_foreign_key(object)
|
|
24
21
|
return convert_polymorphic(object) if polymorphic?
|
|
25
22
|
field = relation_class.fields["_id"]
|
|
@@ -36,7 +33,7 @@ module Mongoid
|
|
|
36
33
|
|
|
37
34
|
def convert_polymorphic(object)
|
|
38
35
|
if object.is_a?(Mongoid::Document)
|
|
39
|
-
object.
|
|
36
|
+
object._id
|
|
40
37
|
else
|
|
41
38
|
BSON::ObjectId.mongoize(object)
|
|
42
39
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
5
|
module Association
|
|
@@ -20,6 +20,12 @@ module Mongoid
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
class_methods do
|
|
23
|
+
|
|
24
|
+
# Returns all dependent association metadata objects.
|
|
25
|
+
#
|
|
26
|
+
# @return [ Array<Mongoid::Association::Relatable> ] The dependent
|
|
27
|
+
# association metadata.
|
|
28
|
+
#
|
|
23
29
|
# @api private
|
|
24
30
|
def _all_dependents
|
|
25
31
|
superclass_dependents = superclass.respond_to?(:_all_dependents) ? superclass._all_dependents : []
|
|
@@ -31,8 +37,6 @@ module Mongoid
|
|
|
31
37
|
end
|
|
32
38
|
|
|
33
39
|
# The valid dependent strategies.
|
|
34
|
-
#
|
|
35
|
-
# @since 7.0
|
|
36
40
|
STRATEGIES = [
|
|
37
41
|
:delete_all,
|
|
38
42
|
:destroy,
|
|
@@ -47,11 +51,9 @@ module Mongoid
|
|
|
47
51
|
# @example Set up cascading information
|
|
48
52
|
# Mongoid::Association::Depending.define_dependency!(association)
|
|
49
53
|
#
|
|
50
|
-
# @param [ Association ] association The association metadata.
|
|
54
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
51
55
|
#
|
|
52
56
|
# @return [ Class ] The class of the document.
|
|
53
|
-
#
|
|
54
|
-
# @since 2.0.0.rc.1
|
|
55
57
|
def self.define_dependency!(association)
|
|
56
58
|
validate!(association)
|
|
57
59
|
association.inverse_class.tap do |klass|
|
|
@@ -66,6 +68,14 @@ module Mongoid
|
|
|
66
68
|
end
|
|
67
69
|
end
|
|
68
70
|
|
|
71
|
+
# Validates that an association's dependent strategy is
|
|
72
|
+
# within the allowed enumeration.
|
|
73
|
+
#
|
|
74
|
+
# @param [ Mongoid::Association::Relatable ] association
|
|
75
|
+
# The association to validate.
|
|
76
|
+
#
|
|
77
|
+
# @raises [ Mongoid::Errors::InvalidDependentStrategy ]
|
|
78
|
+
# Error if invalid.
|
|
69
79
|
def self.validate!(association)
|
|
70
80
|
unless STRATEGIES.include?(association.dependent)
|
|
71
81
|
raise Errors::InvalidDependentStrategy.new(association,
|
|
@@ -78,13 +88,11 @@ module Mongoid
|
|
|
78
88
|
# the appropriate strategy to perform the operation.
|
|
79
89
|
#
|
|
80
90
|
# @example Execute cascades.
|
|
81
|
-
# document.
|
|
82
|
-
|
|
83
|
-
# @since 2.0.0.rc.1
|
|
84
|
-
def apply_delete_dependencies!
|
|
91
|
+
# document.apply_destroy_dependencies!
|
|
92
|
+
def apply_destroy_dependencies!
|
|
85
93
|
self.class._all_dependents.each do |association|
|
|
86
|
-
if association.try(:dependent)
|
|
87
|
-
send("_dependent_#{
|
|
94
|
+
if dependent = association.try(:dependent)
|
|
95
|
+
send("_dependent_#{dependent}!", association)
|
|
88
96
|
end
|
|
89
97
|
end
|
|
90
98
|
end
|