mongoid 6.4.8 → 7.0.0.beta
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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +0 -26
- data/lib/config/locales/en.yml +17 -21
- data/lib/mongoid.rb +2 -2
- data/lib/mongoid/association.rb +150 -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 +116 -0
- data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
- data/lib/mongoid/association/embedded.rb +4 -0
- data/lib/mongoid/{relations → association}/embedded/batchable.rb +27 -53
- data/lib/mongoid/association/embedded/cyclic.rb +109 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +154 -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/embeds_many.rb +210 -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 +529 -0
- data/lib/mongoid/association/embedded/embeds_one.rb +173 -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/macros.rb +204 -0
- data/lib/mongoid/{relations → association}/many.rb +18 -52
- data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
- data/lib/mongoid/association/nested.rb +15 -0
- 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/{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.rb +7 -0
- data/lib/mongoid/association/referenced/auto_save.rb +79 -0
- data/lib/mongoid/association/referenced/belongs_to.rb +248 -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/counter_cache.rb +163 -0
- data/lib/mongoid/association/referenced/eager.rb +159 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -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 +310 -0
- data/lib/mongoid/association/referenced/has_many.rb +273 -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 +479 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +577 -0
- data/lib/mongoid/association/referenced/has_one.rb +204 -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/syncable.rb +170 -0
- data/lib/mongoid/{relations → association}/reflections.rb +21 -17
- data/lib/mongoid/association/relatable.rb +415 -0
- data/lib/mongoid/association/touchable.rb +97 -0
- data/lib/mongoid/atomic.rb +6 -6
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/attributes.rb +2 -1
- data/lib/mongoid/attributes/nested.rb +10 -10
- data/lib/mongoid/attributes/processing.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +2 -4
- data/lib/mongoid/clients.rb +0 -2
- data/lib/mongoid/clients/options.rb +1 -1
- data/lib/mongoid/clients/storage_options.rb +0 -1
- data/lib/mongoid/composable.rb +3 -4
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +3 -6
- data/lib/mongoid/contextual/map_reduce.rb +3 -7
- data/lib/mongoid/contextual/memory.rb +5 -10
- data/lib/mongoid/contextual/mongo.rb +10 -27
- data/lib/mongoid/copyable.rb +6 -6
- data/lib/mongoid/criteria.rb +1 -2
- data/lib/mongoid/criteria/includable.rb +14 -14
- data/lib/mongoid/criteria/modifiable.rb +8 -14
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -3
- data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
- data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
- data/lib/mongoid/document.rb +6 -6
- data/lib/mongoid/errors.rb +3 -1
- 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/extensions/array.rb +5 -5
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/range.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +0 -1
- data/lib/mongoid/extensions/string.rb +1 -3
- data/lib/mongoid/factory.rb +4 -3
- data/lib/mongoid/fields.rb +1 -1
- 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/indexable.rb +8 -5
- data/lib/mongoid/interceptable.rb +5 -5
- data/lib/mongoid/matchable.rb +0 -3
- data/lib/mongoid/persistable.rb +4 -5
- data/lib/mongoid/persistable/creatable.rb +2 -4
- data/lib/mongoid/persistable/deletable.rb +9 -10
- data/lib/mongoid/persistable/destroyable.rb +5 -1
- data/lib/mongoid/persistable/incrementable.rb +1 -1
- data/lib/mongoid/persistable/logical.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +2 -2
- data/lib/mongoid/persistable/upsertable.rb +1 -2
- data/lib/mongoid/persistence_context.rb +4 -9
- data/lib/mongoid/query_cache.rb +18 -65
- data/lib/mongoid/railtie.rb +0 -17
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +3 -3
- data/lib/mongoid/tasks/database.rb +2 -3
- data/lib/mongoid/threaded.rb +0 -74
- data/lib/mongoid/traversable.rb +2 -2
- data/lib/mongoid/validatable.rb +8 -8
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +4 -4
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -4
- data/spec/app/models/animal.rb +2 -1
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/bomb.rb +1 -1
- data/spec/app/models/message.rb +1 -1
- data/spec/app/models/person.rb +5 -2
- data/spec/app/models/vertex.rb +6 -0
- data/spec/app/models/wiki_page.rb +1 -1
- data/spec/config/mongoid.yml +1 -0
- data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -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 +613 -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} +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} +140 -428
- 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 -93
- 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 +7 -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} +9 -9
- 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 +1963 -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} +5 -5
- 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_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} +11 -11
- data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +1 -109
- data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
- 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_spec.rb +1244 -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 → association}/touchable_spec.rb +19 -1
- data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -12
- data/spec/mongoid/attributes/readonly_spec.rb +80 -125
- data/spec/mongoid/clients/factory_spec.rb +28 -52
- data/spec/mongoid/clients/options_spec.rb +65 -69
- data/spec/mongoid/config_spec.rb +24 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
- data/spec/mongoid/contextual/mongo_spec.rb +4 -112
- 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/pipeline_spec.rb +12 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +6 -74
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +0 -81
- data/spec/mongoid/criteria_spec.rb +16 -19
- data/spec/mongoid/document_spec.rb +2 -56
- data/spec/mongoid/extensions/array_spec.rb +11 -15
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- 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 +0 -23
- data/spec/mongoid/extensions/string_spec.rb +7 -35
- data/spec/mongoid/factory_spec.rb +18 -11
- 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 +21 -2
- data/spec/mongoid/matchable_spec.rb +1 -26
- data/spec/mongoid/persistable/deletable_spec.rb +0 -19
- data/spec/mongoid/persistable/destroyable_spec.rb +0 -19
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +3 -3
- data/spec/mongoid/persistable/settable_spec.rb +1 -35
- data/spec/mongoid/persistable/updatable_spec.rb +2 -2
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/persistence_context_spec.rb +0 -14
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +18 -87
- data/spec/mongoid/relations/proxy_spec.rb +124 -124
- data/spec/mongoid/scopable_spec.rb +0 -13
- data/spec/mongoid/threaded_spec.rb +0 -68
- 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/spec_helper.rb +7 -83
- metadata +586 -611
- metadata.gz.sig +2 -5
- data/lib/mongoid/clients/sessions.rb +0 -113
- data/lib/mongoid/errors/invalid_session_use.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/railties/controller_runtime.rb +0 -86
- data/lib/mongoid/relations.rb +0 -148
- data/lib/mongoid/relations/accessors.rb +0 -267
- data/lib/mongoid/relations/auto_save.rb +0 -94
- data/lib/mongoid/relations/bindings.rb +0 -9
- 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/builder.rb +0 -57
- data/lib/mongoid/relations/builders.rb +0 -106
- 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/cascading.rb +0 -56
- 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/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.rb +0 -2
- data/lib/mongoid/relations/targets/enumerable.rb +0 -493
- data/lib/mongoid/relations/touchable.rb +0 -97
- data/spec/app/models/array_field.rb +0 -7
- data/spec/app/models/delegating_patient.rb +0 -16
- data/spec/integration/document_spec.rb +0 -22
- data/spec/mongoid/clients/sessions_spec.rb +0 -334
- 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/matchable/nor_spec.rb +0 -209
- 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/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/constraints.rb +0 -101
- data/spec/support/macros.rb +0 -20
- data/spec/support/session_registry.rb +0 -50
- data/spec/support/spec_config.rb +0 -42
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Association
|
|
4
4
|
|
|
5
5
|
# Superclass for all objects that bind relations together.
|
|
6
|
-
|
|
6
|
+
module Bindable
|
|
7
7
|
include Threaded::Lifecycle
|
|
8
8
|
|
|
9
|
-
attr_reader :
|
|
9
|
+
attr_reader :_base, :_target, :_association
|
|
10
10
|
|
|
11
11
|
# Create the new binding.
|
|
12
12
|
#
|
|
13
13
|
# @example Initialize a binding.
|
|
14
|
-
# Binding.new(base, target,
|
|
14
|
+
# Binding.new(base, target, association)
|
|
15
15
|
#
|
|
16
16
|
# @param [ Document ] base The base of the binding.
|
|
17
17
|
# @param [ Document, Array<Document> ] target The target of the binding.
|
|
18
|
-
# @param [
|
|
18
|
+
# @param [ Association ] association The association metadata.
|
|
19
19
|
#
|
|
20
20
|
# @since 2.0.0.rc.1
|
|
21
|
-
def initialize(base, target,
|
|
22
|
-
@
|
|
21
|
+
def initialize(base, target, association)
|
|
22
|
+
@_base, @_target, @_association = base, target, association
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# Execute the provided block inside a binding.
|
|
@@ -55,32 +55,12 @@ module Mongoid
|
|
|
55
55
|
#
|
|
56
56
|
# @since 3.0.0
|
|
57
57
|
def check_inverse!(doc)
|
|
58
|
-
|
|
59
|
-
!doc.respond_to?(metadata.foreign_key_setter)
|
|
58
|
+
unless _association.bindable?(doc)
|
|
60
59
|
raise Errors::InverseNotFound.new(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Check for problems with multiple inverse definitions.
|
|
70
|
-
#
|
|
71
|
-
# @api private
|
|
72
|
-
#
|
|
73
|
-
# @example Check for inverses errors.
|
|
74
|
-
# binding.check_inverses!(doc)
|
|
75
|
-
#
|
|
76
|
-
# @param [ Document ] doc The document to check.
|
|
77
|
-
#
|
|
78
|
-
# @since 3.0.0
|
|
79
|
-
def check_inverses!(doc)
|
|
80
|
-
inverses = metadata.inverses(doc)
|
|
81
|
-
if inverses.count > 1 && base.send(metadata.foreign_key).nil?
|
|
82
|
-
raise Errors::InvalidSetPolymorphicRelation.new(
|
|
83
|
-
metadata.name, base.class.name, target.class.name
|
|
60
|
+
_base.class,
|
|
61
|
+
_association.name,
|
|
62
|
+
doc.class,
|
|
63
|
+
_association.foreign_key
|
|
84
64
|
)
|
|
85
65
|
end
|
|
86
66
|
end
|
|
@@ -99,7 +79,7 @@ module Mongoid
|
|
|
99
79
|
# @since 3.0.0
|
|
100
80
|
def bind_foreign_key(keyed, id)
|
|
101
81
|
unless keyed.frozen?
|
|
102
|
-
keyed.you_must(
|
|
82
|
+
keyed.you_must(_association.foreign_key_setter, id)
|
|
103
83
|
end
|
|
104
84
|
end
|
|
105
85
|
|
|
@@ -116,8 +96,8 @@ module Mongoid
|
|
|
116
96
|
#
|
|
117
97
|
# @since 3.0.0
|
|
118
98
|
def bind_polymorphic_type(typed, name)
|
|
119
|
-
if
|
|
120
|
-
typed.you_must(
|
|
99
|
+
if _association.type
|
|
100
|
+
typed.you_must(_association.type_setter, name)
|
|
121
101
|
end
|
|
122
102
|
end
|
|
123
103
|
|
|
@@ -134,8 +114,8 @@ module Mongoid
|
|
|
134
114
|
#
|
|
135
115
|
# @since 3.0.0
|
|
136
116
|
def bind_polymorphic_inverse_type(typed, name)
|
|
137
|
-
if
|
|
138
|
-
typed.you_must(
|
|
117
|
+
if _association.inverse_type
|
|
118
|
+
typed.you_must(_association.inverse_type_setter, name)
|
|
139
119
|
end
|
|
140
120
|
end
|
|
141
121
|
|
|
@@ -152,8 +132,8 @@ module Mongoid
|
|
|
152
132
|
#
|
|
153
133
|
# @since 3.0.0
|
|
154
134
|
def bind_inverse(doc, inverse)
|
|
155
|
-
if doc.respond_to?(
|
|
156
|
-
doc.you_must(
|
|
135
|
+
if doc.respond_to?(_association.inverse_setter)
|
|
136
|
+
doc.you_must(_association.inverse_setter, inverse)
|
|
157
137
|
end
|
|
158
138
|
end
|
|
159
139
|
|
|
@@ -169,31 +149,31 @@ module Mongoid
|
|
|
169
149
|
# @since 3.0.0
|
|
170
150
|
def bind_from_relational_parent(doc)
|
|
171
151
|
check_inverse!(doc)
|
|
172
|
-
bind_foreign_key(doc, record_id(
|
|
173
|
-
bind_polymorphic_type(doc,
|
|
174
|
-
bind_inverse(doc,
|
|
152
|
+
bind_foreign_key(doc, record_id(_base))
|
|
153
|
+
bind_polymorphic_type(doc, _base.class.name)
|
|
154
|
+
bind_inverse(doc, _base)
|
|
175
155
|
end
|
|
176
156
|
|
|
177
|
-
def record_id(
|
|
178
|
-
|
|
157
|
+
def record_id(_base)
|
|
158
|
+
_base.__send__(_association.primary_key)
|
|
179
159
|
end
|
|
180
160
|
|
|
181
|
-
# Ensure that the
|
|
161
|
+
# Ensure that the association on the base is correct, for the cases
|
|
182
162
|
# where we have multiple belongs to definitions and were are setting
|
|
183
163
|
# different parents in memory in order.
|
|
184
164
|
#
|
|
185
165
|
# @api private
|
|
186
166
|
#
|
|
187
|
-
# @example Set the base
|
|
188
|
-
# binding.
|
|
167
|
+
# @example Set the base association.
|
|
168
|
+
# binding.set_base_association
|
|
189
169
|
#
|
|
190
|
-
# @return [ true, false ] If the
|
|
170
|
+
# @return [ true, false ] If the association changed.
|
|
191
171
|
#
|
|
192
172
|
# @since 2.4.4
|
|
193
|
-
def
|
|
194
|
-
|
|
195
|
-
if
|
|
196
|
-
|
|
173
|
+
def set_base_association
|
|
174
|
+
inverse_association = _association.inverse_association(_target)
|
|
175
|
+
if inverse_association != _association && !inverse_association.nil?
|
|
176
|
+
_base._association = inverse_association
|
|
197
177
|
end
|
|
198
178
|
end
|
|
199
179
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Association
|
|
5
|
+
|
|
6
|
+
# This module is responsible for defining the build and create methods used
|
|
7
|
+
# in one to one relations.
|
|
8
|
+
#
|
|
9
|
+
# @example Methods that get created.
|
|
10
|
+
#
|
|
11
|
+
# class Person
|
|
12
|
+
# include Mongoid::Document
|
|
13
|
+
# embeds_one :name
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# # The following methods get created:
|
|
17
|
+
# person.build_name({ :first_name => "Durran" })
|
|
18
|
+
# person.create_name({ :first_name => "Durran" })
|
|
19
|
+
#
|
|
20
|
+
# @since 2.0.0.rc.1
|
|
21
|
+
module Builders
|
|
22
|
+
extend ActiveSupport::Concern
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
# Parse out the attributes and the options from the args passed to a
|
|
27
|
+
# build_ or create_ methods.
|
|
28
|
+
#
|
|
29
|
+
# @example Parse the args.
|
|
30
|
+
# doc.parse_args(:name => "Joe")
|
|
31
|
+
#
|
|
32
|
+
# @param [ Array ] args The arguments.
|
|
33
|
+
#
|
|
34
|
+
# @return [ Array<Hash> ] The attributes and options.
|
|
35
|
+
#
|
|
36
|
+
# @since 2.3.4
|
|
37
|
+
def parse_args(*args)
|
|
38
|
+
[ args.first || {}, args.size > 1 ? args[1] : {} ]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Defines a builder method. This is defined as #build_name.
|
|
42
|
+
#
|
|
43
|
+
# @example
|
|
44
|
+
# Person.define_builder!(association)
|
|
45
|
+
#
|
|
46
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
47
|
+
#
|
|
48
|
+
# @return [ Class ] The class being set up.
|
|
49
|
+
#
|
|
50
|
+
# @since 2.0.0.rc.1
|
|
51
|
+
def self.define_builder!(association)
|
|
52
|
+
association.inverse_class.tap do |klass|
|
|
53
|
+
klass.re_define_method("build_#{association.name}") do |*args|
|
|
54
|
+
attributes, _options = parse_args(*args)
|
|
55
|
+
document = Factory.build(association.relation_class, attributes)
|
|
56
|
+
_building do
|
|
57
|
+
child = send("#{association.name}=", document)
|
|
58
|
+
child.run_callbacks(:build)
|
|
59
|
+
child
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Defines a creator method. This is defined as #create_name.
|
|
66
|
+
# After the object is built it will immediately save.
|
|
67
|
+
#
|
|
68
|
+
# @example
|
|
69
|
+
# Person.define_creator!(association)
|
|
70
|
+
#
|
|
71
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
72
|
+
#
|
|
73
|
+
# @return [ Class ] The class being set up.
|
|
74
|
+
#
|
|
75
|
+
# @since 2.0.0.rc.1
|
|
76
|
+
def self.define_creator!(association)
|
|
77
|
+
association.inverse_class.tap do |klass|
|
|
78
|
+
klass.re_define_method("create_#{association.name}") do |*args|
|
|
79
|
+
attributes, _options = parse_args(*args)
|
|
80
|
+
document = Factory.build(association.relation_class, attributes)
|
|
81
|
+
doc = _assigning do
|
|
82
|
+
send("#{association.name}=", document)
|
|
83
|
+
end
|
|
84
|
+
doc.save
|
|
85
|
+
save if new_record? && association.stores_foreign_key?
|
|
86
|
+
doc
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Association
|
|
4
4
|
|
|
5
5
|
# Used for converting foreign key values to the correct type based on the
|
|
6
6
|
# types of ids that the document stores.
|
|
7
7
|
#
|
|
8
|
-
|
|
9
|
-
# getter, and foreign_key was already taken there.
|
|
10
|
-
class Constraint
|
|
11
|
-
attr_reader :metadata
|
|
12
|
-
|
|
13
|
-
# Create the new constraint with the metadata.
|
|
14
|
-
#
|
|
15
|
-
# @example Instantiate the constraint.
|
|
16
|
-
# Constraint.new(metdata)
|
|
17
|
-
#
|
|
18
|
-
# @param [ Metadata ] metadata The metadata of the relation.
|
|
19
|
-
#
|
|
20
|
-
# @since 2.0.0.rc.7
|
|
21
|
-
def initialize(metadata)
|
|
22
|
-
@metadata = metadata
|
|
23
|
-
end
|
|
8
|
+
module Constrainable
|
|
24
9
|
|
|
25
10
|
# Convert the supplied object to the appropriate type to set as the
|
|
26
11
|
# foreign key for a relation.
|
|
@@ -33,10 +18,10 @@ module Mongoid
|
|
|
33
18
|
# @return [ Object ] The object cast to the correct type.
|
|
34
19
|
#
|
|
35
20
|
# @since 2.0.0.rc.7
|
|
36
|
-
def
|
|
37
|
-
return convert_polymorphic(object) if
|
|
38
|
-
|
|
39
|
-
if
|
|
21
|
+
def convert_to_foreign_key(object)
|
|
22
|
+
return convert_polymorphic(object) if polymorphic?
|
|
23
|
+
field = relation_class.fields["_id"]
|
|
24
|
+
if relation_class.using_object_ids?
|
|
40
25
|
BSON::ObjectId.mongoize(object)
|
|
41
26
|
elsif object.is_a?(::Array)
|
|
42
27
|
object.map!{ |obj| field.mongoize(obj) }
|
|
@@ -48,7 +33,11 @@ module Mongoid
|
|
|
48
33
|
private
|
|
49
34
|
|
|
50
35
|
def convert_polymorphic(object)
|
|
51
|
-
object.
|
|
36
|
+
if object.is_a?(Mongoid::Document)
|
|
37
|
+
object.id
|
|
38
|
+
else
|
|
39
|
+
BSON::ObjectId.mongoize(object)
|
|
40
|
+
end
|
|
52
41
|
end
|
|
53
42
|
end
|
|
54
43
|
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
|
|
4
|
+
# This module defines the behaviour for setting up cascading deletes and
|
|
5
|
+
# nullifies for relations, and how to delegate to the appropriate strategy.
|
|
6
|
+
module Depending
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
class_attribute :dependents
|
|
11
|
+
self.dependents = []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# The valid dependent strategies.
|
|
15
|
+
#
|
|
16
|
+
# @since 7.0
|
|
17
|
+
STRATEGIES = [
|
|
18
|
+
:delete_all,
|
|
19
|
+
:destroy,
|
|
20
|
+
:nullify,
|
|
21
|
+
:restrict_with_exception,
|
|
22
|
+
:restrict_with_error
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
# The error message when a strategy cannot delete objects because there are associated objects.
|
|
26
|
+
#
|
|
27
|
+
# @since 7.0
|
|
28
|
+
RESTRICT_ERROR_MSG = 'Cannot delete record because associated objects exist.'.freeze
|
|
29
|
+
|
|
30
|
+
# Attempt to add the cascading information for the document to know how
|
|
31
|
+
# to handle associated documents on a removal.
|
|
32
|
+
#
|
|
33
|
+
# @example Set up cascading information
|
|
34
|
+
# Mongoid::Association::Depending.define_dependency!(association)
|
|
35
|
+
#
|
|
36
|
+
# @param [ Association ] association The association metadata.
|
|
37
|
+
#
|
|
38
|
+
# @return [ Class ] The class of the document.
|
|
39
|
+
#
|
|
40
|
+
# @since 2.0.0.rc.1
|
|
41
|
+
def self.define_dependency!(association)
|
|
42
|
+
validate!(association)
|
|
43
|
+
association.inverse_class.tap do |klass|
|
|
44
|
+
if association.dependent && !klass.dependents.include?(association)
|
|
45
|
+
klass.dependents.push(association)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def self.validate!(association)
|
|
51
|
+
unless STRATEGIES.include?(association.dependent)
|
|
52
|
+
raise Errors::InvalidDependentStrategy.new(association,
|
|
53
|
+
association.dependent,
|
|
54
|
+
STRATEGIES)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Perform all cascading deletes, destroys, or nullifies. Will delegate to
|
|
59
|
+
# the appropriate strategy to perform the operation.
|
|
60
|
+
#
|
|
61
|
+
# @example Execute cascades.
|
|
62
|
+
# document.apply_delete_dependencies!
|
|
63
|
+
#
|
|
64
|
+
# @since 2.0.0.rc.1
|
|
65
|
+
def apply_delete_dependencies!
|
|
66
|
+
dependents.each do |association|
|
|
67
|
+
if association.try(:dependent)
|
|
68
|
+
send("_dependent_#{association.dependent}!", association)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
def _dependent_delete_all!(association)
|
|
76
|
+
if relation = send(association.name)
|
|
77
|
+
if relation.respond_to?(:dependents) && relation.dependents.blank?
|
|
78
|
+
relation.clear
|
|
79
|
+
else
|
|
80
|
+
::Array.wrap(send(association.name)).each { |rel| rel.delete }
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def _dependent_destroy!(association)
|
|
86
|
+
if relation = send(association.name)
|
|
87
|
+
if relation.is_a?(Enumerable)
|
|
88
|
+
relation.entries
|
|
89
|
+
relation.each { |doc| doc.destroy }
|
|
90
|
+
else
|
|
91
|
+
relation.destroy
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def _dependent_nullify!(association)
|
|
97
|
+
if relation = send(association.name)
|
|
98
|
+
relation.nullify
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def _dependent_restrict_with_exception!(association)
|
|
103
|
+
if (relation = send(association.name)) && !relation.blank?
|
|
104
|
+
raise Errors::DeleteRestriction.new(relation, association.name)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def _dependent_restrict_with_error!(association)
|
|
109
|
+
if (relation = send(association.name)) && !relation.blank?
|
|
110
|
+
errors.add(association.name, RESTRICT_ERROR_MSG)
|
|
111
|
+
throw(:abort, false)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "mongoid/
|
|
3
|
-
require "mongoid/relations/eager/belongs_to"
|
|
4
|
-
require "mongoid/relations/eager/has_one"
|
|
5
|
-
require "mongoid/relations/eager/has_many"
|
|
6
|
-
require "mongoid/relations/eager/has_and_belongs_to_many"
|
|
2
|
+
require "mongoid/association/referenced/eager"
|
|
7
3
|
|
|
8
4
|
module Mongoid
|
|
9
|
-
module
|
|
10
|
-
|
|
5
|
+
module Association
|
|
6
|
+
|
|
7
|
+
# This module defines the eager loading behavior for criteria.
|
|
8
|
+
#
|
|
9
|
+
# @since 7.0
|
|
10
|
+
module EagerLoadable
|
|
11
11
|
|
|
12
12
|
def eager_loadable?
|
|
13
13
|
!criteria.inclusions.empty?
|
|
@@ -23,11 +23,11 @@ module Mongoid
|
|
|
23
23
|
|
|
24
24
|
def preload(relations, docs)
|
|
25
25
|
relations.group_by(&:inverse_class_name)
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
.values
|
|
27
|
+
.each do |associations|
|
|
28
28
|
associations.group_by(&:relation)
|
|
29
|
-
|
|
30
|
-
relation.
|
|
29
|
+
.each do |relation, association|
|
|
30
|
+
relation.eager_loader(association, docs).run
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|