mongoid 6.4.8 → 7.0.13
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/LICENSE +1 -0
- data/README.md +4 -3
- data/Rakefile +33 -7
- data/lib/config/locales/en.yml +17 -0
- data/lib/mongoid/association/accessors.rb +339 -0
- data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
- data/lib/mongoid/association/builders.rb +92 -0
- data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
- data/lib/mongoid/association/depending.rb +137 -0
- data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
- data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
- data/lib/mongoid/association/embedded/cyclic.rb +109 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
- data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
- data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
- data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
- data/lib/mongoid/association/embedded/embeds_many.rb +211 -0
- data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
- data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
- data/lib/mongoid/association/embedded/embeds_one.rb +174 -0
- data/lib/mongoid/association/embedded.rb +4 -0
- data/lib/mongoid/association/macros.rb +204 -0
- data/lib/mongoid/{relations → association}/many.rb +19 -49
- data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
- data/lib/mongoid/association/nested/many.rb +200 -0
- data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
- data/lib/mongoid/association/nested/one.rb +127 -0
- data/lib/mongoid/association/nested.rb +15 -0
- data/lib/mongoid/{relations → association}/one.rb +6 -6
- data/lib/mongoid/association/options.rb +152 -0
- data/lib/mongoid/{relations → association}/proxy.rb +45 -59
- data/lib/mongoid/association/referenced/auto_save.rb +79 -0
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
- data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
- data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
- data/lib/mongoid/association/referenced/eager.rb +162 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
- data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
- data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
- data/lib/mongoid/association/referenced/has_many.rb +275 -0
- data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
- data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
- data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
- data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
- data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
- data/lib/mongoid/association/referenced/has_one.rb +204 -0
- data/lib/mongoid/association/referenced/syncable.rb +170 -0
- data/lib/mongoid/association/referenced.rb +7 -0
- data/lib/mongoid/{relations → association}/reflections.rb +21 -17
- data/lib/mongoid/association/relatable.rb +511 -0
- data/lib/mongoid/{relations.rb → association.rb} +57 -56
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded.rb +1 -1
- data/lib/mongoid/atomic.rb +14 -4
- data/lib/mongoid/attributes/dynamic.rb +16 -15
- data/lib/mongoid/attributes/nested.rb +22 -11
- data/lib/mongoid/attributes/processing.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +2 -4
- data/lib/mongoid/attributes.rb +55 -31
- data/lib/mongoid/changeable.rb +1 -1
- data/lib/mongoid/clients/options.rb +7 -5
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/composable.rb +4 -4
- data/lib/mongoid/config/environment.rb +21 -8
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +21 -3
- data/lib/mongoid/contextual/mongo.rb +10 -8
- data/lib/mongoid/copyable.rb +11 -6
- data/lib/mongoid/criteria/includable.rb +14 -14
- data/lib/mongoid/criteria/modifiable.rb +8 -3
- data/lib/mongoid/criteria/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/criteria/queryable/key.rb +67 -8
- data/lib/mongoid/criteria/queryable/mergeable.rb +5 -4
- data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
- data/lib/mongoid/criteria/queryable/selectable.rb +5 -3
- data/lib/mongoid/criteria/queryable/selector.rb +9 -31
- data/lib/mongoid/criteria.rb +9 -3
- data/lib/mongoid/document.rb +14 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
- data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
- data/lib/mongoid/errors/unknown_model.rb +25 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/extensions/array.rb +5 -5
- data/lib/mongoid/extensions/hash.rb +9 -4
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/range.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/string.rb +2 -2
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/factory.rb +13 -3
- data/lib/mongoid/fields/foreign_key.rb +5 -5
- data/lib/mongoid/fields/standard.rb +2 -14
- data/lib/mongoid/fields/validators/macro.rb +1 -1
- data/lib/mongoid/fields.rb +5 -4
- data/lib/mongoid/indexable.rb +4 -1
- data/lib/mongoid/interceptable.rb +8 -6
- data/lib/mongoid/matchable/all.rb +4 -3
- data/lib/mongoid/matchable/and.rb +1 -1
- data/lib/mongoid/matchable/default.rb +71 -24
- data/lib/mongoid/matchable/elem_match.rb +9 -3
- data/lib/mongoid/matchable/eq.rb +22 -0
- data/lib/mongoid/matchable/ne.rb +1 -1
- data/lib/mongoid/matchable/regexp.rb +2 -2
- data/lib/mongoid/matchable.rb +17 -16
- data/lib/mongoid/persistable/deletable.rb +7 -6
- data/lib/mongoid/persistable/incrementable.rb +1 -1
- data/lib/mongoid/persistable/logical.rb +1 -1
- data/lib/mongoid/persistable/pushable.rb +11 -2
- data/lib/mongoid/persistable/settable.rb +57 -12
- data/lib/mongoid/persistable.rb +4 -5
- data/lib/mongoid/persistence_context.rb +26 -11
- data/lib/mongoid/positional.rb +1 -1
- data/lib/mongoid/query_cache.rb +4 -2
- data/lib/mongoid/serializable.rb +4 -4
- data/lib/mongoid/shardable.rb +1 -1
- data/lib/mongoid/touchable.rb +102 -0
- data/lib/mongoid/traversable.rb +3 -3
- data/lib/mongoid/validatable/macros.rb +1 -1
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +5 -5
- data/lib/mongoid/validatable.rb +8 -8
- data/lib/mongoid/version.rb +2 -1
- data/lib/mongoid.rb +1 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/spec/README.md +18 -0
- data/spec/app/models/animal.rb +2 -1
- data/spec/app/models/bomb.rb +1 -1
- data/spec/app/models/customer.rb +11 -0
- data/spec/app/models/customer_address.rb +12 -0
- data/spec/app/models/message.rb +1 -1
- data/spec/app/models/minim.rb +7 -0
- data/spec/app/models/other_owner_object.rb +2 -0
- data/spec/app/models/person.rb +5 -2
- data/spec/app/models/shipment_address.rb +1 -0
- data/spec/app/models/store_as_dup_test3.rb +7 -0
- data/spec/app/models/store_as_dup_test4.rb +7 -0
- data/spec/app/models/updatable.rb +7 -0
- data/spec/app/models/vertex.rb +6 -0
- data/spec/app/models/wiki_page.rb +1 -1
- data/spec/config/mongoid.yml +13 -3
- data/spec/integration/app_spec.rb +341 -0
- data/spec/integration/associations/belongs_to_spec.rb +13 -0
- data/spec/integration/associations/embedded_spec.rb +176 -0
- data/spec/integration/callbacks_models.rb +49 -0
- data/spec/integration/callbacks_spec.rb +216 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
- data/spec/integration/matchable_spec.rb +680 -0
- data/spec/lite_spec_helper.rb +71 -0
- data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
- data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
- data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
- data/spec/mongoid/association/constrainable_spec.rb +115 -0
- data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +866 -0
- data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
- data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
- data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
- data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
- data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
- data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +55 -77
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +901 -0
- data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
- data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
- data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
- data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +862 -0
- data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
- data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
- data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +6 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +51 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +954 -0
- data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
- data/spec/mongoid/association/options_spec.rb +1321 -0
- data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
- data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
- data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
- data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
- data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2023 -0
- data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
- data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
- data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +247 -99
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
- data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
- data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
- data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +227 -1
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
- data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +30 -94
- data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
- data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
- data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
- data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
- data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1360 -0
- data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
- data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
- data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
- data/spec/mongoid/atomic/paths_spec.rb +41 -0
- data/spec/mongoid/atomic_spec.rb +4 -4
- data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
- data/spec/mongoid/attributes/nested_spec.rb +29 -11
- data/spec/mongoid/attributes/readonly_spec.rb +80 -125
- data/spec/mongoid/attributes_spec.rb +298 -9
- data/spec/mongoid/clients/factory_spec.rb +20 -38
- data/spec/mongoid/clients/options_spec.rb +64 -50
- data/spec/mongoid/clients/sessions_spec.rb +9 -5
- data/spec/mongoid/clients/transactions_spec.rb +390 -0
- data/spec/mongoid/clients_spec.rb +70 -10
- data/spec/mongoid/config_spec.rb +27 -1
- data/spec/mongoid/contextual/atomic_spec.rb +37 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
- data/spec/mongoid/contextual/memory_spec.rb +19 -0
- data/spec/mongoid/contextual/mongo_spec.rb +107 -56
- data/spec/mongoid/copyable_spec.rb +90 -6
- data/spec/mongoid/copyable_spec_models.rb +17 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +173 -1
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +44 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria/queryable/key_spec.rb +48 -6
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +762 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +5 -224
- data/spec/mongoid/criteria/queryable/selector_spec.rb +37 -0
- data/spec/mongoid/criteria_spec.rb +36 -19
- data/spec/mongoid/document_fields_spec.rb +88 -0
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/document_spec.rb +29 -4
- data/spec/mongoid/extensions/array_spec.rb +11 -15
- data/spec/mongoid/extensions/hash_spec.rb +18 -1
- data/spec/mongoid/extensions/object_spec.rb +7 -11
- data/spec/mongoid/extensions/range_spec.rb +7 -0
- data/spec/mongoid/factory_spec.rb +21 -3
- data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/indexable_spec.rb +24 -12
- data/spec/mongoid/interceptable_spec.rb +22 -1
- data/spec/mongoid/matchable/default_spec.rb +10 -3
- data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
- data/spec/mongoid/matchable/eq_spec.rb +48 -0
- data/spec/mongoid/matchable/regexp_spec.rb +2 -2
- data/spec/mongoid/matchable_spec.rb +2 -2
- data/spec/mongoid/persistable/pushable_spec.rb +55 -1
- data/spec/mongoid/persistable/savable_spec.rb +5 -5
- data/spec/mongoid/persistable/settable_spec.rb +125 -10
- data/spec/mongoid/persistable_spec.rb +21 -6
- data/spec/mongoid/persistence_context_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +65 -27
- data/spec/mongoid/relations/proxy_spec.rb +124 -124
- data/spec/mongoid/scopable_spec.rb +2 -1
- data/spec/mongoid/shardable_spec.rb +32 -12
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +1 -1
- data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
- data/spec/mongoid/validatable/associated_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +7 -6
- data/spec/mongoid/validatable/uniqueness_spec.rb +33 -6
- data/spec/mongoid/validatable_spec.rb +1 -1
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +221 -0
- data/spec/shared/lib/mrss/constraints.rb +354 -0
- data/spec/shared/lib/mrss/docker_runner.rb +265 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +162 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +231 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +290 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/spec_helper.rb +34 -49
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +21 -76
- data/spec/support/expectations.rb +17 -3
- data/spec/support/spec_config.rb +20 -7
- data.tar.gz.sig +0 -0
- metadata +646 -541
- metadata.gz.sig +1 -5
- data/lib/mongoid/relations/accessors.rb +0 -267
- data/lib/mongoid/relations/auto_save.rb +0 -94
- data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
- data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
- data/lib/mongoid/relations/bindings.rb +0 -9
- data/lib/mongoid/relations/builder.rb +0 -57
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
- data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
- data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
- data/lib/mongoid/relations/builders.rb +0 -106
- data/lib/mongoid/relations/cascading/delete.rb +0 -44
- data/lib/mongoid/relations/cascading/destroy.rb +0 -43
- data/lib/mongoid/relations/cascading/nullify.rb +0 -35
- data/lib/mongoid/relations/cascading/restrict.rb +0 -39
- data/lib/mongoid/relations/cascading.rb +0 -56
- data/lib/mongoid/relations/conversions.rb +0 -34
- data/lib/mongoid/relations/counter_cache.rb +0 -160
- data/lib/mongoid/relations/cyclic.rb +0 -107
- data/lib/mongoid/relations/eager/base.rb +0 -153
- data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
- data/lib/mongoid/relations/eager/has_many.rb +0 -38
- data/lib/mongoid/relations/eager/has_one.rb +0 -30
- data/lib/mongoid/relations/embedded/in.rb +0 -241
- data/lib/mongoid/relations/embedded/many.rb +0 -683
- data/lib/mongoid/relations/embedded/one.rb +0 -235
- data/lib/mongoid/relations/macros.rb +0 -367
- data/lib/mongoid/relations/metadata.rb +0 -1179
- data/lib/mongoid/relations/nested_builder.rb +0 -74
- data/lib/mongoid/relations/options.rb +0 -49
- data/lib/mongoid/relations/polymorphic.rb +0 -39
- data/lib/mongoid/relations/referenced/in.rb +0 -304
- data/lib/mongoid/relations/referenced/many.rb +0 -812
- data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
- data/lib/mongoid/relations/referenced/one.rb +0 -290
- data/lib/mongoid/relations/synchronization.rb +0 -169
- data/lib/mongoid/relations/targets/enumerable.rb +0 -493
- data/lib/mongoid/relations/targets.rb +0 -2
- data/lib/mongoid/relations/touchable.rb +0 -97
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
- data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
- data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
- data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
- data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
- data/spec/mongoid/relations/cascading_spec.rb +0 -355
- data/spec/mongoid/relations/constraint_spec.rb +0 -75
- data/spec/mongoid/relations/conversions_spec.rb +0 -128
- data/spec/mongoid/relations/metadata_spec.rb +0 -1985
- data/spec/mongoid/relations/options_spec.rb +0 -35
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Nested
|
|
5
|
+
class One
|
|
6
|
+
include Buildable
|
|
7
|
+
|
|
8
|
+
attr_accessor :destroy
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Builds the relation depending on the attributes and the options
|
|
12
|
+
# passed to the macro.
|
|
13
|
+
#
|
|
14
|
+
# @example Build a 1-1 nested document.
|
|
15
|
+
# one.build(person, as: :admin)
|
|
16
|
+
#
|
|
17
|
+
# @note This attempts to perform 3 operations, either one of an update of
|
|
18
|
+
# the existing relation, a replacement of the relation with a new
|
|
19
|
+
# document, or a removal of the relation.
|
|
20
|
+
#
|
|
21
|
+
# @param [ Document ] parent The parent document.
|
|
22
|
+
#
|
|
23
|
+
# @return [ Document ] The built document.
|
|
24
|
+
#
|
|
25
|
+
# @since 2.0.0
|
|
26
|
+
def build(parent)
|
|
27
|
+
return if reject?(parent, attributes)
|
|
28
|
+
@existing = parent.send(association.name)
|
|
29
|
+
if update?
|
|
30
|
+
attributes.delete_id
|
|
31
|
+
existing.assign_attributes(attributes)
|
|
32
|
+
elsif replace?
|
|
33
|
+
parent.send(association.setter, Factory.build(@class_name, attributes))
|
|
34
|
+
elsif delete?
|
|
35
|
+
parent.send(association.setter, nil)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Create the new builder for nested attributes on one-to-one
|
|
40
|
+
# relations.
|
|
41
|
+
#
|
|
42
|
+
# @example Instantiate the builder.
|
|
43
|
+
# One.new(association, attributes)
|
|
44
|
+
#
|
|
45
|
+
# @param [ Association ] association The association metadata.
|
|
46
|
+
# @param [ Hash ] attributes The attributes hash to attempt to set.
|
|
47
|
+
# @param [ Hash ] options The options defined.
|
|
48
|
+
#
|
|
49
|
+
# @since 2.0.0
|
|
50
|
+
def initialize(association, attributes, options)
|
|
51
|
+
@attributes = attributes.with_indifferent_access
|
|
52
|
+
@association = association
|
|
53
|
+
@options = options
|
|
54
|
+
@class_name = options[:class_name] ? options[:class_name].constantize : association.klass
|
|
55
|
+
@destroy = @attributes.delete(:_destroy)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
# Is the id in the attribtues acceptable for allowing an update to
|
|
61
|
+
# the existing relation?
|
|
62
|
+
#
|
|
63
|
+
# @api private
|
|
64
|
+
#
|
|
65
|
+
# @example Is the id acceptable?
|
|
66
|
+
# one.acceptable_id?
|
|
67
|
+
#
|
|
68
|
+
# @return [ true, false ] If the id part of the logic will allow an update.
|
|
69
|
+
#
|
|
70
|
+
# @since 2.0.0
|
|
71
|
+
def acceptable_id?
|
|
72
|
+
id = convert_id(existing.class, attributes[:id])
|
|
73
|
+
existing._id == id || id.nil? || (existing._id != id && update_only?)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Can the existing relation be deleted?
|
|
77
|
+
#
|
|
78
|
+
# @example Can the existing object be deleted?
|
|
79
|
+
# one.delete?
|
|
80
|
+
#
|
|
81
|
+
# @return [ true, false ] If the relation should be deleted.
|
|
82
|
+
#
|
|
83
|
+
# @since 2.0.0
|
|
84
|
+
def delete?
|
|
85
|
+
destroyable? && !attributes[:id].nil?
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Can the existing relation potentially be destroyed?
|
|
89
|
+
#
|
|
90
|
+
# @example Is the object destroyable?
|
|
91
|
+
# one.destroyable?({ :_destroy => "1" })
|
|
92
|
+
#
|
|
93
|
+
# @return [ true, false ] If the relation can potentially be
|
|
94
|
+
# destroyed.
|
|
95
|
+
#
|
|
96
|
+
# @since 2.0.0
|
|
97
|
+
def destroyable?
|
|
98
|
+
Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Is the document to be replaced?
|
|
102
|
+
#
|
|
103
|
+
# @example Is the document to be replaced?
|
|
104
|
+
# one.replace?
|
|
105
|
+
#
|
|
106
|
+
# @return [ true, false ] If the document should be replaced.
|
|
107
|
+
#
|
|
108
|
+
# @since 2.0.0
|
|
109
|
+
def replace?
|
|
110
|
+
!existing && !destroyable? && !attributes.blank?
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Should the document be updated?
|
|
114
|
+
#
|
|
115
|
+
# @example Should the document be updated?
|
|
116
|
+
# one.update?
|
|
117
|
+
#
|
|
118
|
+
# @return [ true, false ] If the object should have its attributes updated.
|
|
119
|
+
#
|
|
120
|
+
# @since 2.0.0
|
|
121
|
+
def update?
|
|
122
|
+
existing && !destroyable? && acceptable_id?
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'mongoid/association/nested/nested_buildable'
|
|
2
|
+
require 'mongoid/association/nested/many'
|
|
3
|
+
require 'mongoid/association/nested/one'
|
|
4
|
+
|
|
5
|
+
module Mongoid
|
|
6
|
+
module Association
|
|
7
|
+
module Nested
|
|
8
|
+
|
|
9
|
+
# The flags indicating that a relation can be destroyed.
|
|
10
|
+
#
|
|
11
|
+
# @since 7.0
|
|
12
|
+
DESTROY_FLAGS = [1, "1", true, "true"].freeze
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Association
|
|
4
4
|
|
|
5
5
|
# This is the superclass for one to one relations and defines the common
|
|
6
6
|
# behaviour or those proxies.
|
|
7
|
-
class One < Proxy
|
|
7
|
+
class One < Association::Proxy
|
|
8
8
|
|
|
9
9
|
# Clear this relation - same as calling #delete on the document.
|
|
10
10
|
#
|
|
@@ -15,7 +15,7 @@ module Mongoid
|
|
|
15
15
|
#
|
|
16
16
|
# @since 3.0.0
|
|
17
17
|
def clear
|
|
18
|
-
|
|
18
|
+
_target.delete
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# Get all the documents in the relation that are loaded into memory.
|
|
@@ -27,7 +27,7 @@ module Mongoid
|
|
|
27
27
|
#
|
|
28
28
|
# @since 2.1.0
|
|
29
29
|
def in_memory
|
|
30
|
-
[
|
|
30
|
+
[ _target ]
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# Since method_missing is overridden we should override this as well.
|
|
@@ -41,7 +41,7 @@ module Mongoid
|
|
|
41
41
|
#
|
|
42
42
|
# @since 2.1.8
|
|
43
43
|
def respond_to?(name, include_private = false)
|
|
44
|
-
|
|
44
|
+
_target.respond_to?(name, include_private) || super
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# Evolve the proxy document into an object id.
|
|
@@ -53,7 +53,7 @@ module Mongoid
|
|
|
53
53
|
#
|
|
54
54
|
# @since 4.0.0
|
|
55
55
|
def __evolve_object_id__
|
|
56
|
-
|
|
56
|
+
_target._id
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
end
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
|
|
4
|
+
module Options
|
|
5
|
+
|
|
6
|
+
# Returns the name of the parent to a polymorphic child.
|
|
7
|
+
#
|
|
8
|
+
# @return [ String, Symbol ] The name.
|
|
9
|
+
#
|
|
10
|
+
# @since 7.0
|
|
11
|
+
def as
|
|
12
|
+
@options[:as]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Specify what happens to the associated object when the owner is destroyed.
|
|
16
|
+
#
|
|
17
|
+
# @return [ String ] The dependent option.
|
|
18
|
+
#
|
|
19
|
+
# @since 7.0
|
|
20
|
+
def dependent
|
|
21
|
+
@options[:dependent]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The custom sorting options on the relation.
|
|
25
|
+
#
|
|
26
|
+
# @return [ Criteria::Queryable::Key ] The custom sorting options.
|
|
27
|
+
#
|
|
28
|
+
# @since 7.0
|
|
29
|
+
def order
|
|
30
|
+
@options[:order]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Whether to index the primary or foreign key field.
|
|
34
|
+
#
|
|
35
|
+
# @return [ true, false ]
|
|
36
|
+
#
|
|
37
|
+
# @since 7.0
|
|
38
|
+
def indexed?
|
|
39
|
+
@indexed ||= !!@options[:index]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Whether the association is autobuilding.
|
|
43
|
+
#
|
|
44
|
+
# @return [ true, false ]
|
|
45
|
+
#
|
|
46
|
+
# @since 7.0
|
|
47
|
+
def autobuilding?
|
|
48
|
+
!!@options[:autobuild]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Is the relation cyclic.
|
|
52
|
+
#
|
|
53
|
+
# @return [ true, false ] Whether the relation is cyclic.
|
|
54
|
+
#
|
|
55
|
+
# @since 7.0
|
|
56
|
+
def cyclic?
|
|
57
|
+
!!@options[:cyclic]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# The name the owning object uses to refer to this relation.
|
|
61
|
+
#
|
|
62
|
+
# @return [ String ] The inverse_of option.
|
|
63
|
+
#
|
|
64
|
+
# @since 7.0
|
|
65
|
+
def inverse_of
|
|
66
|
+
@options[:inverse_of]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Mongoid assumes that the field used to hold the primary key of the association is id.
|
|
70
|
+
# You can override this and explicitly specify the primary key with the :primary_key option.
|
|
71
|
+
#
|
|
72
|
+
# @return [ Symbol, String ] The primary key.
|
|
73
|
+
#
|
|
74
|
+
# @since 7.0
|
|
75
|
+
def primary_key
|
|
76
|
+
@primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Options to save any loaded members and destroy members that are marked for destruction
|
|
80
|
+
# when the parent object is saved.
|
|
81
|
+
#
|
|
82
|
+
# @return [ true, false ] The autosave option.
|
|
83
|
+
#
|
|
84
|
+
# @since 7.0
|
|
85
|
+
def autosave
|
|
86
|
+
!!@options[:autosave]
|
|
87
|
+
end
|
|
88
|
+
alias :autosave? :autosave
|
|
89
|
+
|
|
90
|
+
# Whether the association is counter-cached.
|
|
91
|
+
#
|
|
92
|
+
# @return [ true, false ]
|
|
93
|
+
#
|
|
94
|
+
# @since 7.0
|
|
95
|
+
def counter_cached?
|
|
96
|
+
!!@options[:counter_cache]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Whether this association is polymorphic.
|
|
100
|
+
#
|
|
101
|
+
# @return [ true, false ] Whether the association is polymorphic.
|
|
102
|
+
#
|
|
103
|
+
# @since 7.0
|
|
104
|
+
def polymorphic?; false; end
|
|
105
|
+
|
|
106
|
+
# Whether the relation has callbacks cascaded down from the parent.
|
|
107
|
+
#
|
|
108
|
+
# @return [ true, false ] Whether callbacks are cascaded.
|
|
109
|
+
#
|
|
110
|
+
# @since 7.0
|
|
111
|
+
def cascading_callbacks?
|
|
112
|
+
!!@options[:cascade_callbacks]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# The store_as option.
|
|
116
|
+
#
|
|
117
|
+
# @return [ nil ] Default is nil.
|
|
118
|
+
#
|
|
119
|
+
# @since 7.0
|
|
120
|
+
def store_as; end
|
|
121
|
+
|
|
122
|
+
# Whether the association has forced nil inverse (So no foreign keys are saved).
|
|
123
|
+
#
|
|
124
|
+
# @return [ false ] Default is false.
|
|
125
|
+
#
|
|
126
|
+
# @since 7.0
|
|
127
|
+
def forced_nil_inverse?; false; end
|
|
128
|
+
|
|
129
|
+
# The field for saving the associated object's type.
|
|
130
|
+
#
|
|
131
|
+
# @return [ nil ] Default is nil.
|
|
132
|
+
#
|
|
133
|
+
# @since 7.0
|
|
134
|
+
def type; end
|
|
135
|
+
|
|
136
|
+
# The field for saving the associated object's type.
|
|
137
|
+
#
|
|
138
|
+
# @return [ nil ] Default is nil.
|
|
139
|
+
#
|
|
140
|
+
# @since 7.0
|
|
141
|
+
def touch_field
|
|
142
|
+
@touch_field ||= options[:touch] if (options[:touch].is_a?(String) || options[:touch].is_a?(Symbol))
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
def touchable?
|
|
148
|
+
!!@options[:touch]
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "mongoid/
|
|
2
|
+
require "mongoid/association/marshalable"
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
|
-
module
|
|
5
|
+
module Association
|
|
6
6
|
|
|
7
7
|
# This class is the superclass for all relation proxy objects, and contains
|
|
8
8
|
# common behaviour for all of them.
|
|
@@ -12,35 +12,47 @@ module Mongoid
|
|
|
12
12
|
# We undefine most methods to get them sent through to the target.
|
|
13
13
|
instance_methods.each do |method|
|
|
14
14
|
undef_method(method) unless
|
|
15
|
-
method =~
|
|
15
|
+
method =~ /\A(__.*|send|object_id|equal\?|respond_to\?|tap|public_send|extend_proxy|extend_proxies)\z/
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
include Threaded::Lifecycle
|
|
19
19
|
include Marshalable
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
# Model instance for the base of the association.
|
|
22
|
+
#
|
|
23
|
+
# For example, if a Post embeds_many Comments, _base is a particular
|
|
24
|
+
# instance of the Post model.
|
|
25
|
+
attr_accessor :_base
|
|
26
|
+
|
|
27
|
+
attr_accessor :_association
|
|
28
|
+
|
|
29
|
+
# Model instance for one to one associations, or array of model instances
|
|
30
|
+
# for one to many associations, for the target of the association.
|
|
31
|
+
#
|
|
32
|
+
# For example, if a Post embeds_many Comments, _target is an array of
|
|
33
|
+
# Comment models embedded in a particular Post.
|
|
34
|
+
attr_accessor :_target
|
|
23
35
|
|
|
24
36
|
# Backwards compatibility with Mongoid beta releases.
|
|
25
|
-
delegate :foreign_key, :inverse_foreign_key, to: :
|
|
37
|
+
delegate :foreign_key, :inverse_foreign_key, to: :_association
|
|
26
38
|
delegate :bind_one, :unbind_one, to: :binding
|
|
27
|
-
delegate :collection_name, to: :
|
|
39
|
+
delegate :collection_name, to: :_base
|
|
28
40
|
|
|
29
|
-
# Convenience for setting the target and the metadata properties since
|
|
41
|
+
# Convenience for setting the target and the association metadata properties since
|
|
30
42
|
# all proxies will need to do this.
|
|
31
43
|
#
|
|
32
44
|
# @example Initialize the proxy.
|
|
33
|
-
# proxy.init(person, name,
|
|
45
|
+
# proxy.init(person, name, association)
|
|
34
46
|
#
|
|
35
47
|
# @param [ Document ] base The base document on the proxy.
|
|
36
48
|
# @param [ Document, Array<Document> ] target The target of the proxy.
|
|
37
|
-
# @param [
|
|
49
|
+
# @param [ Association ] association The association metadata.
|
|
38
50
|
#
|
|
39
51
|
# @since 2.0.0.rc.1
|
|
40
|
-
def init(base, target,
|
|
41
|
-
@
|
|
52
|
+
def init(base, target, association)
|
|
53
|
+
@_base, @_target, @_association = base, target, association
|
|
42
54
|
yield(self) if block_given?
|
|
43
|
-
extend_proxies(
|
|
55
|
+
extend_proxies(association.extension) if association.extension
|
|
44
56
|
end
|
|
45
57
|
|
|
46
58
|
# Allow extension to be an array and extend each module
|
|
@@ -48,7 +60,7 @@ module Mongoid
|
|
|
48
60
|
extension.flatten.each {|ext| extend_proxy(ext) }
|
|
49
61
|
end
|
|
50
62
|
|
|
51
|
-
# Get the class from the
|
|
63
|
+
# Get the class from the association, or return nil if no association present.
|
|
52
64
|
#
|
|
53
65
|
# @example Get the class.
|
|
54
66
|
# proxy.klass
|
|
@@ -57,7 +69,7 @@ module Mongoid
|
|
|
57
69
|
#
|
|
58
70
|
# @since 3.0.15
|
|
59
71
|
def klass
|
|
60
|
-
|
|
72
|
+
_association ? _association.klass : nil
|
|
61
73
|
end
|
|
62
74
|
|
|
63
75
|
# Resets the criteria inside the relation proxy. Used by many to many
|
|
@@ -68,7 +80,7 @@ module Mongoid
|
|
|
68
80
|
#
|
|
69
81
|
# @since 3.0.14
|
|
70
82
|
def reset_unloaded
|
|
71
|
-
|
|
83
|
+
_target.reset_unloaded(criteria)
|
|
72
84
|
end
|
|
73
85
|
|
|
74
86
|
# The default substitutable object for a relation proxy is the clone of
|
|
@@ -81,7 +93,7 @@ module Mongoid
|
|
|
81
93
|
#
|
|
82
94
|
# @since 2.1.6
|
|
83
95
|
def substitutable
|
|
84
|
-
|
|
96
|
+
_target
|
|
85
97
|
end
|
|
86
98
|
|
|
87
99
|
protected
|
|
@@ -95,20 +107,20 @@ module Mongoid
|
|
|
95
107
|
#
|
|
96
108
|
# @since 2.0.0
|
|
97
109
|
def collection
|
|
98
|
-
root =
|
|
110
|
+
root = _base._root
|
|
99
111
|
root.collection unless root.embedded?
|
|
100
112
|
end
|
|
101
113
|
|
|
102
|
-
# Takes the supplied document and sets the
|
|
114
|
+
# Takes the supplied document and sets the association on it.
|
|
103
115
|
#
|
|
104
|
-
# @example Set the metadata.
|
|
116
|
+
# @example Set the association metadata.
|
|
105
117
|
# proxt.characterize_one(name)
|
|
106
118
|
#
|
|
107
119
|
# @param [ Document ] document The document to set on.
|
|
108
120
|
#
|
|
109
121
|
# @since 2.0.0.rc.4
|
|
110
122
|
def characterize_one(document)
|
|
111
|
-
document.
|
|
123
|
+
document._association = _association unless document._association
|
|
112
124
|
end
|
|
113
125
|
|
|
114
126
|
# Default behavior of method missing should be to delegate all calls
|
|
@@ -118,7 +130,7 @@ module Mongoid
|
|
|
118
130
|
# @param [ Array ] args The arguments passed to the method.
|
|
119
131
|
#
|
|
120
132
|
def method_missing(name, *args, &block)
|
|
121
|
-
|
|
133
|
+
_target.send(name, *args, &block)
|
|
122
134
|
end
|
|
123
135
|
|
|
124
136
|
# When the base document illegally references an embedded document this
|
|
@@ -131,7 +143,7 @@ module Mongoid
|
|
|
131
143
|
#
|
|
132
144
|
# @since 2.0.0
|
|
133
145
|
def raise_mixed
|
|
134
|
-
raise Errors::MixedRelations.new(
|
|
146
|
+
raise Errors::MixedRelations.new(_base.class, _association.klass)
|
|
135
147
|
end
|
|
136
148
|
|
|
137
149
|
# When the base is not yet saved and the user calls create or create!
|
|
@@ -146,30 +158,7 @@ module Mongoid
|
|
|
146
158
|
#
|
|
147
159
|
# @since 2.0.0.rc.6
|
|
148
160
|
def raise_unsaved(doc)
|
|
149
|
-
raise Errors::UnsavedDocument.new(
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# Return the name of defined callback method
|
|
153
|
-
#
|
|
154
|
-
# @example returns the before_add callback method name
|
|
155
|
-
# callback_method(:before_add)
|
|
156
|
-
#
|
|
157
|
-
# @param [ Symbol ] callback_name Which callback
|
|
158
|
-
#
|
|
159
|
-
# @return [ Array ] with callback methods to be executed, the array may have symbols and Procs
|
|
160
|
-
#
|
|
161
|
-
# @since 3.1.0
|
|
162
|
-
def callback_method(callback_name)
|
|
163
|
-
methods = []
|
|
164
|
-
metadata = __metadata[callback_name]
|
|
165
|
-
if metadata
|
|
166
|
-
if metadata.is_a?(Array)
|
|
167
|
-
methods.concat(metadata)
|
|
168
|
-
else
|
|
169
|
-
methods << metadata
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
methods
|
|
161
|
+
raise Errors::UnsavedDocument.new(_base, doc)
|
|
173
162
|
end
|
|
174
163
|
|
|
175
164
|
# Executes a callback method
|
|
@@ -181,14 +170,11 @@ module Mongoid
|
|
|
181
170
|
#
|
|
182
171
|
# @since 3.1.0
|
|
183
172
|
def execute_callback(callback, doc)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
else
|
|
190
|
-
base.send c, doc
|
|
191
|
-
end
|
|
173
|
+
_association.get_callbacks(callback).each do |c|
|
|
174
|
+
if c.is_a? Proc
|
|
175
|
+
c.call(_base, doc)
|
|
176
|
+
else
|
|
177
|
+
_base.send c, doc
|
|
192
178
|
end
|
|
193
179
|
end
|
|
194
180
|
end
|
|
@@ -198,16 +184,16 @@ module Mongoid
|
|
|
198
184
|
# Apply ordering to the criteria if it was defined on the relation.
|
|
199
185
|
#
|
|
200
186
|
# @example Apply the ordering.
|
|
201
|
-
# Proxy.apply_ordering(criteria,
|
|
187
|
+
# Proxy.apply_ordering(criteria, association)
|
|
202
188
|
#
|
|
203
189
|
# @param [ Criteria ] criteria The criteria to modify.
|
|
204
|
-
# @param [
|
|
190
|
+
# @param [ Association ] association The association metadata.
|
|
205
191
|
#
|
|
206
192
|
# @return [ Criteria ] The ordered criteria.
|
|
207
193
|
#
|
|
208
194
|
# @since 3.0.6
|
|
209
|
-
def apply_ordering(criteria,
|
|
210
|
-
|
|
195
|
+
def apply_ordering(criteria, association)
|
|
196
|
+
association.order ? criteria.order_by(association.order) : criteria
|
|
211
197
|
end
|
|
212
198
|
end
|
|
213
199
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
module Referenced
|
|
4
|
+
|
|
5
|
+
module AutoSave
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
# Used to prevent infinite loops in associated autosaves.
|
|
9
|
+
#
|
|
10
|
+
# @example Is the document autosaved?
|
|
11
|
+
# document.autosaved?
|
|
12
|
+
#
|
|
13
|
+
# @return [ true, false ] Has the document already been autosaved?
|
|
14
|
+
#
|
|
15
|
+
# @since 3.0.0
|
|
16
|
+
def autosaved?
|
|
17
|
+
Threaded.autosaved?(self)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Begin the associated autosave.
|
|
21
|
+
#
|
|
22
|
+
# @example Begin autosave.
|
|
23
|
+
# document.__autosaving__
|
|
24
|
+
#
|
|
25
|
+
# @since 3.1.3
|
|
26
|
+
def __autosaving__
|
|
27
|
+
Threaded.begin_autosave(self)
|
|
28
|
+
yield
|
|
29
|
+
ensure
|
|
30
|
+
Threaded.exit_autosave(self)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Check if there is changes for auto-saving
|
|
34
|
+
#
|
|
35
|
+
# @example Return true if there is changes on self or in
|
|
36
|
+
# autosaved relations.
|
|
37
|
+
# document.changed_for_autosave?
|
|
38
|
+
#
|
|
39
|
+
# @since 3.1.3
|
|
40
|
+
def changed_for_autosave?(doc)
|
|
41
|
+
doc.new_record? || doc.changed? || doc.marked_for_destruction?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Define the autosave method on an association's owning class for
|
|
45
|
+
# an associated object.
|
|
46
|
+
#
|
|
47
|
+
# @example Define the autosave method:
|
|
48
|
+
# Association::Referenced::Autosave.define_autosave!(association)
|
|
49
|
+
#
|
|
50
|
+
# @param [ Association ] association The association for which autosaving is enabled.
|
|
51
|
+
#
|
|
52
|
+
# @return [ Class ] The association's owner class.
|
|
53
|
+
#
|
|
54
|
+
# @since 7.0
|
|
55
|
+
def self.define_autosave!(association)
|
|
56
|
+
association.inverse_class.tap do |klass|
|
|
57
|
+
save_method = :"autosave_documents_for_#{association.name}"
|
|
58
|
+
klass.send(:define_method, save_method) do
|
|
59
|
+
if before_callback_halted?
|
|
60
|
+
self.before_callback_halted = false
|
|
61
|
+
else
|
|
62
|
+
__autosaving__ do
|
|
63
|
+
if relation = ivar(association.name)
|
|
64
|
+
Array(relation).each do |doc|
|
|
65
|
+
doc.with(persistence_context) do |d|
|
|
66
|
+
d.save
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
klass.after_save save_method, unless: :autosaved?
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|