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
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
require 'mongoid/association/referenced/has_and_belongs_to_many/binding'
|
|
2
|
+
require 'mongoid/association/referenced/has_and_belongs_to_many/buildable'
|
|
3
|
+
require 'mongoid/association/referenced/has_and_belongs_to_many/proxy'
|
|
4
|
+
require 'mongoid/association/referenced/has_and_belongs_to_many/eager'
|
|
5
|
+
|
|
6
|
+
module Mongoid
|
|
7
|
+
module Association
|
|
8
|
+
module Referenced
|
|
9
|
+
|
|
10
|
+
# The HasAndBelongsToMany type association.
|
|
11
|
+
#
|
|
12
|
+
# @since 7.0
|
|
13
|
+
class HasAndBelongsToMany
|
|
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
|
+
:after_add,
|
|
25
|
+
:after_remove,
|
|
26
|
+
:autosave,
|
|
27
|
+
:before_add,
|
|
28
|
+
:before_remove,
|
|
29
|
+
:counter_cache,
|
|
30
|
+
:dependent,
|
|
31
|
+
:foreign_key,
|
|
32
|
+
:index,
|
|
33
|
+
:order,
|
|
34
|
+
:primary_key
|
|
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 [ Array ]
|
|
48
|
+
#
|
|
49
|
+
# @since 7.0
|
|
50
|
+
FOREIGN_KEY_FIELD_TYPE = Array
|
|
51
|
+
|
|
52
|
+
# The default foreign key suffix.
|
|
53
|
+
#
|
|
54
|
+
# @return [ String ] '_ids'
|
|
55
|
+
#
|
|
56
|
+
# @since 7.0
|
|
57
|
+
FOREIGN_KEY_SUFFIX = '_ids'.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 ||= [ self.class ].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
|
+
self
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Is this association type embedded?
|
|
79
|
+
#
|
|
80
|
+
# @return [ false ] Always false.
|
|
81
|
+
#
|
|
82
|
+
# @since 7.0
|
|
83
|
+
def embedded?; false; end
|
|
84
|
+
|
|
85
|
+
# The default for validation the association object.
|
|
86
|
+
#
|
|
87
|
+
# @return [ false ] Always false.
|
|
88
|
+
#
|
|
89
|
+
# @since 7.0
|
|
90
|
+
def validation_default; true; end
|
|
91
|
+
|
|
92
|
+
# Are ids only saved on this side of the relation?
|
|
93
|
+
#
|
|
94
|
+
# @return [ true, false ] Whether this association has a forced nil inverse.
|
|
95
|
+
#
|
|
96
|
+
# @since 7.0
|
|
97
|
+
def forced_nil_inverse?
|
|
98
|
+
@forced_nil_inverse ||= @options.key?(:inverse_of) && !@options[:inverse_of]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Does this association type store the foreign key?
|
|
102
|
+
#
|
|
103
|
+
# @return [ true ] Always true.
|
|
104
|
+
#
|
|
105
|
+
# @since 7.0
|
|
106
|
+
def stores_foreign_key?; true; end
|
|
107
|
+
|
|
108
|
+
# Get the relation proxy class for this association type.
|
|
109
|
+
#
|
|
110
|
+
# @return [ Association::HasAndBelongsToMany::Proxy ] The proxy class.
|
|
111
|
+
#
|
|
112
|
+
# @since 7.0
|
|
113
|
+
def relation
|
|
114
|
+
Proxy
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Get the foreign key field for saving the association reference.
|
|
118
|
+
#
|
|
119
|
+
# @return [ String ] The foreign key field for saving the association reference.
|
|
120
|
+
#
|
|
121
|
+
# @since 7.0
|
|
122
|
+
def foreign_key
|
|
123
|
+
@foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
|
|
124
|
+
default_foreign_key_field
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# The criteria used for querying this relation.
|
|
128
|
+
#
|
|
129
|
+
# @return [ Mongoid::Criteria ] The criteria used for querying this relation.
|
|
130
|
+
#
|
|
131
|
+
# @since 7.0
|
|
132
|
+
def criteria(base, id_list = nil)
|
|
133
|
+
query_criteria(id_list || base.send(foreign_key))
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Get the foreign key field on the inverse.
|
|
137
|
+
#
|
|
138
|
+
# @return [ String ] The foreign key field for saving the association reference
|
|
139
|
+
# on the inverse side.
|
|
140
|
+
#
|
|
141
|
+
# @since 7.0
|
|
142
|
+
def inverse_foreign_key
|
|
143
|
+
if @options.key?(:inverse_of)
|
|
144
|
+
inverse_of ? "#{inverse_of.to_s.singularize}#{FOREIGN_KEY_SUFFIX}" : nil
|
|
145
|
+
else
|
|
146
|
+
"#{inverse_class_name.demodulize.underscore}#{FOREIGN_KEY_SUFFIX}"
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Whether trying to bind an object using this association should raise
|
|
151
|
+
# an error.
|
|
152
|
+
#
|
|
153
|
+
# @param [ Document ] doc The document to be bound.
|
|
154
|
+
#
|
|
155
|
+
# @return [ true, false ] Whether the document can be bound.
|
|
156
|
+
def bindable?(doc)
|
|
157
|
+
forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Get the foreign key setter on the inverse.
|
|
161
|
+
#
|
|
162
|
+
# @return [ String ] The foreign key setter for saving the association reference
|
|
163
|
+
# on the inverse side.
|
|
164
|
+
#
|
|
165
|
+
# @since 7.0
|
|
166
|
+
def inverse_foreign_key_setter
|
|
167
|
+
@inverse_foreign_key_setter ||= "#{inverse_foreign_key}=" if inverse_foreign_key
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# The nested builder object.
|
|
171
|
+
#
|
|
172
|
+
# @param [ Hash ] attributes The attributes to use to build the association object.
|
|
173
|
+
# @param [ Hash ] options The options for the association.
|
|
174
|
+
#
|
|
175
|
+
# @return [ Association::Nested::One ] The Nested Builder object.
|
|
176
|
+
#
|
|
177
|
+
# @since 7.0
|
|
178
|
+
def nested_builder(attributes, options)
|
|
179
|
+
Nested::Many.new(self, attributes, options)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Get the path calculator for the supplied document.
|
|
183
|
+
#
|
|
184
|
+
# @example Get the path calculator.
|
|
185
|
+
# association.path(document)
|
|
186
|
+
#
|
|
187
|
+
# @param [ Document ] document The document to calculate on.
|
|
188
|
+
#
|
|
189
|
+
# @return [ Root ] The root atomic path calculator.
|
|
190
|
+
#
|
|
191
|
+
# @since 2.1.0
|
|
192
|
+
def path(document)
|
|
193
|
+
Mongoid::Atomic::Paths::Root.new(document)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
private
|
|
197
|
+
|
|
198
|
+
def setup_instance_methods!
|
|
199
|
+
define_getter!
|
|
200
|
+
define_setter!
|
|
201
|
+
define_dependency!
|
|
202
|
+
define_existence_check!
|
|
203
|
+
define_autosaver!
|
|
204
|
+
define_counter_cache_callbacks!
|
|
205
|
+
create_foreign_key_field!
|
|
206
|
+
setup_index!
|
|
207
|
+
setup_syncing!
|
|
208
|
+
@owner_class.validates_associated(name) if validate?
|
|
209
|
+
self
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def index_spec
|
|
213
|
+
{ key => 1 }
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def default_primary_key
|
|
217
|
+
PRIMARY_KEY_DEFAULT
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def default_foreign_key_field
|
|
221
|
+
@default_foreign_key_field ||= "#{name.to_s.singularize}#{FOREIGN_KEY_SUFFIX}"
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def setup_syncing!
|
|
225
|
+
unless forced_nil_inverse?
|
|
226
|
+
synced_save
|
|
227
|
+
synced_destroy
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def synced_destroy
|
|
232
|
+
assoc = self
|
|
233
|
+
inverse_class.set_callback(
|
|
234
|
+
:destroy,
|
|
235
|
+
:after
|
|
236
|
+
) do |doc|
|
|
237
|
+
doc.remove_inverse_keys(assoc)
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def synced_save
|
|
242
|
+
assoc = self
|
|
243
|
+
inverse_class.set_callback(
|
|
244
|
+
:save,
|
|
245
|
+
:after,
|
|
246
|
+
if: ->(doc){ doc._syncable?(assoc) }
|
|
247
|
+
) do |doc|
|
|
248
|
+
doc.update_inverse_keys(assoc)
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def create_foreign_key_field!
|
|
253
|
+
@owner_class.field(
|
|
254
|
+
foreign_key,
|
|
255
|
+
type: FOREIGN_KEY_FIELD_TYPE,
|
|
256
|
+
identity: true,
|
|
257
|
+
overwrite: true,
|
|
258
|
+
association: self,
|
|
259
|
+
default: nil
|
|
260
|
+
)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def determine_inverses(other)
|
|
264
|
+
matches = (other || relation_class).relations.values.select do |rel|
|
|
265
|
+
relation_complements.include?(rel.class) &&
|
|
266
|
+
rel.relation_class_name == inverse_class_name
|
|
267
|
+
|
|
268
|
+
end
|
|
269
|
+
if matches.size > 1
|
|
270
|
+
raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
|
|
271
|
+
end
|
|
272
|
+
matches.collect { |m| m.name } unless matches.blank?
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def with_ordering(criteria)
|
|
276
|
+
if order
|
|
277
|
+
criteria.order_by(order)
|
|
278
|
+
else
|
|
279
|
+
criteria
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def query_criteria(id_list)
|
|
284
|
+
crit = relation_class.all_of(primary_key => {"$in" => id_list || []})
|
|
285
|
+
with_ordering(crit)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class HasAndBelongsToMany
|
|
6
|
+
|
|
7
|
+
# Binding class for all has_and_belongs_to_many relations.
|
|
8
|
+
class Binding
|
|
9
|
+
include Bindable
|
|
10
|
+
|
|
11
|
+
# Binds a single document with the inverse relation. Used
|
|
12
|
+
# specifically when appending to the proxy.
|
|
13
|
+
#
|
|
14
|
+
# @example Bind one document.
|
|
15
|
+
# person.preferences.bind_one(preference)
|
|
16
|
+
#
|
|
17
|
+
# @param [ Document ] doc The single document to bind.
|
|
18
|
+
#
|
|
19
|
+
# @since 2.0.0.rc.1
|
|
20
|
+
def bind_one(doc)
|
|
21
|
+
binding do
|
|
22
|
+
inverse_keys = doc.you_must(_association.inverse_foreign_key)
|
|
23
|
+
if inverse_keys
|
|
24
|
+
record_id = inverse_record_id(doc)
|
|
25
|
+
unless inverse_keys.include?(record_id)
|
|
26
|
+
doc.you_must(_association.inverse_foreign_key_setter, inverse_keys.push(record_id))
|
|
27
|
+
end
|
|
28
|
+
doc.reset_relation_criteria(_association.inverse)
|
|
29
|
+
end
|
|
30
|
+
_base._synced[_association.foreign_key] = true
|
|
31
|
+
doc._synced[_association.inverse_foreign_key] = true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Unbind a single document.
|
|
36
|
+
#
|
|
37
|
+
# @example Unbind the document.
|
|
38
|
+
# person.preferences.unbind_one(document)
|
|
39
|
+
#
|
|
40
|
+
# @since 2.0.0.rc.1
|
|
41
|
+
def unbind_one(doc)
|
|
42
|
+
binding do
|
|
43
|
+
_base.send(_association.foreign_key).delete_one(record_id(doc))
|
|
44
|
+
inverse_keys = doc.you_must(_association.inverse_foreign_key)
|
|
45
|
+
if inverse_keys
|
|
46
|
+
inverse_keys.delete_one(inverse_record_id(doc))
|
|
47
|
+
doc.reset_relation_criteria(_association.inverse)
|
|
48
|
+
end
|
|
49
|
+
_base._synced[_association.foreign_key] = true
|
|
50
|
+
doc._synced[_association.inverse_foreign_key] = true
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Find the inverse id referenced by inverse_keys
|
|
55
|
+
def inverse_record_id(doc)
|
|
56
|
+
inverse_association = determine_inverse_association(doc)
|
|
57
|
+
if inverse_association
|
|
58
|
+
_base.__send__(inverse_association.primary_key)
|
|
59
|
+
else
|
|
60
|
+
_base._id
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def determine_inverse_association(doc)
|
|
65
|
+
doc.relations[_base.class.name.demodulize.underscore.pluralize]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class HasAndBelongsToMany
|
|
6
|
+
|
|
7
|
+
# The Builder behavior for has_and_belongs_to_many associations.
|
|
8
|
+
#
|
|
9
|
+
# @since 7.0
|
|
10
|
+
module Buildable
|
|
11
|
+
|
|
12
|
+
# This builder either takes a hash and queries for the
|
|
13
|
+
# object or an array of documents, where it will just return them.
|
|
14
|
+
#
|
|
15
|
+
# @example Build the documents.
|
|
16
|
+
# relation.build(association, 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 Not used in this context.
|
|
21
|
+
#
|
|
22
|
+
# @return [ Array<Document> ] The documents.
|
|
23
|
+
def build(base, object, type = nil)
|
|
24
|
+
if query?(object)
|
|
25
|
+
query_criteria(object)
|
|
26
|
+
else
|
|
27
|
+
object.try(:dup)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def query?(object)
|
|
34
|
+
object.nil? || Array(object).all? { |d| !d.is_a?(Mongoid::Document) }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class HasAndBelongsToMany
|
|
6
|
+
|
|
7
|
+
# Eager class for has_and_belongs_to_many associations.
|
|
8
|
+
class Eager < Association::Referenced::Eager::Base
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def preload
|
|
13
|
+
@docs.each do |d|
|
|
14
|
+
set_relation(d, [])
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
entries = {}
|
|
18
|
+
each_loaded_document do |doc|
|
|
19
|
+
entries[doc.send(key)] = doc
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
@docs.each do |d|
|
|
23
|
+
keys = d.send(group_by_key)
|
|
24
|
+
docs = entries.values_at(*keys).compact
|
|
25
|
+
set_relation(d, docs)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def keys_from_docs
|
|
30
|
+
keys = Set.new
|
|
31
|
+
@docs.each do |d|
|
|
32
|
+
keys += d.send(group_by_key)
|
|
33
|
+
end
|
|
34
|
+
keys.to_a
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def set_relation(doc, element)
|
|
38
|
+
doc.__build__(@association.name, element, @association) unless doc.blank?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def group_by_key
|
|
42
|
+
@association.foreign_key
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def key
|
|
46
|
+
@association.primary_key
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|