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,87 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class BelongsTo
|
|
6
|
+
|
|
7
|
+
# Binding class for belongs_to associations.
|
|
8
|
+
class Binding
|
|
9
|
+
include Bindable
|
|
10
|
+
|
|
11
|
+
# Binds the base object to the inverse of the relation. This is so we
|
|
12
|
+
# are referenced to the actual objects themselves on both sides.
|
|
13
|
+
#
|
|
14
|
+
# This case sets the association on the inverse object as well as the
|
|
15
|
+
# document itself.
|
|
16
|
+
#
|
|
17
|
+
# @example Bind the documents.
|
|
18
|
+
# game.person.bind(:continue => true)
|
|
19
|
+
# game.person = Person.new
|
|
20
|
+
#
|
|
21
|
+
# @since 2.0.0.rc.1
|
|
22
|
+
def bind_one
|
|
23
|
+
binding do
|
|
24
|
+
check_polymorphic_inverses!(_target)
|
|
25
|
+
bind_foreign_key(_base, record_id(_target))
|
|
26
|
+
bind_polymorphic_inverse_type(_base, _target.class.name)
|
|
27
|
+
if inverse = _association.inverse(_target)
|
|
28
|
+
if set_base_association
|
|
29
|
+
if _base.referenced_many?
|
|
30
|
+
_target.__send__(inverse).push(_base)
|
|
31
|
+
else
|
|
32
|
+
_target.set_relation(inverse, _base)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Unbinds the base object and the inverse, caused by setting the
|
|
40
|
+
# reference to nil.
|
|
41
|
+
#
|
|
42
|
+
# @example Unbind the document.
|
|
43
|
+
# game.person.unbind(:continue => true)
|
|
44
|
+
# game.person = nil
|
|
45
|
+
#
|
|
46
|
+
# @since 2.0.0.rc.1
|
|
47
|
+
def unbind_one
|
|
48
|
+
binding do
|
|
49
|
+
inverse = _association.inverse(_target)
|
|
50
|
+
bind_foreign_key(_base, nil)
|
|
51
|
+
bind_polymorphic_inverse_type(_base, nil)
|
|
52
|
+
if inverse
|
|
53
|
+
set_base_association
|
|
54
|
+
if _base.referenced_many?
|
|
55
|
+
_target.__send__(inverse).delete(_base)
|
|
56
|
+
else
|
|
57
|
+
_target.set_relation(inverse, nil)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
# Check for problems with multiple inverse definitions.
|
|
66
|
+
#
|
|
67
|
+
# @api private
|
|
68
|
+
#
|
|
69
|
+
# @example Check for inverses errors.
|
|
70
|
+
# binding.check_inverses!(doc)
|
|
71
|
+
#
|
|
72
|
+
# @param [ Document ] doc The document to check.
|
|
73
|
+
#
|
|
74
|
+
# @since 3.0.0
|
|
75
|
+
def check_polymorphic_inverses!(doc)
|
|
76
|
+
inverses = _association.inverses(doc)
|
|
77
|
+
if inverses.count > 1 && _base.send(_association.foreign_key).nil?
|
|
78
|
+
raise Errors::InvalidSetPolymorphicRelation.new(
|
|
79
|
+
_association.name, _base.class.name, _target.class.name
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class BelongsTo
|
|
6
|
+
|
|
7
|
+
# The Builder behavior for belongs_to associations.
|
|
8
|
+
#
|
|
9
|
+
# @since 7.0
|
|
10
|
+
module Buildable
|
|
11
|
+
|
|
12
|
+
# This method either takes an _id or an object and queries for the
|
|
13
|
+
# inverse side using the id or sets the object.
|
|
14
|
+
#
|
|
15
|
+
# @example Build the document.
|
|
16
|
+
# relation.build(meta, attrs)
|
|
17
|
+
#
|
|
18
|
+
# @param [ Object ] base The base object.
|
|
19
|
+
# @param [ Object ] object The object to use to build the relation.
|
|
20
|
+
# @param [ String ] type The type of the relation.
|
|
21
|
+
#
|
|
22
|
+
# @return [ Document ] A single document.
|
|
23
|
+
def build(base, object, type = nil)
|
|
24
|
+
return object unless query?(object)
|
|
25
|
+
execute_query(object, type)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def execute_query(object, type)
|
|
31
|
+
query_criteria(object, type).limit(-1).first(id_sort: :none)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def query_criteria(object, type)
|
|
35
|
+
model = type ? type.constantize : relation_class
|
|
36
|
+
model.where(primary_key => object)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def query?(object)
|
|
40
|
+
object && !object.is_a?(Mongoid::Document)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class BelongsTo
|
|
6
|
+
|
|
7
|
+
# Eager class for belongs_to associations.
|
|
8
|
+
class Eager < Association::Referenced::Eager::Base
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def preload
|
|
13
|
+
raise Errors::EagerLoad.new(@association.name) if @association.polymorphic?
|
|
14
|
+
|
|
15
|
+
@docs.each do |d|
|
|
16
|
+
set_relation(d, nil)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
each_loaded_document do |doc|
|
|
20
|
+
id = doc.send(key)
|
|
21
|
+
set_on_parent(id, doc)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def group_by_key
|
|
26
|
+
@association.foreign_key
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def key
|
|
30
|
+
@association.primary_key
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class BelongsTo
|
|
6
|
+
|
|
7
|
+
# This class handles all behaviour for relations that are either
|
|
8
|
+
# one-to-many or one-to-one, where the foreign key is stored on this side
|
|
9
|
+
# of the relation and the reference is to document(s) in another
|
|
10
|
+
# collection.
|
|
11
|
+
class Proxy < Association::One
|
|
12
|
+
include Evolvable
|
|
13
|
+
|
|
14
|
+
# Instantiate a new belongs_to association proxy.
|
|
15
|
+
#
|
|
16
|
+
# @example Create the new proxy.
|
|
17
|
+
# Association::BelongsTo::Proxy.new(game, person, association)
|
|
18
|
+
#
|
|
19
|
+
# @param [ Document ] base The document this relation hangs off of.
|
|
20
|
+
# @param [ Document, Array<Document> ] target The target (parent) of the
|
|
21
|
+
# relation.
|
|
22
|
+
# @param [ Association ] association The association object.
|
|
23
|
+
def initialize(base, target, association)
|
|
24
|
+
init(base, target, association) do
|
|
25
|
+
characterize_one(_target)
|
|
26
|
+
bind_one
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Removes the association between the base document and the target
|
|
31
|
+
# document by deleting the foreign key and the reference, orphaning
|
|
32
|
+
# the target document in the process.
|
|
33
|
+
#
|
|
34
|
+
# @example Nullify the relation.
|
|
35
|
+
# person.game.nullify
|
|
36
|
+
#
|
|
37
|
+
def nullify
|
|
38
|
+
unbind_one
|
|
39
|
+
_target.save
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Substitutes the supplied target documents for the existing document
|
|
43
|
+
# in the relation.
|
|
44
|
+
#
|
|
45
|
+
# @example Substitute the relation.
|
|
46
|
+
# name.substitute(new_name)
|
|
47
|
+
#
|
|
48
|
+
# @param [ Document, Array<Document> ] replacement The replacement.
|
|
49
|
+
#
|
|
50
|
+
# @return [ self, nil ] The relation or nil.
|
|
51
|
+
#
|
|
52
|
+
# @since 2.0.0.rc.1
|
|
53
|
+
def substitute(replacement)
|
|
54
|
+
unbind_one
|
|
55
|
+
if replacement
|
|
56
|
+
self._target = normalize(replacement)
|
|
57
|
+
bind_one
|
|
58
|
+
self
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
# Instantiate the binding associated with this relation.
|
|
65
|
+
#
|
|
66
|
+
# @example Get the binding object.
|
|
67
|
+
# binding([ address ])
|
|
68
|
+
#
|
|
69
|
+
# @return [ Binding ] The binding object.
|
|
70
|
+
#
|
|
71
|
+
# @since 2.0.0.rc.1
|
|
72
|
+
def binding
|
|
73
|
+
BelongsTo::Binding.new(_base, _target, _association)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Normalize the value provided as a replacement for substitution.
|
|
77
|
+
#
|
|
78
|
+
# @api private
|
|
79
|
+
#
|
|
80
|
+
# @example Normalize the substitute.
|
|
81
|
+
# proxy.normalize(id)
|
|
82
|
+
#
|
|
83
|
+
# @param [ Document, Object ] replacement The replacement object.
|
|
84
|
+
#
|
|
85
|
+
# @return [ Document ] The document.
|
|
86
|
+
#
|
|
87
|
+
# @since 3.1.5
|
|
88
|
+
def normalize(replacement)
|
|
89
|
+
return replacement if replacement.is_a?(Document)
|
|
90
|
+
_association.build(klass, replacement)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Are we able to persist this relation?
|
|
94
|
+
#
|
|
95
|
+
# @example Can we persist the relation?
|
|
96
|
+
# relation.persistable?
|
|
97
|
+
#
|
|
98
|
+
# @return [ true, false ] If the relation is persistable.
|
|
99
|
+
#
|
|
100
|
+
# @since 2.1.0
|
|
101
|
+
def persistable?
|
|
102
|
+
_target.persisted? && !_binding? && !_building?
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class << self
|
|
106
|
+
|
|
107
|
+
# Get the Eager object for this type of association.
|
|
108
|
+
#
|
|
109
|
+
# @example Get the eager loader object
|
|
110
|
+
#
|
|
111
|
+
# @param [ Association ] association The association object.
|
|
112
|
+
# @param [ Array<Document> ] docs The array of documents.
|
|
113
|
+
#
|
|
114
|
+
# @since 7.0
|
|
115
|
+
def eager_loader(association, docs)
|
|
116
|
+
Eager.new(association, docs)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Returns true if the relation is an embedded one. In this case
|
|
120
|
+
# always false.
|
|
121
|
+
#
|
|
122
|
+
# @example Is this relation embedded?
|
|
123
|
+
# Association::BelongsTo::Proxy.embedded?
|
|
124
|
+
#
|
|
125
|
+
# @return [ false ] Always false.
|
|
126
|
+
#
|
|
127
|
+
# @since 2.0.0.rc.1
|
|
128
|
+
def embedded?
|
|
129
|
+
false
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
require 'mongoid/association/referenced/belongs_to/binding'
|
|
2
|
+
require 'mongoid/association/referenced/belongs_to/buildable'
|
|
3
|
+
require 'mongoid/association/referenced/belongs_to/proxy'
|
|
4
|
+
require 'mongoid/association/referenced/belongs_to/eager'
|
|
5
|
+
|
|
6
|
+
module Mongoid
|
|
7
|
+
module Association
|
|
8
|
+
module Referenced
|
|
9
|
+
|
|
10
|
+
# The BelongsTo type association.
|
|
11
|
+
#
|
|
12
|
+
# @since 7.0
|
|
13
|
+
class BelongsTo
|
|
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
|
+
:autobuild,
|
|
25
|
+
:autosave,
|
|
26
|
+
:counter_cache,
|
|
27
|
+
:dependent,
|
|
28
|
+
:foreign_key,
|
|
29
|
+
:index,
|
|
30
|
+
:polymorphic,
|
|
31
|
+
:primary_key,
|
|
32
|
+
:touch,
|
|
33
|
+
:optional,
|
|
34
|
+
:required
|
|
35
|
+
].freeze
|
|
36
|
+
|
|
37
|
+
# The complete list of valid options for this association, including
|
|
38
|
+
# the shared ones.
|
|
39
|
+
#
|
|
40
|
+
# @return [ Array<Symbol> ] The valid options.
|
|
41
|
+
#
|
|
42
|
+
# @since 7.0
|
|
43
|
+
VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
|
|
44
|
+
|
|
45
|
+
# The type of the field holding the foreign key.
|
|
46
|
+
#
|
|
47
|
+
# @return [ Object ]
|
|
48
|
+
#
|
|
49
|
+
# @since 7.0
|
|
50
|
+
FOREIGN_KEY_FIELD_TYPE = Object
|
|
51
|
+
|
|
52
|
+
# The default foreign key suffix.
|
|
53
|
+
#
|
|
54
|
+
# @return [ String ] '_id'
|
|
55
|
+
#
|
|
56
|
+
# @since 7.0
|
|
57
|
+
FOREIGN_KEY_SUFFIX = '_id'.freeze
|
|
58
|
+
|
|
59
|
+
# The list of association complements.
|
|
60
|
+
#
|
|
61
|
+
# @return [ Array<Association> ] The association complements.
|
|
62
|
+
#
|
|
63
|
+
# @since 7.0
|
|
64
|
+
def relation_complements
|
|
65
|
+
@relation_complements ||= [ HasMany, HasOne ].freeze
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Setup the instance methods, fields, etc. on the association owning class.
|
|
69
|
+
#
|
|
70
|
+
# @return [ self ]
|
|
71
|
+
#
|
|
72
|
+
# @since 7.0
|
|
73
|
+
def setup!
|
|
74
|
+
setup_instance_methods!
|
|
75
|
+
@owner_class.aliased_fields[name.to_s] = foreign_key
|
|
76
|
+
self
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Does this association type store the foreign key?
|
|
80
|
+
#
|
|
81
|
+
# @return [ true ] Always true.
|
|
82
|
+
#
|
|
83
|
+
# @since 7.0
|
|
84
|
+
def stores_foreign_key?; true; end
|
|
85
|
+
|
|
86
|
+
# Is this association type embedded?
|
|
87
|
+
#
|
|
88
|
+
# @return [ false ] Always false.
|
|
89
|
+
#
|
|
90
|
+
# @since 7.0
|
|
91
|
+
def embedded?; false; end
|
|
92
|
+
|
|
93
|
+
# The default for validation the association object.
|
|
94
|
+
#
|
|
95
|
+
# @return [ false ] Always false.
|
|
96
|
+
#
|
|
97
|
+
# @since 7.0
|
|
98
|
+
def validation_default; false; end
|
|
99
|
+
|
|
100
|
+
# Get the foreign key field for saving the association reference.
|
|
101
|
+
#
|
|
102
|
+
# @return [ String ] The foreign key field for saving the association reference.
|
|
103
|
+
#
|
|
104
|
+
# @since 7.0
|
|
105
|
+
def foreign_key
|
|
106
|
+
@foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
|
|
107
|
+
default_foreign_key_field
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Get the relation proxy class for this association type.
|
|
111
|
+
#
|
|
112
|
+
# @return [ Association::BelongsTo::Proxy ] The proxy class.
|
|
113
|
+
#
|
|
114
|
+
# @since 7.0
|
|
115
|
+
def relation
|
|
116
|
+
Proxy
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Is this association polymorphic?
|
|
120
|
+
#
|
|
121
|
+
# @return [ true, false ] Whether this association is polymorphic.
|
|
122
|
+
#
|
|
123
|
+
# @since 7.0
|
|
124
|
+
def polymorphic?
|
|
125
|
+
@polymorphic ||= !!@options[:polymorphic]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# The name of the field used to store the type of polymorphic relation.
|
|
129
|
+
#
|
|
130
|
+
# @return [ String ] The field used to store the type of polymorphic relation.
|
|
131
|
+
#
|
|
132
|
+
# @since 7.0
|
|
133
|
+
def inverse_type
|
|
134
|
+
(@inverse_type ||= "#{name}_type") if polymorphic?
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# The nested builder object.
|
|
138
|
+
#
|
|
139
|
+
# @param [ Hash ] attributes The attributes to use to build the association object.
|
|
140
|
+
# @param [ Hash ] options The options for the association.
|
|
141
|
+
#
|
|
142
|
+
# @return [ Association::Nested::One ] The Nested Builder object.
|
|
143
|
+
#
|
|
144
|
+
# @since 7.0
|
|
145
|
+
def nested_builder(attributes, options)
|
|
146
|
+
Nested::One.new(self, attributes, options)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Get the path calculator for the supplied document.
|
|
150
|
+
#
|
|
151
|
+
# @example Get the path calculator.
|
|
152
|
+
# association.path(document)
|
|
153
|
+
#
|
|
154
|
+
# @param [ Document ] document The document to calculate on.
|
|
155
|
+
#
|
|
156
|
+
# @return [ Root ] The root atomic path calculator.
|
|
157
|
+
#
|
|
158
|
+
# @since 2.1.0
|
|
159
|
+
def path(document)
|
|
160
|
+
Mongoid::Atomic::Paths::Root.new(document)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
private
|
|
164
|
+
|
|
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
|
+
define_counter_cache_callbacks!
|
|
173
|
+
polymorph!
|
|
174
|
+
define_dependency!
|
|
175
|
+
create_foreign_key_field!
|
|
176
|
+
setup_index!
|
|
177
|
+
define_touchable!
|
|
178
|
+
@owner_class.validates_associated(name) if validate?
|
|
179
|
+
@owner_class.validates(name, presence: true) if require_association?
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def index_spec
|
|
183
|
+
if polymorphic?
|
|
184
|
+
{ key => 1, inverse_type => 1 }
|
|
185
|
+
else
|
|
186
|
+
{ key => 1 }
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def default_primary_key
|
|
191
|
+
PRIMARY_KEY_DEFAULT
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def default_foreign_key_field
|
|
195
|
+
@default_foreign_key_field ||= "#{name}#{FOREIGN_KEY_SUFFIX}"
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def polymorph!
|
|
199
|
+
if polymorphic?
|
|
200
|
+
@owner_class.polymorphic = true
|
|
201
|
+
@owner_class.field(inverse_type, type: String)
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def polymorphic_inverses(other = nil)
|
|
206
|
+
if other
|
|
207
|
+
matches = other.relations.values.select do |rel|
|
|
208
|
+
relation_complements.include?(rel.class) &&
|
|
209
|
+
rel.as == name &&
|
|
210
|
+
rel.relation_class_name == inverse_class_name
|
|
211
|
+
end
|
|
212
|
+
matches.collect { |m| m.name }
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def determine_inverses(other)
|
|
217
|
+
matches = (other || relation_class).relations.values.select do |rel|
|
|
218
|
+
relation_complements.include?(rel.class) &&
|
|
219
|
+
rel.relation_class_name == inverse_class_name
|
|
220
|
+
|
|
221
|
+
end
|
|
222
|
+
if matches.size > 1
|
|
223
|
+
raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
|
|
224
|
+
end
|
|
225
|
+
matches.collect { |m| m.name }
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# If set to true, then the associated object will be validated when this object is saved
|
|
229
|
+
def require_association?
|
|
230
|
+
required = @options[:required] if @options.key?(:required)
|
|
231
|
+
required = !@options[:optional] if @options.key?(:optional) && required.nil?
|
|
232
|
+
required.nil? ? Mongoid.belongs_to_required_by_default : required
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def create_foreign_key_field!
|
|
236
|
+
@owner_class.field(
|
|
237
|
+
foreign_key,
|
|
238
|
+
type: FOREIGN_KEY_FIELD_TYPE,
|
|
239
|
+
identity: true,
|
|
240
|
+
overwrite: true,
|
|
241
|
+
association: self,
|
|
242
|
+
default: nil
|
|
243
|
+
)
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|