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,14 +1,42 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
3
|
module Mongoid
|
|
5
4
|
module Association
|
|
6
5
|
module Referenced
|
|
7
6
|
class HasAndBelongsToMany
|
|
8
|
-
|
|
9
|
-
#
|
|
10
|
-
#
|
|
7
|
+
# Transparent proxy for has_and_belongs_to_many associations.
|
|
8
|
+
# An instance of this class is returned when calling
|
|
9
|
+
# the association getter method on the subject document.
|
|
10
|
+
# This class inherits from Mongoid::Association::Proxy and
|
|
11
|
+
# forwards most of its methods to the target of the association,
|
|
12
|
+
# i.e. the array of documents on the opposite-side collection
|
|
13
|
+
# which must be loaded.
|
|
11
14
|
class Proxy < Referenced::HasMany::Proxy
|
|
15
|
+
# class-level methods for HasAndBelongsToMany::Proxy
|
|
16
|
+
module ClassMethods
|
|
17
|
+
# Get the Eager object for this type of association.
|
|
18
|
+
#
|
|
19
|
+
# @example Get the eager loader object
|
|
20
|
+
#
|
|
21
|
+
# @param [ Mongoid::Association::Relatable ] association The association metadata.
|
|
22
|
+
# @param [ Array<Document> ] docs The array of documents.
|
|
23
|
+
def eager_loader(association, docs)
|
|
24
|
+
Eager.new(association, docs)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns true if the association is an embedded one. In this case
|
|
28
|
+
# always false.
|
|
29
|
+
#
|
|
30
|
+
# @example Is this association embedded?
|
|
31
|
+
# Referenced::ManyToMany.embedded?
|
|
32
|
+
#
|
|
33
|
+
# @return [ false ] Always false.
|
|
34
|
+
def embedded?
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
extend ClassMethods
|
|
12
40
|
|
|
13
41
|
# Appends a document or array of documents to the association. Will set
|
|
14
42
|
# the parent and update the index in the process.
|
|
@@ -22,25 +50,48 @@ module Mongoid
|
|
|
22
50
|
# @example Concat with other documents.
|
|
23
51
|
# person.posts.concat([ post_one, post_two ])
|
|
24
52
|
#
|
|
25
|
-
# @param [ Document
|
|
53
|
+
# @param [ Document... ] *args Any number of documents.
|
|
26
54
|
#
|
|
27
55
|
# @return [ Array<Document> ] The loaded docs.
|
|
28
56
|
#
|
|
29
|
-
#
|
|
57
|
+
# rubocop:disable Metrics/AbcSize
|
|
30
58
|
def <<(*args)
|
|
31
59
|
docs = args.flatten
|
|
32
60
|
return concat(docs) if docs.size > 1
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
61
|
+
|
|
62
|
+
if (doc = docs.first)
|
|
63
|
+
append(doc) do
|
|
64
|
+
# We ignore the changes to the value for the foreign key in the
|
|
65
|
+
# changed_attributes hash in this block of code for two reasons:
|
|
66
|
+
#
|
|
67
|
+
# 1) The add_to_set method deletes the value for the foreign
|
|
68
|
+
# key in the changed_attributes hash, but if we enter this
|
|
69
|
+
# method with a value for the foreign key in the
|
|
70
|
+
# changed_attributes hash, then we want it to exist outside
|
|
71
|
+
# this method as well. It's used later on in the Syncable
|
|
72
|
+
# module to set the inverse foreign keys.
|
|
73
|
+
# 2) The reset_unloaded method accesses the value for the foreign
|
|
74
|
+
# key on _base, which causes it to get added to the
|
|
75
|
+
# changed_attributes hash. This happens because when reading
|
|
76
|
+
# a "resizable" attribute, it is automatically added to the
|
|
77
|
+
# changed_attributes hash. This is true only for the foreign
|
|
78
|
+
# key value for HABTM associations as the other associations
|
|
79
|
+
# use strings for their foreign key values. For consistency
|
|
80
|
+
# with the other associations, we ignore this addition to
|
|
81
|
+
# the changed_attributes hash.
|
|
82
|
+
# See MONGOID-4843 for a longer discussion about this.
|
|
83
|
+
reset_foreign_key_changes do
|
|
84
|
+
_base.add_to_set(foreign_key => doc.public_send(_association.primary_key))
|
|
85
|
+
doc.save if child_persistable?(doc)
|
|
86
|
+
reset_unloaded
|
|
87
|
+
end
|
|
38
88
|
end
|
|
39
89
|
end
|
|
40
90
|
unsynced(_base, foreign_key) and self
|
|
41
91
|
end
|
|
92
|
+
# rubocop:enable Metrics/AbcSize
|
|
42
93
|
|
|
43
|
-
alias
|
|
94
|
+
alias push <<
|
|
44
95
|
|
|
45
96
|
# Appends an array of documents to the association. Performs a batch
|
|
46
97
|
# insert of the documents instead of persisting one at a time.
|
|
@@ -51,26 +102,10 @@ module Mongoid
|
|
|
51
102
|
# @param [ Array<Document> ] documents The docs to add.
|
|
52
103
|
#
|
|
53
104
|
# @return [ Array<Document> ] The documents.
|
|
54
|
-
#
|
|
55
|
-
# @since 2.4.0
|
|
56
105
|
def concat(documents)
|
|
57
106
|
ids, docs, inserts = {}, [], []
|
|
58
|
-
documents.each
|
|
59
|
-
|
|
60
|
-
append(doc)
|
|
61
|
-
if persistable? || _creating?
|
|
62
|
-
ids[doc._id] = true
|
|
63
|
-
save_or_delay(doc, docs, inserts)
|
|
64
|
-
else
|
|
65
|
-
existing = _base.send(foreign_key)
|
|
66
|
-
unless existing.include?(doc._id)
|
|
67
|
-
existing.push(doc._id) and unsynced(_base, foreign_key)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
if persistable? || _creating?
|
|
72
|
-
_base.push(foreign_key => ids.keys)
|
|
73
|
-
end
|
|
107
|
+
documents.each { |doc| append_document(doc, ids, docs, inserts) }
|
|
108
|
+
_base.push(foreign_key => ids.keys) if persistable? || _creating?
|
|
74
109
|
persist_delayed(docs, inserts)
|
|
75
110
|
self
|
|
76
111
|
end
|
|
@@ -85,19 +120,18 @@ module Mongoid
|
|
|
85
120
|
# @param [ Class ] type The optional subclass to build.
|
|
86
121
|
#
|
|
87
122
|
# @return [ Document ] The new document.
|
|
88
|
-
#
|
|
89
|
-
# @since 2.0.0.beta.1
|
|
90
123
|
def build(attributes = {}, type = nil)
|
|
91
|
-
doc = Factory.
|
|
92
|
-
_base.send(foreign_key).push(doc._id)
|
|
124
|
+
doc = Factory.execute_build(type || klass, attributes, execute_callbacks: false)
|
|
93
125
|
append(doc)
|
|
94
126
|
doc.apply_post_processed_defaults
|
|
127
|
+
_base.public_send(foreign_key).push(doc.public_send(_association.primary_key))
|
|
95
128
|
unsynced(doc, inverse_foreign_key)
|
|
96
129
|
yield(doc) if block_given?
|
|
130
|
+
doc.run_pending_callbacks
|
|
97
131
|
doc
|
|
98
132
|
end
|
|
99
133
|
|
|
100
|
-
alias
|
|
134
|
+
alias new build
|
|
101
135
|
|
|
102
136
|
# Delete the document from the association. This will set the foreign key
|
|
103
137
|
# on the document to nil. If the dependent options on the association are
|
|
@@ -109,18 +143,20 @@ module Mongoid
|
|
|
109
143
|
# @param [ Document ] document The document to remove.
|
|
110
144
|
#
|
|
111
145
|
# @return [ Document ] The matching document.
|
|
112
|
-
#
|
|
113
|
-
# @since 2.1.0
|
|
114
146
|
def delete(document)
|
|
115
147
|
doc = super
|
|
116
148
|
if doc && persistable?
|
|
117
|
-
_base.pull(foreign_key => doc.
|
|
149
|
+
_base.pull(foreign_key => doc.public_send(_association.primary_key))
|
|
118
150
|
_target._unloaded = criteria
|
|
119
151
|
unsynced(_base, foreign_key)
|
|
120
152
|
end
|
|
121
153
|
doc
|
|
122
154
|
end
|
|
123
155
|
|
|
156
|
+
# Mongoid::Extensions::Array defines Array#delete_one, so we need
|
|
157
|
+
# to make sure that method behaves reasonably on proxies, too.
|
|
158
|
+
alias delete_one delete
|
|
159
|
+
|
|
124
160
|
# Removes all associations between the base document and the target
|
|
125
161
|
# documents by deleting the foreign keys and the references, orphaning
|
|
126
162
|
# the target documents in the process.
|
|
@@ -129,49 +165,16 @@ module Mongoid
|
|
|
129
165
|
# person.preferences.nullify
|
|
130
166
|
#
|
|
131
167
|
# @param [ Array<Document> ] replacement The replacement documents.
|
|
132
|
-
#
|
|
133
|
-
# @since 2.0.0.rc.1
|
|
134
168
|
def nullify(replacement = [])
|
|
135
|
-
_target.each
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
if field = _association.options[:inverse_primary_key]
|
|
140
|
-
ipk = _base.send(field)
|
|
141
|
-
else
|
|
142
|
-
ipk = _base._id
|
|
143
|
-
end
|
|
144
|
-
if replacement
|
|
145
|
-
objects_to_clear = _base.send(foreign_key) - replacement.collect do |object|
|
|
146
|
-
object.send(_association.primary_key)
|
|
147
|
-
end
|
|
148
|
-
criteria(objects_to_clear).pull(inverse_foreign_key => ipk)
|
|
149
|
-
else
|
|
150
|
-
criteria.pull(inverse_foreign_key => ipk)
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
if persistable?
|
|
154
|
-
_base.set(foreign_key => _base.send(foreign_key).clear)
|
|
155
|
-
end
|
|
156
|
-
after_remove_error = nil
|
|
157
|
-
many_to_many = _target.clear do |doc|
|
|
158
|
-
unbind_one(doc)
|
|
159
|
-
unless _association.forced_nil_inverse?
|
|
160
|
-
doc.changed_attributes.delete(inverse_foreign_key)
|
|
161
|
-
end
|
|
162
|
-
begin
|
|
163
|
-
execute_callback :after_remove, doc
|
|
164
|
-
rescue => e
|
|
165
|
-
after_remove_error = e
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
raise after_remove_error if after_remove_error
|
|
169
|
-
many_to_many
|
|
169
|
+
_target.each { |doc| execute_callback :before_remove, doc }
|
|
170
|
+
cleanup_inverse_for(replacement) unless _association.forced_nil_inverse?
|
|
171
|
+
_base.set(foreign_key => _base.public_send(foreign_key).clear) if persistable?
|
|
172
|
+
clear_target_for_nullify
|
|
170
173
|
end
|
|
171
174
|
|
|
172
|
-
alias
|
|
173
|
-
alias
|
|
174
|
-
alias
|
|
175
|
+
alias nullify_all nullify
|
|
176
|
+
alias clear nullify
|
|
177
|
+
alias purge nullify
|
|
175
178
|
|
|
176
179
|
# Substitutes the supplied target documents for the existing documents
|
|
177
180
|
# in the association. If the new target is nil, perform the necessary
|
|
@@ -183,14 +186,13 @@ module Mongoid
|
|
|
183
186
|
# @param [ Array<Document> ] replacement The replacement target.
|
|
184
187
|
#
|
|
185
188
|
# @return [ Many ] The association.
|
|
186
|
-
#
|
|
187
|
-
# @since 2.0.0.rc.1
|
|
188
189
|
def substitute(replacement)
|
|
189
190
|
purge(replacement)
|
|
190
|
-
|
|
191
|
-
push(replacement.compact.uniq)
|
|
192
|
-
else
|
|
191
|
+
if replacement.blank?
|
|
193
192
|
reset_unloaded
|
|
193
|
+
clear_foreign_key_changes
|
|
194
|
+
else
|
|
195
|
+
push(replacement.compact.uniq)
|
|
194
196
|
end
|
|
195
197
|
self
|
|
196
198
|
end
|
|
@@ -202,14 +204,35 @@ module Mongoid
|
|
|
202
204
|
# person.preferences.unscoped
|
|
203
205
|
#
|
|
204
206
|
# @return [ Criteria ] The unscoped criteria.
|
|
205
|
-
#
|
|
206
|
-
# @since 2.4.0
|
|
207
207
|
def unscoped
|
|
208
|
-
klass.unscoped.any_in(_id: _base.
|
|
208
|
+
klass.unscoped.any_in(_id: _base.public_send(foreign_key))
|
|
209
209
|
end
|
|
210
210
|
|
|
211
211
|
private
|
|
212
212
|
|
|
213
|
+
# Clears the foreign key from the changed_attributes hash.
|
|
214
|
+
#
|
|
215
|
+
# This is, in general, used to clear the foreign key from the
|
|
216
|
+
# changed_attributes hash for consistency with the other referenced
|
|
217
|
+
# associations.
|
|
218
|
+
#
|
|
219
|
+
# @api private
|
|
220
|
+
def clear_foreign_key_changes
|
|
221
|
+
_base.changed_attributes.delete(foreign_key)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Reset the value in the changed_attributes hash for the foreign key
|
|
225
|
+
# to its value before executing the given block.
|
|
226
|
+
#
|
|
227
|
+
# @api private
|
|
228
|
+
def reset_foreign_key_changes
|
|
229
|
+
prior_fk_change = _base.changed_attributes.key?(foreign_key)
|
|
230
|
+
fk = _base.changed_attributes[foreign_key].dup
|
|
231
|
+
yield if block_given?
|
|
232
|
+
_base.changed_attributes[foreign_key] = fk
|
|
233
|
+
clear_foreign_key_changes unless prior_fk_change
|
|
234
|
+
end
|
|
235
|
+
|
|
213
236
|
# Appends the document to the target array, updating the index on the
|
|
214
237
|
# document at the same time.
|
|
215
238
|
#
|
|
@@ -217,14 +240,13 @@ module Mongoid
|
|
|
217
240
|
# relation.append(document)
|
|
218
241
|
#
|
|
219
242
|
# @param [ Document ] document The document to append to the target.
|
|
220
|
-
#
|
|
221
|
-
# @since 2.0.0.rc.1
|
|
222
243
|
def append(document)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
244
|
+
execute_callbacks_around(:add, document) do
|
|
245
|
+
_target.push(document)
|
|
246
|
+
characterize_one(document)
|
|
247
|
+
bind_one(document)
|
|
248
|
+
yield if block_given?
|
|
249
|
+
end
|
|
228
250
|
end
|
|
229
251
|
|
|
230
252
|
# Instantiate the binding associated with this association.
|
|
@@ -233,8 +255,6 @@ module Mongoid
|
|
|
233
255
|
# relation.binding([ address ])
|
|
234
256
|
#
|
|
235
257
|
# @return [ Binding ] The binding.
|
|
236
|
-
#
|
|
237
|
-
# @since 2.0.0.rc.1
|
|
238
258
|
def binding
|
|
239
259
|
HasAndBelongsToMany::Binding.new(_base, _target, _association)
|
|
240
260
|
end
|
|
@@ -248,12 +268,10 @@ module Mongoid
|
|
|
248
268
|
#
|
|
249
269
|
# @param [ Document ] doc The document.
|
|
250
270
|
#
|
|
251
|
-
# @return [ true
|
|
252
|
-
#
|
|
253
|
-
# @since 3.0.20
|
|
271
|
+
# @return [ true | false ] If the document can be persisted.
|
|
254
272
|
def child_persistable?(doc)
|
|
255
273
|
(persistable? || _creating?) &&
|
|
256
|
-
|
|
274
|
+
!(doc.persisted? && _association.forced_nil_inverse?)
|
|
257
275
|
end
|
|
258
276
|
|
|
259
277
|
# Returns the criteria object for the target class with its documents set
|
|
@@ -278,40 +296,90 @@ module Mongoid
|
|
|
278
296
|
# @param [ Symbol ] key The key to flag on the document.
|
|
279
297
|
#
|
|
280
298
|
# @return [ true ] true.
|
|
281
|
-
#
|
|
282
|
-
# @since 3.0.0
|
|
283
299
|
def unsynced(doc, key)
|
|
284
300
|
doc._synced[key] = false
|
|
285
301
|
true
|
|
286
302
|
end
|
|
287
303
|
|
|
288
|
-
|
|
304
|
+
# Does the cleanup for the inverse of the association when
|
|
305
|
+
# replacing the relation with another list of documents.
|
|
306
|
+
#
|
|
307
|
+
# @param [ Array<Document> | nil ] replacement the list of documents
|
|
308
|
+
# that will replace the current list.
|
|
309
|
+
def cleanup_inverse_for(replacement)
|
|
310
|
+
if replacement
|
|
311
|
+
new_ids = replacement.collect { |doc| doc.public_send(_association.primary_key) }
|
|
312
|
+
objects_to_clear = _base.public_send(foreign_key) - new_ids
|
|
313
|
+
criteria(objects_to_clear).pull(inverse_foreign_key => inverse_primary_key)
|
|
314
|
+
else
|
|
315
|
+
criteria.pull(inverse_foreign_key => inverse_primary_key)
|
|
316
|
+
end
|
|
317
|
+
end
|
|
289
318
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
def eager_loader(association, docs)
|
|
299
|
-
Eager.new(association, docs)
|
|
319
|
+
# The inverse primary key
|
|
320
|
+
#
|
|
321
|
+
# @return [ Object ] the inverse primary key
|
|
322
|
+
def inverse_primary_key
|
|
323
|
+
if (field = _association.options[:inverse_primary_key])
|
|
324
|
+
_base.public_send(field)
|
|
325
|
+
else
|
|
326
|
+
_base._id
|
|
300
327
|
end
|
|
328
|
+
end
|
|
301
329
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
330
|
+
# Clears the _target list and executes callbacks for each document.
|
|
331
|
+
# If an exception occurs in an after_remove hook, the exception is
|
|
332
|
+
# saved, the processing completes, and *then* the exception is
|
|
333
|
+
# re-raised.
|
|
334
|
+
#
|
|
335
|
+
# @return [ Array<Document> ] the replacement documents
|
|
336
|
+
def clear_target_for_nullify
|
|
337
|
+
after_remove_error = nil
|
|
338
|
+
many_to_many = _target.clear do |doc|
|
|
339
|
+
unbind_one(doc)
|
|
340
|
+
doc.changed_attributes.delete(inverse_foreign_key) unless _association.forced_nil_inverse?
|
|
341
|
+
|
|
342
|
+
begin
|
|
343
|
+
execute_callback :after_remove, doc
|
|
344
|
+
rescue StandardError => e
|
|
345
|
+
after_remove_error = e
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
raise after_remove_error if after_remove_error
|
|
350
|
+
|
|
351
|
+
many_to_many
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
# Processes a single document as part of a ``concat`` command.
|
|
355
|
+
#
|
|
356
|
+
# @param [ Mongoid::Document ] doc the document to append
|
|
357
|
+
# @param [ Hash ] ids the mapping of primary keys that have been
|
|
358
|
+
# visited
|
|
359
|
+
# @param [ Array ] docs the list of new docs to be inserted later,
|
|
360
|
+
# in bulk
|
|
361
|
+
# @param [ Array ] inserts the list of Hashes of attributes that will
|
|
362
|
+
# be inserted (corresponding to the ``docs`` list)
|
|
363
|
+
#
|
|
364
|
+
# rubocop:disable Metrics/AbcSize
|
|
365
|
+
def append_document(doc, ids, docs, inserts)
|
|
366
|
+
return unless doc
|
|
367
|
+
|
|
368
|
+
append(doc)
|
|
369
|
+
|
|
370
|
+
pk = doc.public_send(_association.primary_key)
|
|
371
|
+
if persistable? || _creating?
|
|
372
|
+
ids[pk] = true
|
|
373
|
+
save_or_delay(doc, docs, inserts)
|
|
374
|
+
else
|
|
375
|
+
existing = _base.public_send(foreign_key)
|
|
376
|
+
return if existing.include?(pk)
|
|
377
|
+
|
|
378
|
+
existing.push(pk)
|
|
379
|
+
unsynced(_base, foreign_key)
|
|
313
380
|
end
|
|
314
381
|
end
|
|
382
|
+
# rubocop:enable Metrics/AbcSize
|
|
315
383
|
end
|
|
316
384
|
end
|
|
317
385
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
#
|
|
2
|
+
# rubocop:todo all
|
|
3
3
|
|
|
4
4
|
require 'mongoid/association/referenced/has_and_belongs_to_many/binding'
|
|
5
5
|
require 'mongoid/association/referenced/has_and_belongs_to_many/buildable'
|
|
@@ -11,8 +11,6 @@ module Mongoid
|
|
|
11
11
|
module Referenced
|
|
12
12
|
|
|
13
13
|
# The HasAndBelongsToMany type association.
|
|
14
|
-
#
|
|
15
|
-
# @since 7.0
|
|
16
14
|
class HasAndBelongsToMany
|
|
17
15
|
include Relatable
|
|
18
16
|
include Buildable
|
|
@@ -21,8 +19,6 @@ module Mongoid
|
|
|
21
19
|
# common ones.
|
|
22
20
|
#
|
|
23
21
|
# @return [ Array<Symbol> ] The extra valid options.
|
|
24
|
-
#
|
|
25
|
-
# @since 7.0
|
|
26
22
|
ASSOCIATION_OPTIONS = [
|
|
27
23
|
:after_add,
|
|
28
24
|
:after_remove,
|
|
@@ -37,35 +33,28 @@ module Mongoid
|
|
|
37
33
|
:primary_key,
|
|
38
34
|
:inverse_primary_key,
|
|
39
35
|
:inverse_foreign_key,
|
|
36
|
+
:scope,
|
|
40
37
|
].freeze
|
|
41
38
|
|
|
42
39
|
# The complete list of valid options for this association, including
|
|
43
40
|
# the shared ones.
|
|
44
41
|
#
|
|
45
42
|
# @return [ Array<Symbol> ] The valid options.
|
|
46
|
-
#
|
|
47
|
-
# @since 7.0
|
|
48
43
|
VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
|
|
49
44
|
|
|
50
45
|
# The type of the field holding the foreign key.
|
|
51
46
|
#
|
|
52
47
|
# @return [ Array ]
|
|
53
|
-
#
|
|
54
|
-
# @since 7.0
|
|
55
48
|
FOREIGN_KEY_FIELD_TYPE = Array
|
|
56
49
|
|
|
57
50
|
# The default foreign key suffix.
|
|
58
51
|
#
|
|
59
52
|
# @return [ String ] '_ids'
|
|
60
|
-
#
|
|
61
|
-
# @since 7.0
|
|
62
53
|
FOREIGN_KEY_SUFFIX = '_ids'.freeze
|
|
63
54
|
|
|
64
55
|
# The list of association complements.
|
|
65
56
|
#
|
|
66
|
-
# @return [ Array<Association> ] The association complements.
|
|
67
|
-
#
|
|
68
|
-
# @since 7.0
|
|
57
|
+
# @return [ Array<Mongoid::Association::Relatable> ] The association complements.
|
|
69
58
|
def relation_complements
|
|
70
59
|
@relation_complements ||= [ self.class ].freeze
|
|
71
60
|
end
|
|
@@ -73,8 +62,6 @@ module Mongoid
|
|
|
73
62
|
# Setup the instance methods, fields, etc. on the association owning class.
|
|
74
63
|
#
|
|
75
64
|
# @return [ self ]
|
|
76
|
-
#
|
|
77
|
-
# @since 7.0
|
|
78
65
|
def setup!
|
|
79
66
|
setup_instance_methods!
|
|
80
67
|
self
|
|
@@ -83,22 +70,16 @@ module Mongoid
|
|
|
83
70
|
# Is this association type embedded?
|
|
84
71
|
#
|
|
85
72
|
# @return [ false ] Always false.
|
|
86
|
-
#
|
|
87
|
-
# @since 7.0
|
|
88
73
|
def embedded?; false; end
|
|
89
74
|
|
|
90
75
|
# The default for validation the association object.
|
|
91
76
|
#
|
|
92
77
|
# @return [ false ] Always false.
|
|
93
|
-
#
|
|
94
|
-
# @since 7.0
|
|
95
78
|
def validation_default; true; end
|
|
96
79
|
|
|
97
80
|
# Are ids only saved on this side of the association?
|
|
98
81
|
#
|
|
99
|
-
# @return [ true
|
|
100
|
-
#
|
|
101
|
-
# @since 7.0
|
|
82
|
+
# @return [ true | false ] Whether this association has a forced nil inverse.
|
|
102
83
|
def forced_nil_inverse?
|
|
103
84
|
@forced_nil_inverse ||= @options.key?(:inverse_of) && !@options[:inverse_of]
|
|
104
85
|
end
|
|
@@ -106,15 +87,11 @@ module Mongoid
|
|
|
106
87
|
# Does this association type store the foreign key?
|
|
107
88
|
#
|
|
108
89
|
# @return [ true ] Always true.
|
|
109
|
-
#
|
|
110
|
-
# @since 7.0
|
|
111
90
|
def stores_foreign_key?; true; end
|
|
112
91
|
|
|
113
92
|
# Get the association proxy class for this association type.
|
|
114
93
|
#
|
|
115
94
|
# @return [ Association::HasAndBelongsToMany::Proxy ] The proxy class.
|
|
116
|
-
#
|
|
117
|
-
# @since 7.0
|
|
118
95
|
def relation
|
|
119
96
|
Proxy
|
|
120
97
|
end
|
|
@@ -122,8 +99,6 @@ module Mongoid
|
|
|
122
99
|
# Get the foreign key field for saving the association reference.
|
|
123
100
|
#
|
|
124
101
|
# @return [ String ] The foreign key field for saving the association reference.
|
|
125
|
-
#
|
|
126
|
-
# @since 7.0
|
|
127
102
|
def foreign_key
|
|
128
103
|
@foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
|
|
129
104
|
default_foreign_key_field
|
|
@@ -132,8 +107,6 @@ module Mongoid
|
|
|
132
107
|
# The criteria used for querying this association.
|
|
133
108
|
#
|
|
134
109
|
# @return [ Mongoid::Criteria ] The criteria used for querying this association.
|
|
135
|
-
#
|
|
136
|
-
# @since 7.0
|
|
137
110
|
def criteria(base, id_list = nil)
|
|
138
111
|
query_criteria(id_list || base.send(foreign_key))
|
|
139
112
|
end
|
|
@@ -142,13 +115,13 @@ module Mongoid
|
|
|
142
115
|
#
|
|
143
116
|
# @return [ String ] The foreign key field for saving the association reference
|
|
144
117
|
# on the inverse side.
|
|
145
|
-
#
|
|
146
|
-
# @since 7.0
|
|
147
118
|
def inverse_foreign_key
|
|
148
119
|
if @options.key?(:inverse_foreign_key)
|
|
149
120
|
@options[:inverse_foreign_key]
|
|
150
121
|
elsif @options.key?(:inverse_of)
|
|
151
122
|
inverse_of ? "#{inverse_of.to_s.singularize}#{FOREIGN_KEY_SUFFIX}" : nil
|
|
123
|
+
elsif inv = inverse_association&.foreign_key
|
|
124
|
+
inv
|
|
152
125
|
else
|
|
153
126
|
"#{inverse_class_name.demodulize.underscore}#{FOREIGN_KEY_SUFFIX}"
|
|
154
127
|
end
|
|
@@ -159,7 +132,7 @@ module Mongoid
|
|
|
159
132
|
#
|
|
160
133
|
# @param [ Document ] doc The document to be bound.
|
|
161
134
|
#
|
|
162
|
-
# @return [ true
|
|
135
|
+
# @return [ true | false ] Whether the document can be bound.
|
|
163
136
|
def bindable?(doc)
|
|
164
137
|
forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
|
|
165
138
|
end
|
|
@@ -168,8 +141,6 @@ module Mongoid
|
|
|
168
141
|
#
|
|
169
142
|
# @return [ String ] The foreign key setter for saving the association reference
|
|
170
143
|
# on the inverse side.
|
|
171
|
-
#
|
|
172
|
-
# @since 7.0
|
|
173
144
|
def inverse_foreign_key_setter
|
|
174
145
|
@inverse_foreign_key_setter ||= "#{inverse_foreign_key}=" if inverse_foreign_key
|
|
175
146
|
end
|
|
@@ -180,8 +151,6 @@ module Mongoid
|
|
|
180
151
|
# @param [ Hash ] options The options for the association.
|
|
181
152
|
#
|
|
182
153
|
# @return [ Association::Nested::One ] The Nested Builder object.
|
|
183
|
-
#
|
|
184
|
-
# @since 7.0
|
|
185
154
|
def nested_builder(attributes, options)
|
|
186
155
|
Nested::Many.new(self, attributes, options)
|
|
187
156
|
end
|
|
@@ -194,12 +163,17 @@ module Mongoid
|
|
|
194
163
|
# @param [ Document ] document The document to calculate on.
|
|
195
164
|
#
|
|
196
165
|
# @return [ Root ] The root atomic path calculator.
|
|
197
|
-
#
|
|
198
|
-
# @since 2.1.0
|
|
199
166
|
def path(document)
|
|
200
167
|
Mongoid::Atomic::Paths::Root.new(document)
|
|
201
168
|
end
|
|
202
169
|
|
|
170
|
+
# Get the scope to be applied when querying the association.
|
|
171
|
+
#
|
|
172
|
+
# @return [ Proc | Symbol | nil ] The association scope, if any.
|
|
173
|
+
def scope
|
|
174
|
+
@options[:scope]
|
|
175
|
+
end
|
|
176
|
+
|
|
203
177
|
private
|
|
204
178
|
|
|
205
179
|
def setup_instance_methods!
|
|
@@ -248,7 +222,7 @@ module Mongoid
|
|
|
248
222
|
def synced_save
|
|
249
223
|
assoc = self
|
|
250
224
|
inverse_class.set_callback(
|
|
251
|
-
:
|
|
225
|
+
:persist_parent,
|
|
252
226
|
:after,
|
|
253
227
|
if: ->(doc){ doc._syncable?(assoc) }
|
|
254
228
|
) do |doc|
|
|
@@ -257,6 +231,7 @@ module Mongoid
|
|
|
257
231
|
end
|
|
258
232
|
|
|
259
233
|
def create_foreign_key_field!
|
|
234
|
+
inverse_class.aliased_associations[foreign_key] = name.to_s
|
|
260
235
|
@owner_class.field(
|
|
261
236
|
foreign_key,
|
|
262
237
|
type: FOREIGN_KEY_FIELD_TYPE,
|
|
@@ -288,7 +263,13 @@ module Mongoid
|
|
|
288
263
|
end
|
|
289
264
|
|
|
290
265
|
def query_criteria(id_list)
|
|
291
|
-
crit = relation_class.
|
|
266
|
+
crit = relation_class.criteria
|
|
267
|
+
crit = if id_list
|
|
268
|
+
crit = crit.apply_scope(scope)
|
|
269
|
+
crit.all_of(primary_key => { "$in" => id_list })
|
|
270
|
+
else
|
|
271
|
+
crit.none
|
|
272
|
+
end
|
|
292
273
|
with_ordering(crit)
|
|
293
274
|
end
|
|
294
275
|
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
|
|
@@ -15,8 +15,6 @@ module Mongoid
|
|
|
15
15
|
#
|
|
16
16
|
# @example Bind one document.
|
|
17
17
|
# person.posts.bind_one(post)
|
|
18
|
-
#
|
|
19
|
-
# @since 2.0.0.rc.1
|
|
20
18
|
def bind_one(doc)
|
|
21
19
|
binding do
|
|
22
20
|
bind_from_relational_parent(doc)
|
|
@@ -27,8 +25,6 @@ module Mongoid
|
|
|
27
25
|
#
|
|
28
26
|
# @example Unbind the document.
|
|
29
27
|
# person.posts.unbind_one(document)
|
|
30
|
-
#
|
|
31
|
-
# @since 2.0.0.rc.1
|
|
32
28
|
def unbind_one(doc)
|
|
33
29
|
binding do
|
|
34
30
|
unbind_from_relational_parent(doc)
|