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,7 @@
|
|
|
1
|
+
require 'mongoid/association/referenced/auto_save'
|
|
2
|
+
require 'mongoid/association/referenced/counter_cache'
|
|
3
|
+
require 'mongoid/association/referenced/syncable'
|
|
4
|
+
require 'mongoid/association/referenced/belongs_to'
|
|
5
|
+
require 'mongoid/association/referenced/has_many'
|
|
6
|
+
require 'mongoid/association/referenced/has_and_belongs_to_many'
|
|
7
|
+
require 'mongoid/association/referenced/has_one'
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
module Referenced
|
|
4
|
+
|
|
5
|
+
module AutoSave
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
# Used to prevent infinite loops in associated autosaves.
|
|
9
|
+
#
|
|
10
|
+
# @example Is the document autosaved?
|
|
11
|
+
# document.autosaved?
|
|
12
|
+
#
|
|
13
|
+
# @return [ true, false ] Has the document already been autosaved?
|
|
14
|
+
#
|
|
15
|
+
# @since 3.0.0
|
|
16
|
+
def autosaved?
|
|
17
|
+
Threaded.autosaved?(self)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Begin the associated autosave.
|
|
21
|
+
#
|
|
22
|
+
# @example Begin autosave.
|
|
23
|
+
# document.__autosaving__
|
|
24
|
+
#
|
|
25
|
+
# @since 3.1.3
|
|
26
|
+
def __autosaving__
|
|
27
|
+
Threaded.begin_autosave(self)
|
|
28
|
+
yield
|
|
29
|
+
ensure
|
|
30
|
+
Threaded.exit_autosave(self)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Check if there is changes for auto-saving
|
|
34
|
+
#
|
|
35
|
+
# @example Return true if there is changes on self or in
|
|
36
|
+
# autosaved relations.
|
|
37
|
+
# document.changed_for_autosave?
|
|
38
|
+
#
|
|
39
|
+
# @since 3.1.3
|
|
40
|
+
def changed_for_autosave?(doc)
|
|
41
|
+
doc.new_record? || doc.changed? || doc.marked_for_destruction?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Define the autosave method on an association's owning class for
|
|
45
|
+
# an associated object.
|
|
46
|
+
#
|
|
47
|
+
# @example Define the autosave method:
|
|
48
|
+
# Association::Referenced::Autosave.define_autosave!(association)
|
|
49
|
+
#
|
|
50
|
+
# @param [ Association ] association The association for which autosaving is enabled.
|
|
51
|
+
#
|
|
52
|
+
# @return [ Class ] The association's owner class.
|
|
53
|
+
#
|
|
54
|
+
# @since 7.0
|
|
55
|
+
def self.define_autosave!(association)
|
|
56
|
+
association.inverse_class.tap do |klass|
|
|
57
|
+
save_method = :"autosave_documents_for_#{association.name}"
|
|
58
|
+
klass.send(:define_method, save_method) do
|
|
59
|
+
if before_callback_halted?
|
|
60
|
+
self.before_callback_halted = false
|
|
61
|
+
else
|
|
62
|
+
__autosaving__ do
|
|
63
|
+
if relation = ivar(association.name)
|
|
64
|
+
Array(relation).each do |doc|
|
|
65
|
+
doc.with(persistence_context) do |d|
|
|
66
|
+
d.save
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
klass.after_save save_method, unless: :autosaved?
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -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
|
|
@@ -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
|