mongoid 6.4.2 → 7.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- 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 +210 -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 +173 -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 +31 -58
- 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 +509 -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.rb +4 -4
- data/lib/mongoid/attributes/dynamic.rb +2 -2
- 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 +22 -13
- data/lib/mongoid/changeable.rb +1 -1
- data/lib/mongoid/clients/options.rb +7 -5
- data/lib/mongoid/composable.rb +4 -4
- 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 +7 -6
- data/lib/mongoid/criteria/includable.rb +14 -14
- data/lib/mongoid/criteria/modifiable.rb +8 -14
- data/lib/mongoid/criteria/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
- data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
- data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
- data/lib/mongoid/criteria.rb +2 -2
- data/lib/mongoid/document.rb +15 -6
- 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/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +5 -2
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/range.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -0
- 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 +3 -3
- data/lib/mongoid/indexable.rb +4 -1
- data/lib/mongoid/interceptable.rb +5 -5
- data/lib/mongoid/matchable/and.rb +1 -1
- 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.rb +3 -1
- 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/settable.rb +57 -12
- data/lib/mongoid/persistable.rb +4 -5
- data/lib/mongoid/persistence_context.rb +20 -5
- data/lib/mongoid/query_cache.rb +8 -4
- data/lib/mongoid/railtie.rb +17 -0
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +4 -4
- data/lib/mongoid/shardable.rb +1 -1
- data/lib/mongoid/threaded.rb +36 -0
- data/lib/mongoid/touchable.rb +102 -0
- data/lib/mongoid/traversable.rb +3 -3
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +4 -4
- data/lib/mongoid/validatable.rb +8 -8
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
- data/spec/app/models/animal.rb +2 -1
- data/spec/app/models/bomb.rb +1 -1
- data/spec/app/models/message.rb +1 -1
- data/spec/app/models/minim.rb +7 -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/associations/belongs_to_spec.rb +13 -0
- data/spec/lite_spec_helper.rb +56 -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/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} +5 -77
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -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_spec.rb +852 -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_spec.rb +908 -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 +2006 -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} +107 -98
- 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 +122 -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} +28 -93
- 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 +1350 -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_spec.rb +4 -4
- data/spec/mongoid/attributes/nested_spec.rb +29 -11
- data/spec/mongoid/attributes/readonly_spec.rb +80 -125
- data/spec/mongoid/attributes_spec.rb +38 -2
- data/spec/mongoid/clients/factory_spec.rb +24 -18
- data/spec/mongoid/clients/options_spec.rb +58 -44
- data/spec/mongoid/clients/sessions_spec.rb +1 -1
- data/spec/mongoid/clients/transactions_spec.rb +369 -0
- data/spec/mongoid/clients_spec.rb +68 -8
- data/spec/mongoid/config_spec.rb +27 -1
- data/spec/mongoid/contextual/memory_spec.rb +19 -0
- data/spec/mongoid/contextual/mongo_spec.rb +33 -5
- data/spec/mongoid/copyable_spec.rb +90 -6
- data/spec/mongoid/copyable_spec_models.rb +17 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +33 -18
- data/spec/mongoid/document_spec.rb +83 -4
- data/spec/mongoid/extensions/array_spec.rb +11 -15
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- 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/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/factory_spec.rb +19 -1
- data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
- data/spec/mongoid/fields_spec.rb +2 -2
- data/spec/mongoid/findable_spec.rb +1 -1
- data/spec/mongoid/indexable_spec.rb +18 -8
- data/spec/mongoid/interceptable_spec.rb +22 -1
- data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
- data/spec/mongoid/matchable/eq_spec.rb +48 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +2 -2
- data/spec/mongoid/persistable/settable_spec.rb +95 -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 +61 -22
- data/spec/mongoid/relations/proxy_spec.rb +124 -124
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/shardable_spec.rb +32 -12
- data/spec/mongoid/threaded_spec.rb +68 -0
- 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_spec.rb +1 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +51 -25
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/spec_config.rb +39 -0
- metadata +602 -582
- checksums.yaml.gz.sig +0 -2
- 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
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
- /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
require 'mongoid/association/referenced/has_one/binding'
|
|
2
|
+
require 'mongoid/association/referenced/has_one/buildable'
|
|
3
|
+
require 'mongoid/association/referenced/has_one/proxy'
|
|
4
|
+
require 'mongoid/association/referenced/has_one/eager'
|
|
5
|
+
|
|
6
|
+
module Mongoid
|
|
7
|
+
module Association
|
|
8
|
+
module Referenced
|
|
9
|
+
|
|
10
|
+
# The has_one association.
|
|
11
|
+
#
|
|
12
|
+
# @since 7.0
|
|
13
|
+
class HasOne
|
|
14
|
+
include Relatable
|
|
15
|
+
include Buildable
|
|
16
|
+
|
|
17
|
+
# The options available for this type of association, in addition to the
|
|
18
|
+
# common ones.
|
|
19
|
+
#
|
|
20
|
+
# @return [ Array<Symbol> ] The extra valid options.
|
|
21
|
+
#
|
|
22
|
+
# @since 7.0
|
|
23
|
+
ASSOCIATION_OPTIONS = [
|
|
24
|
+
:as,
|
|
25
|
+
:autobuild,
|
|
26
|
+
:autosave,
|
|
27
|
+
:dependent,
|
|
28
|
+
:foreign_key,
|
|
29
|
+
:primary_key
|
|
30
|
+
].freeze
|
|
31
|
+
|
|
32
|
+
# The complete list of valid options for this association, including
|
|
33
|
+
# the shared ones.
|
|
34
|
+
#
|
|
35
|
+
# @return [ Array<Symbol> ] The valid options.
|
|
36
|
+
#
|
|
37
|
+
# @since 7.0
|
|
38
|
+
VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
|
|
39
|
+
|
|
40
|
+
# The default foreign key suffix.
|
|
41
|
+
#
|
|
42
|
+
# @return [ String ] '_id'
|
|
43
|
+
#
|
|
44
|
+
# @since 7.0
|
|
45
|
+
FOREIGN_KEY_SUFFIX = '_id'.freeze
|
|
46
|
+
|
|
47
|
+
# The list of association complements.
|
|
48
|
+
#
|
|
49
|
+
# @return [ Array<Association> ] The association complements.
|
|
50
|
+
#
|
|
51
|
+
# @since 7.0
|
|
52
|
+
def relation_complements
|
|
53
|
+
@relation_complements ||= [ Referenced::BelongsTo ].freeze
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Setup the instance methods, fields, etc. on the association owning class.
|
|
57
|
+
#
|
|
58
|
+
# @return [ self ]
|
|
59
|
+
#
|
|
60
|
+
# @since 7.0
|
|
61
|
+
def setup!
|
|
62
|
+
setup_instance_methods!
|
|
63
|
+
self
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Get the foreign key field for saving the association reference.
|
|
67
|
+
#
|
|
68
|
+
# @return [ String ] The foreign key field for saving the
|
|
69
|
+
# association reference.
|
|
70
|
+
#
|
|
71
|
+
# @since 7.0
|
|
72
|
+
def foreign_key
|
|
73
|
+
@foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
|
|
74
|
+
default_foreign_key_field
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Is this association type embedded?
|
|
78
|
+
#
|
|
79
|
+
# @return [ false ] Always false.
|
|
80
|
+
#
|
|
81
|
+
# @since 7.0
|
|
82
|
+
def embedded?; false; end
|
|
83
|
+
|
|
84
|
+
# The default for validation the association object.
|
|
85
|
+
#
|
|
86
|
+
# @return [ true ] Always true.
|
|
87
|
+
#
|
|
88
|
+
# @since 7.0
|
|
89
|
+
def validation_default; true; end
|
|
90
|
+
|
|
91
|
+
# Get the relation proxy class for this association type.
|
|
92
|
+
#
|
|
93
|
+
# @return [ Association::HasOne::Proxy ] The proxy class.
|
|
94
|
+
#
|
|
95
|
+
# @since 7.0
|
|
96
|
+
def relation
|
|
97
|
+
Proxy
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# The nested builder object.
|
|
101
|
+
#
|
|
102
|
+
# @param [ Hash ] attributes The attributes to use to build the association object.
|
|
103
|
+
# @param [ Hash ] options The options for the association.
|
|
104
|
+
#
|
|
105
|
+
# @return [ Association::Nested::Many ] The Nested Builder object.
|
|
106
|
+
#
|
|
107
|
+
# @since 7.0
|
|
108
|
+
def nested_builder(attributes, options)
|
|
109
|
+
Nested::One.new(self, attributes, options)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Is this association polymorphic?
|
|
113
|
+
#
|
|
114
|
+
# @return [ true, false ] Whether this association is polymorphic.
|
|
115
|
+
#
|
|
116
|
+
# @since 7.0
|
|
117
|
+
def polymorphic?
|
|
118
|
+
@polymorphic ||= !!as
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# The type of this association if it's polymorphic.
|
|
122
|
+
#
|
|
123
|
+
# @note Only relevant for polymorphic relations.
|
|
124
|
+
#
|
|
125
|
+
# @return [ String, nil ] The type field.
|
|
126
|
+
#
|
|
127
|
+
# @since 7.0
|
|
128
|
+
def type
|
|
129
|
+
@type ||= "#{as}_type" if polymorphic?
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Whether trying to bind an object using this association should raise
|
|
133
|
+
# an error.
|
|
134
|
+
#
|
|
135
|
+
# @param [ Document ] doc The document to be bound.
|
|
136
|
+
#
|
|
137
|
+
# @return [ true, false ] Whether the document can be bound.
|
|
138
|
+
def bindable?(doc)
|
|
139
|
+
forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def stores_foreign_key?; false; end
|
|
143
|
+
|
|
144
|
+
# Get the path calculator for the supplied document.
|
|
145
|
+
#
|
|
146
|
+
# @example Get the path calculator.
|
|
147
|
+
# Proxy.path(document)
|
|
148
|
+
#
|
|
149
|
+
# @param [ Document ] document The document to calculate on.
|
|
150
|
+
#
|
|
151
|
+
# @return [ Root ] The root atomic path calculator.
|
|
152
|
+
#
|
|
153
|
+
# @since 2.1.0
|
|
154
|
+
def path(document)
|
|
155
|
+
Mongoid::Atomic::Paths::Root.new(document)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
private
|
|
159
|
+
|
|
160
|
+
# Setup the instance methods on the class having this association type.
|
|
161
|
+
#
|
|
162
|
+
# @return [ self ]
|
|
163
|
+
#
|
|
164
|
+
# @since 7.0
|
|
165
|
+
def setup_instance_methods!
|
|
166
|
+
define_getter!
|
|
167
|
+
define_setter!
|
|
168
|
+
define_existence_check!
|
|
169
|
+
define_builder!
|
|
170
|
+
define_creator!
|
|
171
|
+
define_autosaver!
|
|
172
|
+
polymorph!
|
|
173
|
+
define_dependency!
|
|
174
|
+
@owner_class.validates_associated(name) if validate?
|
|
175
|
+
self
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def default_foreign_key_field
|
|
179
|
+
@default_foreign_key_field ||= "#{inverse}#{FOREIGN_KEY_SUFFIX}"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def polymorphic_inverses(other)
|
|
183
|
+
[ as ]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def determine_inverses(other)
|
|
187
|
+
matches = (other || relation_class).relations.values.select do |rel|
|
|
188
|
+
relation_complements.include?(rel.class) &&
|
|
189
|
+
rel.relation_class_name == inverse_class_name
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
if matches.size > 1
|
|
193
|
+
raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
|
|
194
|
+
end
|
|
195
|
+
matches.collect { |m| m.name } unless matches.blank?
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def default_primary_key
|
|
199
|
+
PRIMARY_KEY_DEFAULT
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
|
|
6
|
+
# This module handles the behaviour for synchronizing foreign keys between
|
|
7
|
+
# both sides of a many to many relations.
|
|
8
|
+
module Syncable
|
|
9
|
+
|
|
10
|
+
# Is the document able to be synced on the inverse side? This is only if
|
|
11
|
+
# the key has changed and the relation bindings have not been run.
|
|
12
|
+
#
|
|
13
|
+
# @example Are the foreign keys syncable?
|
|
14
|
+
# document._syncable?(association)
|
|
15
|
+
#
|
|
16
|
+
# @param [ Association ] association The association metadata.
|
|
17
|
+
#
|
|
18
|
+
# @return [ true, false ] If we can sync.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.1.0
|
|
21
|
+
def _syncable?(association)
|
|
22
|
+
!_synced?(association.foreign_key) && send(association.foreign_key_check)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Get the synced foreign keys.
|
|
26
|
+
#
|
|
27
|
+
# @example Get the synced foreign keys.
|
|
28
|
+
# document._synced
|
|
29
|
+
#
|
|
30
|
+
# @return [ Hash ] The synced foreign keys.
|
|
31
|
+
#
|
|
32
|
+
# @since 2.1.0
|
|
33
|
+
def _synced
|
|
34
|
+
@_synced ||= {}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Has the document been synced for the foreign key?
|
|
38
|
+
#
|
|
39
|
+
# @example Has the document been synced?
|
|
40
|
+
# document._synced?
|
|
41
|
+
#
|
|
42
|
+
# @param [ String ] foreign_key The foreign key.
|
|
43
|
+
#
|
|
44
|
+
# @return [ true, false ] If we can sync.
|
|
45
|
+
#
|
|
46
|
+
# @since 2.1.0
|
|
47
|
+
def _synced?(foreign_key)
|
|
48
|
+
!!_synced[foreign_key]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Update the inverse keys on destroy.
|
|
52
|
+
#
|
|
53
|
+
# @example Update the inverse keys.
|
|
54
|
+
# document.remove_inverse_keys(association)
|
|
55
|
+
#
|
|
56
|
+
# @param [ Association ] association The association.
|
|
57
|
+
#
|
|
58
|
+
# @return [ Object ] The updated values.
|
|
59
|
+
#
|
|
60
|
+
# @since 2.2.1
|
|
61
|
+
def remove_inverse_keys(association)
|
|
62
|
+
foreign_keys = send(association.foreign_key)
|
|
63
|
+
unless foreign_keys.nil? || foreign_keys.empty?
|
|
64
|
+
association.criteria(self, foreign_keys).pull(association.inverse_foreign_key => _id)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Update the inverse keys for the relation.
|
|
69
|
+
#
|
|
70
|
+
# @example Update the inverse keys
|
|
71
|
+
# document.update_inverse_keys(association)
|
|
72
|
+
#
|
|
73
|
+
# @param [ Association ] association The document association.
|
|
74
|
+
#
|
|
75
|
+
# @return [ Object ] The updated values.
|
|
76
|
+
#
|
|
77
|
+
# @since 2.1.0
|
|
78
|
+
def update_inverse_keys(association)
|
|
79
|
+
if changes.has_key?(association.foreign_key)
|
|
80
|
+
old, new = changes[association.foreign_key]
|
|
81
|
+
adds, subs = new - (old || []), (old || []) - new
|
|
82
|
+
|
|
83
|
+
# If we are autosaving we don't want a duplicate to get added - the
|
|
84
|
+
# $addToSet would run previously and then the $push and $each from the
|
|
85
|
+
# inverse on the autosave would cause this. We delete each id from
|
|
86
|
+
# what's in memory in case a mix of id addition and object addition
|
|
87
|
+
# had occurred.
|
|
88
|
+
if association.autosave?
|
|
89
|
+
send(association.name).in_memory.each do |doc|
|
|
90
|
+
adds.delete_one(doc._id)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
unless adds.empty?
|
|
95
|
+
association.criteria(self, adds).without_options.add_to_set(association.inverse_foreign_key => _id)
|
|
96
|
+
end
|
|
97
|
+
unless subs.empty?
|
|
98
|
+
association.criteria(self, subs).without_options.pull(association.inverse_foreign_key => _id)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
module ClassMethods
|
|
104
|
+
|
|
105
|
+
# Set up the syncing of many to many foreign keys.
|
|
106
|
+
#
|
|
107
|
+
# @example Set up the syncing.
|
|
108
|
+
# Person._synced(association)
|
|
109
|
+
#
|
|
110
|
+
# @param [ Association ] association The association metadata.
|
|
111
|
+
#
|
|
112
|
+
# @since 2.1.0
|
|
113
|
+
def _synced(association)
|
|
114
|
+
unless association.forced_nil_inverse?
|
|
115
|
+
synced_save(association)
|
|
116
|
+
synced_destroy(association)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
private
|
|
121
|
+
|
|
122
|
+
# Set up the sync of inverse keys that needs to happen on a save.
|
|
123
|
+
#
|
|
124
|
+
# If the foreign key field has changed and the document is not
|
|
125
|
+
# synced, $addToSet the new ids, $pull the ones no longer in the
|
|
126
|
+
# array from the inverse side.
|
|
127
|
+
#
|
|
128
|
+
# @example Set up the save syncing.
|
|
129
|
+
# Person.synced_save(association)
|
|
130
|
+
#
|
|
131
|
+
# @param [ Association ] association The relation association.
|
|
132
|
+
#
|
|
133
|
+
# @return [ Class ] The class getting set up.
|
|
134
|
+
#
|
|
135
|
+
# @since 2.1.0
|
|
136
|
+
def synced_save(association)
|
|
137
|
+
set_callback(
|
|
138
|
+
:save,
|
|
139
|
+
:after,
|
|
140
|
+
if: ->(doc) { doc._syncable?(association) }
|
|
141
|
+
) do |doc|
|
|
142
|
+
doc.update_inverse_keys(association)
|
|
143
|
+
end
|
|
144
|
+
self
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Set up the sync of inverse keys that needs to happen on a destroy.
|
|
148
|
+
#
|
|
149
|
+
# @example Set up the destroy syncing.
|
|
150
|
+
# Person.synced_destroy(association)
|
|
151
|
+
#
|
|
152
|
+
# @param [ Association ] association The association metadata.
|
|
153
|
+
#
|
|
154
|
+
# @return [ Class ] The class getting set up.
|
|
155
|
+
#
|
|
156
|
+
# @since 2.2.1
|
|
157
|
+
def synced_destroy(association)
|
|
158
|
+
set_callback(
|
|
159
|
+
:destroy,
|
|
160
|
+
:after
|
|
161
|
+
) do |doc|
|
|
162
|
+
doc.remove_inverse_keys(association)
|
|
163
|
+
end
|
|
164
|
+
self
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
require 'mongoid/association/referenced/auto_save'
|
|
2
|
+
require 'mongoid/association/referenced/counter_cache'
|
|
3
|
+
require 'mongoid/association/referenced/syncable'
|
|
4
|
+
require 'mongoid/association/referenced/belongs_to'
|
|
5
|
+
require 'mongoid/association/referenced/has_many'
|
|
6
|
+
require 'mongoid/association/referenced/has_and_belongs_to_many'
|
|
7
|
+
require 'mongoid/association/referenced/has_one'
|
|
@@ -1,62 +1,66 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Association
|
|
4
4
|
|
|
5
5
|
# The reflections module provides convenience methods that can retrieve
|
|
6
6
|
# useful information about associations.
|
|
7
7
|
module Reflections
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
|
-
# Returns the
|
|
10
|
+
# Returns the association metadata for the supplied name.
|
|
11
11
|
#
|
|
12
|
-
# @example Find relation
|
|
12
|
+
# @example Find relation association by name.
|
|
13
13
|
# person.reflect_on_association(:addresses)
|
|
14
14
|
#
|
|
15
15
|
# @param [ String, Symbol ] name The name of the relation to find.
|
|
16
16
|
#
|
|
17
|
-
# @return [
|
|
17
|
+
# @return [ Association ] The matching association metadata.
|
|
18
18
|
def reflect_on_association(name)
|
|
19
19
|
self.class.reflect_on_association(name)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
# Returns all
|
|
22
|
+
# Returns all association metadata for the supplied macros.
|
|
23
23
|
#
|
|
24
|
-
# @example Find multiple
|
|
24
|
+
# @example Find multiple association metadata by macro.
|
|
25
25
|
# person.reflect_on_all_associations(:embeds_many)
|
|
26
26
|
#
|
|
27
27
|
# @param [ Array<Symbol> ] macros The relation macros.
|
|
28
28
|
#
|
|
29
|
-
# @return [ Array<
|
|
30
|
-
def
|
|
29
|
+
# @return [ Array<Association> ] The matching association metadata.
|
|
30
|
+
def reflect_on_all_association(*macros)
|
|
31
31
|
self.class.reflect_on_all_associations(*macros)
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
module ClassMethods
|
|
35
35
|
|
|
36
|
-
# Returns the
|
|
36
|
+
# Returns the association metadata for the supplied name.
|
|
37
37
|
#
|
|
38
|
-
# @example Find
|
|
38
|
+
# @example Find association metadata by name.
|
|
39
39
|
# Person.reflect_on_association(:addresses)
|
|
40
40
|
#
|
|
41
41
|
# @param [ String, Symbol ] name The name of the relation to find.
|
|
42
42
|
#
|
|
43
|
-
# @return [
|
|
43
|
+
# @return [ Association ] The matching association metadata.
|
|
44
44
|
def reflect_on_association(name)
|
|
45
45
|
relations[name.to_s]
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
# Returns all
|
|
48
|
+
# Returns all association metadata for the supplied macros.
|
|
49
49
|
#
|
|
50
|
-
# @example Find multiple
|
|
50
|
+
# @example Find multiple association metadata by macro.
|
|
51
51
|
# Person.reflect_on_all_associations(:embeds_many)
|
|
52
52
|
#
|
|
53
53
|
# @param [ Array<Symbol> ] macros The relation macros.
|
|
54
54
|
#
|
|
55
|
-
# @return [ Array<
|
|
55
|
+
# @return [ Array<Association> ] The matching association metadata.
|
|
56
56
|
def reflect_on_all_associations(*macros)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
all_associations = relations.values
|
|
58
|
+
unless macros.empty?
|
|
59
|
+
all_associations.select! do |reflection|
|
|
60
|
+
macros.include?(Association::MACRO_MAPPING.key(reflection.class))
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
all_associations
|
|
60
64
|
end
|
|
61
65
|
end
|
|
62
66
|
end
|