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
metadata.gz.sig
CHANGED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
module Mongoid
|
|
2
|
-
module Clients
|
|
3
|
-
|
|
4
|
-
# Encapsulates behavior for getting a session from the client of a model class or instance,
|
|
5
|
-
# setting the session on the current thread, and yielding to a block.
|
|
6
|
-
# The session will be closed after the block completes or raises an error.
|
|
7
|
-
#
|
|
8
|
-
# @since 6.4.0
|
|
9
|
-
module Sessions
|
|
10
|
-
|
|
11
|
-
# Execute a block within the context of a session.
|
|
12
|
-
#
|
|
13
|
-
# @example Execute some operations in the context of a session.
|
|
14
|
-
# band.with_session(causal_consistency: true) do
|
|
15
|
-
# band.records << Record.create
|
|
16
|
-
# band.name = 'FKA Twigs'
|
|
17
|
-
# band.save
|
|
18
|
-
# band.reload
|
|
19
|
-
# end
|
|
20
|
-
#
|
|
21
|
-
# @param [ Hash ] options The session options. Please see the driver
|
|
22
|
-
# documentation for the available session options.
|
|
23
|
-
#
|
|
24
|
-
# @note You cannot do any operations in the block using models or objects
|
|
25
|
-
# that use a different client; the block will execute all operations
|
|
26
|
-
# in the context of the implicit session and operations on any models using
|
|
27
|
-
# another client will fail. For example, if you set a client using store_in on a
|
|
28
|
-
# particular model and execute an operation on it in the session context block,
|
|
29
|
-
# that operation can't use the block's session and an error will be raised.
|
|
30
|
-
# An error will also be raised if sessions are nested.
|
|
31
|
-
#
|
|
32
|
-
# @raise [ Errors::InvalidSessionUse ] If an operation is attempted on a model using another
|
|
33
|
-
# client from which the session was started or if sessions are nested.
|
|
34
|
-
#
|
|
35
|
-
# @return [ Object ] The result of calling the block.
|
|
36
|
-
#
|
|
37
|
-
# @yieldparam [ Mongo::Session ] The session being used for the block.
|
|
38
|
-
#
|
|
39
|
-
# @since 6.4.0
|
|
40
|
-
def with_session(options = {})
|
|
41
|
-
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
|
|
42
|
-
session = persistence_context.client.start_session(options)
|
|
43
|
-
Threaded.set_session(session)
|
|
44
|
-
yield(session)
|
|
45
|
-
rescue Mongo::Error::InvalidSession => ex
|
|
46
|
-
if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
|
|
47
|
-
raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
|
|
48
|
-
end
|
|
49
|
-
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
|
|
50
|
-
ensure
|
|
51
|
-
Threaded.clear_session
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
def _session
|
|
57
|
-
Threaded.get_session
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
module ClassMethods
|
|
61
|
-
|
|
62
|
-
# Execute a block within the context of a session.
|
|
63
|
-
#
|
|
64
|
-
# @example Execute some operations in the context of a session.
|
|
65
|
-
# Band.with_session(causal_consistency: true) do
|
|
66
|
-
# band = Band.create
|
|
67
|
-
# band.records << Record.new
|
|
68
|
-
# band.save
|
|
69
|
-
# band.reload.records
|
|
70
|
-
# end
|
|
71
|
-
#
|
|
72
|
-
# @param [ Hash ] options The session options. Please see the driver
|
|
73
|
-
# documentation for the available session options.
|
|
74
|
-
#
|
|
75
|
-
# @note You cannot do any operations in the block using models or objects
|
|
76
|
-
# that use a different client; the block will execute all operations
|
|
77
|
-
# in the context of the implicit session and operations on any models using
|
|
78
|
-
# another client will fail. For example, if you set a client using store_in on a
|
|
79
|
-
# particular model and execute an operation on it in the session context block,
|
|
80
|
-
# that operation can't use the block's session and an error will be raised.
|
|
81
|
-
# You also cannot nest sessions.
|
|
82
|
-
#
|
|
83
|
-
# @raise [ Errors::InvalidSessionUse ] If an operation is attempted on a model using another
|
|
84
|
-
# client from which the session was started or if sessions are nested.
|
|
85
|
-
#
|
|
86
|
-
# @return [ Object ] The result of calling the block.
|
|
87
|
-
#
|
|
88
|
-
# @yieldparam [ Mongo::Session ] The session being used for the block.
|
|
89
|
-
#
|
|
90
|
-
# @since 6.4.0
|
|
91
|
-
def with_session(options = {})
|
|
92
|
-
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
|
|
93
|
-
session = persistence_context.client.start_session(options)
|
|
94
|
-
Threaded.set_session(session)
|
|
95
|
-
yield(session)
|
|
96
|
-
rescue Mongo::Error::InvalidSession => ex
|
|
97
|
-
if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
|
|
98
|
-
raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
|
|
99
|
-
end
|
|
100
|
-
raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
|
|
101
|
-
ensure
|
|
102
|
-
Threaded.clear_session
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
private
|
|
106
|
-
|
|
107
|
-
def _session
|
|
108
|
-
Threaded.get_session
|
|
109
|
-
end
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Errors
|
|
4
|
-
|
|
5
|
-
# This error is raised when a session is attempted to be used with a model whose client cannot use it, if
|
|
6
|
-
# sessions are nested, or if the mongodb deployment doesn't support sessions.
|
|
7
|
-
#
|
|
8
|
-
# @since 6.4.0
|
|
9
|
-
class InvalidSessionUse < MongoidError
|
|
10
|
-
|
|
11
|
-
# Create the error.
|
|
12
|
-
#
|
|
13
|
-
# @example Create the error.
|
|
14
|
-
# InvalidSessionUse.new(:invalid_session_use)
|
|
15
|
-
#
|
|
16
|
-
# @param [ :invalid_sesion_use, :invalid_session_nesting ] error_type The type of session misuse.
|
|
17
|
-
#
|
|
18
|
-
# @since 6.4.0
|
|
19
|
-
def initialize(error_type)
|
|
20
|
-
super(compose_message(error_type.to_s))
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
|
-
module Mongoid
|
|
4
|
-
module Matchable
|
|
5
|
-
|
|
6
|
-
# Defines behavior for handling $nor expressions in embedded documents.
|
|
7
|
-
class Nor < Default
|
|
8
|
-
|
|
9
|
-
# Does the supplied query match the attribute?
|
|
10
|
-
#
|
|
11
|
-
# Note: an empty array as an argument to $nor is prohibited by
|
|
12
|
-
# MongoDB server. Mongoid does allow this and returns false in this case.
|
|
13
|
-
#
|
|
14
|
-
# @example Does this match?
|
|
15
|
-
# matcher._matches?("$nor" => [ { field => value } ])
|
|
16
|
-
#
|
|
17
|
-
# @param [ Array ] conditions The or expression.
|
|
18
|
-
#
|
|
19
|
-
# @return [ true, false ] True if matches, false if not.
|
|
20
|
-
#
|
|
21
|
-
# @since 6.4.2/7.0.2/7.1.0
|
|
22
|
-
def _matches?(conditions)
|
|
23
|
-
if conditions.length == 0
|
|
24
|
-
# MongoDB does not allow $nor array to be empty, but
|
|
25
|
-
# Mongoid accepts an empty array for $or which MongoDB also
|
|
26
|
-
# prohibits
|
|
27
|
-
return false
|
|
28
|
-
end
|
|
29
|
-
conditions.none? do |condition|
|
|
30
|
-
condition.all? do |key, value|
|
|
31
|
-
document._matches?(key => value)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
module Mongoid
|
|
2
|
-
module Railties
|
|
3
|
-
module ControllerRuntime
|
|
4
|
-
|
|
5
|
-
# This extension mimics the Rails' internal method to
|
|
6
|
-
# measure ActiveRecord runtime during request processing.
|
|
7
|
-
# It appends MongoDB runtime value (`mongoid_runtime`) into payload
|
|
8
|
-
# of instrumentation event `process_action.action_controller`.
|
|
9
|
-
module ControllerExtension
|
|
10
|
-
extend ActiveSupport::Concern
|
|
11
|
-
|
|
12
|
-
protected
|
|
13
|
-
|
|
14
|
-
attr_internal :mongoid_runtime
|
|
15
|
-
|
|
16
|
-
# Reset the runtime before each action.
|
|
17
|
-
def process_action(action, *args)
|
|
18
|
-
Collector.reset_runtime
|
|
19
|
-
super
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Override to collect the measurements.
|
|
23
|
-
def cleanup_view_runtime
|
|
24
|
-
mongo_rt_before_render = Collector.reset_runtime
|
|
25
|
-
runtime = super
|
|
26
|
-
mongo_rt_after_render = Collector.reset_runtime
|
|
27
|
-
self.mongoid_runtime = mongo_rt_before_render + mongo_rt_after_render
|
|
28
|
-
runtime - mongo_rt_after_render
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# Add the measurement to the instrumentation event payload.
|
|
32
|
-
def append_info_to_payload(payload)
|
|
33
|
-
super
|
|
34
|
-
payload[:mongoid_runtime] = (mongoid_runtime || 0) + Collector.reset_runtime
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
module ClassMethods
|
|
38
|
-
|
|
39
|
-
# Append MongoDB runtime information to ActionController runtime
|
|
40
|
-
# log message.
|
|
41
|
-
def log_process_action(payload)
|
|
42
|
-
messages = super
|
|
43
|
-
mongoid_runtime = payload[:mongoid_runtime]
|
|
44
|
-
messages << ("MongoDB: %.1fms" % mongoid_runtime.to_f) if mongoid_runtime
|
|
45
|
-
messages
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# The Collector of MongoDB runtime metric, that subscribes to Mongo
|
|
53
|
-
# driver command monitoring. Stores the value within a thread-local
|
|
54
|
-
# variable to provide correct accounting when an application issues
|
|
55
|
-
# MongoDB operations from background threads.
|
|
56
|
-
class Collector
|
|
57
|
-
|
|
58
|
-
VARIABLE_NAME = "Mongoid.controller_runtime".freeze
|
|
59
|
-
|
|
60
|
-
def started _; end
|
|
61
|
-
|
|
62
|
-
def _completed e
|
|
63
|
-
Collector.runtime += e.duration
|
|
64
|
-
end
|
|
65
|
-
alias :succeeded :_completed
|
|
66
|
-
alias :failed :_completed
|
|
67
|
-
|
|
68
|
-
def self.runtime
|
|
69
|
-
Thread.current[VARIABLE_NAME] ||= 0
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def self.runtime= value
|
|
73
|
-
Thread.current[VARIABLE_NAME] = value
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def self.reset_runtime
|
|
77
|
-
to_now = runtime
|
|
78
|
-
self.runtime = 0
|
|
79
|
-
to_now
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
data/lib/mongoid/relations.rb
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/relations/accessors"
|
|
3
|
-
require "mongoid/relations/auto_save"
|
|
4
|
-
require "mongoid/relations/cascading"
|
|
5
|
-
require "mongoid/relations/constraint"
|
|
6
|
-
require "mongoid/relations/conversions"
|
|
7
|
-
require "mongoid/relations/counter_cache"
|
|
8
|
-
require "mongoid/relations/cyclic"
|
|
9
|
-
require "mongoid/relations/proxy"
|
|
10
|
-
require "mongoid/relations/bindings"
|
|
11
|
-
require "mongoid/relations/builders"
|
|
12
|
-
require "mongoid/relations/many"
|
|
13
|
-
require "mongoid/relations/one"
|
|
14
|
-
require "mongoid/relations/options"
|
|
15
|
-
require "mongoid/relations/polymorphic"
|
|
16
|
-
require "mongoid/relations/targets/enumerable"
|
|
17
|
-
require "mongoid/relations/embedded/in"
|
|
18
|
-
require "mongoid/relations/embedded/many"
|
|
19
|
-
require "mongoid/relations/embedded/one"
|
|
20
|
-
require "mongoid/relations/referenced/in"
|
|
21
|
-
require "mongoid/relations/referenced/many"
|
|
22
|
-
require "mongoid/relations/referenced/many_to_many"
|
|
23
|
-
require "mongoid/relations/referenced/one"
|
|
24
|
-
require "mongoid/relations/reflections"
|
|
25
|
-
require "mongoid/relations/synchronization"
|
|
26
|
-
require "mongoid/relations/touchable"
|
|
27
|
-
require "mongoid/relations/metadata"
|
|
28
|
-
require "mongoid/relations/macros"
|
|
29
|
-
|
|
30
|
-
module Mongoid
|
|
31
|
-
|
|
32
|
-
# All classes and modules under the relations namespace handle the
|
|
33
|
-
# functionality that has to do with embedded and referenced (relational)
|
|
34
|
-
# associations.
|
|
35
|
-
module Relations
|
|
36
|
-
extend ActiveSupport::Concern
|
|
37
|
-
include Accessors
|
|
38
|
-
include AutoSave
|
|
39
|
-
include Cascading
|
|
40
|
-
include Cyclic
|
|
41
|
-
include Builders
|
|
42
|
-
include Macros
|
|
43
|
-
include Polymorphic
|
|
44
|
-
include Reflections
|
|
45
|
-
include Synchronization
|
|
46
|
-
include Touchable
|
|
47
|
-
include CounterCache
|
|
48
|
-
|
|
49
|
-
attr_accessor :__metadata
|
|
50
|
-
alias :relation_metadata :__metadata
|
|
51
|
-
|
|
52
|
-
# Determine if the document itself is embedded in another document via the
|
|
53
|
-
# proper channels. (If it has a parent document.)
|
|
54
|
-
#
|
|
55
|
-
# @example Is the document embedded?
|
|
56
|
-
# address.embedded?
|
|
57
|
-
#
|
|
58
|
-
# @return [ true, false ] True if the document has a parent document.
|
|
59
|
-
#
|
|
60
|
-
# @since 2.0.0.rc.1
|
|
61
|
-
def embedded?
|
|
62
|
-
@embedded ||= (cyclic ? _parent.present? : self.class.embedded?)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Determine if the document is part of an embeds_many relation.
|
|
66
|
-
#
|
|
67
|
-
# @example Is the document in an embeds many?
|
|
68
|
-
# address.embedded_many?
|
|
69
|
-
#
|
|
70
|
-
# @return [ true, false ] True if in an embeds many.
|
|
71
|
-
#
|
|
72
|
-
# @since 2.0.0.rc.1
|
|
73
|
-
def embedded_many?
|
|
74
|
-
__metadata && __metadata.macro == :embeds_many
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Determine if the document is part of an embeds_one relation.
|
|
78
|
-
#
|
|
79
|
-
# @example Is the document in an embeds one?
|
|
80
|
-
# address.embedded_one?
|
|
81
|
-
#
|
|
82
|
-
# @return [ true, false ] True if in an embeds one.
|
|
83
|
-
#
|
|
84
|
-
# @since 2.0.0.rc.1
|
|
85
|
-
def embedded_one?
|
|
86
|
-
__metadata && __metadata.macro == :embeds_one
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# Get the metadata name for this document. If no metadata was defined
|
|
90
|
-
# will raise an error.
|
|
91
|
-
#
|
|
92
|
-
# @example Get the metadata name.
|
|
93
|
-
# document.metadata_name
|
|
94
|
-
#
|
|
95
|
-
# @raise [ Errors::NoMetadata ] If no metadata is present.
|
|
96
|
-
#
|
|
97
|
-
# @return [ Symbol ] The metadata name.
|
|
98
|
-
#
|
|
99
|
-
# @since 3.0.0
|
|
100
|
-
def metadata_name
|
|
101
|
-
raise Errors::NoMetadata.new(self.class.name) unless __metadata
|
|
102
|
-
__metadata.name
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# Determine if the document is part of an references_many relation.
|
|
106
|
-
#
|
|
107
|
-
# @example Is the document in a references many?
|
|
108
|
-
# post.referenced_many?
|
|
109
|
-
#
|
|
110
|
-
# @return [ true, false ] True if in a references many.
|
|
111
|
-
#
|
|
112
|
-
# @since 2.0.0.rc.1
|
|
113
|
-
def referenced_many?
|
|
114
|
-
__metadata && __metadata.macro == :has_many
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
# Determine if the document is part of an references_one relation.
|
|
118
|
-
#
|
|
119
|
-
# @example Is the document in a references one?
|
|
120
|
-
# address.referenced_one?
|
|
121
|
-
#
|
|
122
|
-
# @return [ true, false ] True if in a references one.
|
|
123
|
-
#
|
|
124
|
-
# @since 2.0.0.rc.1
|
|
125
|
-
def referenced_one?
|
|
126
|
-
__metadata && __metadata.macro == :has_one
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
# Convenience method for iterating through the loaded relations and
|
|
130
|
-
# reloading them.
|
|
131
|
-
#
|
|
132
|
-
# @example Reload the relations.
|
|
133
|
-
# document.reload_relations
|
|
134
|
-
#
|
|
135
|
-
# @return [ Hash ] The relations metadata.
|
|
136
|
-
#
|
|
137
|
-
# @since 2.1.6
|
|
138
|
-
def reload_relations
|
|
139
|
-
relations.each_pair do |name, meta|
|
|
140
|
-
if instance_variable_defined?("@_#{name}")
|
|
141
|
-
if _parent.nil? || instance_variable_get("@_#{name}") != _parent
|
|
142
|
-
remove_instance_variable("@_#{name}")
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
end
|
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
|
|
5
|
-
# This module contains all the behaviour related to accessing relations
|
|
6
|
-
# through the getters and setters, and how to delegate to builders to
|
|
7
|
-
# create new ones.
|
|
8
|
-
module Accessors
|
|
9
|
-
extend ActiveSupport::Concern
|
|
10
|
-
|
|
11
|
-
# Builds the related document and creates the relation unless the
|
|
12
|
-
# document is nil, then sets the relation on this document.
|
|
13
|
-
#
|
|
14
|
-
# @example Build the relation.
|
|
15
|
-
# person.__build__(:addresses, { :_id => 1 }, metadata)
|
|
16
|
-
#
|
|
17
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
18
|
-
# @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
|
|
19
|
-
# @param [ Metadata ] metadata The relation's metadata.
|
|
20
|
-
#
|
|
21
|
-
# @return [ Proxy ] The relation.
|
|
22
|
-
#
|
|
23
|
-
# @since 2.0.0.rc.1
|
|
24
|
-
def __build__(name, object, metadata)
|
|
25
|
-
relation = create_relation(object, metadata)
|
|
26
|
-
set_relation(name, relation)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Create a relation from an object and metadata.
|
|
30
|
-
#
|
|
31
|
-
# @example Create the relation.
|
|
32
|
-
# person.create_relation(document, metadata)
|
|
33
|
-
#
|
|
34
|
-
# @param [ Document, Array<Document> ] object The relation target.
|
|
35
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
36
|
-
#
|
|
37
|
-
# @return [ Proxy ] The relation.
|
|
38
|
-
#
|
|
39
|
-
# @since 2.0.0.rc.1
|
|
40
|
-
def create_relation(object, metadata)
|
|
41
|
-
type = @attributes[metadata.inverse_type]
|
|
42
|
-
target = metadata.builder(self, object).build(type)
|
|
43
|
-
target ? metadata.relation.new(self, target, metadata) : nil
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Resets the criteria inside the relation proxy. Used by many to many
|
|
47
|
-
# relations to keep the underlying ids array in sync.
|
|
48
|
-
#
|
|
49
|
-
# @example Reset the relation criteria.
|
|
50
|
-
# person.reset_relation_criteria(:preferences)
|
|
51
|
-
#
|
|
52
|
-
# @param [ Symbol ] name The name of the relation.
|
|
53
|
-
#
|
|
54
|
-
# @since 3.0.14
|
|
55
|
-
def reset_relation_criteria(name)
|
|
56
|
-
if instance_variable_defined?("@_#{name}")
|
|
57
|
-
send(name).reset_unloaded
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Set the supplied relation to an instance variable on the class with the
|
|
62
|
-
# provided name. Used as a helper just for code cleanliness.
|
|
63
|
-
#
|
|
64
|
-
# @example Set the proxy on the document.
|
|
65
|
-
# person.set(:addresses, addresses)
|
|
66
|
-
#
|
|
67
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
68
|
-
# @param [ Proxy ] relation The relation to set.
|
|
69
|
-
#
|
|
70
|
-
# @return [ Proxy ] The relation.
|
|
71
|
-
#
|
|
72
|
-
# @since 2.0.0.rc.1
|
|
73
|
-
def set_relation(name, relation)
|
|
74
|
-
instance_variable_set("@_#{name}", relation)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
private
|
|
78
|
-
|
|
79
|
-
# Get the relation. Extracted out from the getter method to avoid
|
|
80
|
-
# infinite recursion when overriding the getter.
|
|
81
|
-
#
|
|
82
|
-
# @api private
|
|
83
|
-
#
|
|
84
|
-
# @example Get the relation.
|
|
85
|
-
# document.get_relation(:name, metadata)
|
|
86
|
-
#
|
|
87
|
-
# @param [ Symbol ] name The name of the relation.
|
|
88
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
89
|
-
# @param [ true, false ] reload If the relation is to be reloaded.
|
|
90
|
-
#
|
|
91
|
-
# @return [ Proxy ] The relation.
|
|
92
|
-
#
|
|
93
|
-
# @since 3.0.16
|
|
94
|
-
def get_relation(name, metadata, object, reload = false)
|
|
95
|
-
if !reload && (value = ivar(name)) != false
|
|
96
|
-
value
|
|
97
|
-
else
|
|
98
|
-
_building do
|
|
99
|
-
_loading do
|
|
100
|
-
if object && needs_no_database_query?(object, metadata)
|
|
101
|
-
__build__(name, object, metadata)
|
|
102
|
-
else
|
|
103
|
-
__build__(name, attributes[metadata.key], metadata)
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def needs_no_database_query?(object, metadata)
|
|
111
|
-
object.is_a?(Document) && !object.embedded? &&
|
|
112
|
-
object._id == attributes[metadata.key]
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# Is the current code executing without autobuild functionality?
|
|
116
|
-
#
|
|
117
|
-
# @example Is autobuild disabled?
|
|
118
|
-
# document.without_autobuild?
|
|
119
|
-
#
|
|
120
|
-
# @return [ true, false ] If autobuild is disabled.
|
|
121
|
-
#
|
|
122
|
-
# @since 3.0.0
|
|
123
|
-
def without_autobuild?
|
|
124
|
-
Threaded.executing?(:without_autobuild)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# Yield to the block with autobuild functionality turned off.
|
|
128
|
-
#
|
|
129
|
-
# @example Execute without autobuild.
|
|
130
|
-
# document.without_autobuild do
|
|
131
|
-
# document.name
|
|
132
|
-
# end
|
|
133
|
-
#
|
|
134
|
-
# @return [ Object ] The result of the yield.
|
|
135
|
-
#
|
|
136
|
-
# @since 3.0.0
|
|
137
|
-
def without_autobuild
|
|
138
|
-
Threaded.begin_execution("without_autobuild")
|
|
139
|
-
yield
|
|
140
|
-
ensure
|
|
141
|
-
Threaded.exit_execution("without_autobuild")
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
module ClassMethods
|
|
145
|
-
|
|
146
|
-
# Adds the existence check for relations.
|
|
147
|
-
#
|
|
148
|
-
# @example Add the existence check.
|
|
149
|
-
# Person.existence_check(:name, meta)
|
|
150
|
-
#
|
|
151
|
-
# @example Check if a relation exists.
|
|
152
|
-
# person = Person.new
|
|
153
|
-
# person.has_game?
|
|
154
|
-
# person.game?
|
|
155
|
-
#
|
|
156
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
157
|
-
#
|
|
158
|
-
# @return [ Class ] The model being set up.
|
|
159
|
-
#
|
|
160
|
-
# @since 3.0.0
|
|
161
|
-
def existence_check(name)
|
|
162
|
-
module_eval <<-END, __FILE__, __LINE__ + 1
|
|
163
|
-
def #{name}?
|
|
164
|
-
without_autobuild { !__send__(:#{name}).blank? }
|
|
165
|
-
end
|
|
166
|
-
alias :has_#{name}? :#{name}?
|
|
167
|
-
END
|
|
168
|
-
self
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
# Defines the getter for the relation. Nothing too special here: just
|
|
172
|
-
# return the instance variable for the relation if it exists or build
|
|
173
|
-
# the thing.
|
|
174
|
-
#
|
|
175
|
-
# @example Set up the getter for the relation.
|
|
176
|
-
# Person.getter("addresses", metadata)
|
|
177
|
-
#
|
|
178
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
179
|
-
# @param [ Metadata ] metadata The metadata for the relation.
|
|
180
|
-
#
|
|
181
|
-
# @return [ Class ] The class being set up.
|
|
182
|
-
#
|
|
183
|
-
# @since 2.0.0.rc.1
|
|
184
|
-
def getter(name, metadata)
|
|
185
|
-
re_define_method(name) do |reload = false|
|
|
186
|
-
value = get_relation(name, metadata, nil, reload)
|
|
187
|
-
if value.nil? && metadata.autobuilding? && !without_autobuild?
|
|
188
|
-
value = send("build_#{name}")
|
|
189
|
-
end
|
|
190
|
-
value
|
|
191
|
-
end
|
|
192
|
-
self
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
# Defines the getter for the ids of documents in the relation. Should
|
|
196
|
-
# be specify only for referenced many relations.
|
|
197
|
-
#
|
|
198
|
-
# @example Set up the ids getter for the relation.
|
|
199
|
-
# Person.ids_getter("addresses", metadata)
|
|
200
|
-
#
|
|
201
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
202
|
-
#
|
|
203
|
-
# @return [ Class ] The class being set up.
|
|
204
|
-
def ids_getter(name, metadata)
|
|
205
|
-
ids_method = "#{name.to_s.singularize}_ids"
|
|
206
|
-
re_define_method(ids_method) do
|
|
207
|
-
send(name).only(:id).map(&:id)
|
|
208
|
-
end
|
|
209
|
-
self
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
# Defines the setter for the relation. This does a few things based on
|
|
213
|
-
# some conditions. If there is an existing association, a target
|
|
214
|
-
# substitution will take place, otherwise a new relation will be
|
|
215
|
-
# created with the supplied target.
|
|
216
|
-
#
|
|
217
|
-
# @example Set up the setter for the relation.
|
|
218
|
-
# Person.setter("addresses", metadata)
|
|
219
|
-
#
|
|
220
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
221
|
-
# @param [ Metadata ] metadata The metadata for the relation.
|
|
222
|
-
#
|
|
223
|
-
# @return [ Class ] The class being set up.
|
|
224
|
-
#
|
|
225
|
-
# @since 2.0.0.rc.1
|
|
226
|
-
def setter(name, metadata)
|
|
227
|
-
re_define_method("#{name}=") do |object|
|
|
228
|
-
without_autobuild do
|
|
229
|
-
if value = get_relation(name, metadata, object)
|
|
230
|
-
if value.respond_to?(:substitute)
|
|
231
|
-
set_relation(name, value.substitute(object.substitutable))
|
|
232
|
-
else
|
|
233
|
-
value = __build__(name, value, metadata)
|
|
234
|
-
set_relation(name, value.substitute(object.substitutable))
|
|
235
|
-
end
|
|
236
|
-
else
|
|
237
|
-
__build__(name, object.substitutable, metadata)
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
self
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
# Defines the setter method that allows you to set documents
|
|
245
|
-
# in this relation by their ids. The defined setter, finds
|
|
246
|
-
# documents with given ids and invokes regular relation setter
|
|
247
|
-
# with found documents. Ids setters should be defined only for
|
|
248
|
-
# referenced many relations.
|
|
249
|
-
#
|
|
250
|
-
# @example Set up the id_setter for the relation.
|
|
251
|
-
# Person.ids_setter("addesses", metadata)
|
|
252
|
-
#
|
|
253
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
254
|
-
# @param [ Metadata ] metadata The metadata for the relation.
|
|
255
|
-
#
|
|
256
|
-
# @return [ Class ] The class being set up.
|
|
257
|
-
def ids_setter(name, metadata)
|
|
258
|
-
ids_method = "#{name.to_s.singularize}_ids="
|
|
259
|
-
re_define_method(ids_method) do |ids|
|
|
260
|
-
send(metadata.setter, metadata.klass.find(ids.reject(&:blank?)))
|
|
261
|
-
end
|
|
262
|
-
self
|
|
263
|
-
end
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
end
|
|
267
|
-
end
|