mongoid 6.4.2 → 7.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/config/locales/en.yml +17 -0
- data/lib/mongoid/association/accessors.rb +339 -0
- data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
- data/lib/mongoid/association/builders.rb +92 -0
- data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
- data/lib/mongoid/association/depending.rb +137 -0
- data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
- data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
- data/lib/mongoid/association/embedded/cyclic.rb +109 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
- data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
- data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
- data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
- data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
- data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
- data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
- data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
- data/lib/mongoid/association/embedded.rb +4 -0
- data/lib/mongoid/association/macros.rb +204 -0
- data/lib/mongoid/{relations → association}/many.rb +19 -49
- data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
- data/lib/mongoid/association/nested/many.rb +200 -0
- data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
- data/lib/mongoid/association/nested/one.rb +127 -0
- data/lib/mongoid/association/nested.rb +15 -0
- data/lib/mongoid/{relations → association}/one.rb +6 -6
- data/lib/mongoid/association/options.rb +152 -0
- data/lib/mongoid/{relations → association}/proxy.rb +31 -58
- data/lib/mongoid/association/referenced/auto_save.rb +79 -0
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
- data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
- data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
- data/lib/mongoid/association/referenced/eager.rb +162 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
- data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
- data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
- data/lib/mongoid/association/referenced/has_many.rb +275 -0
- data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
- data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
- data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
- data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
- data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
- data/lib/mongoid/association/referenced/has_one.rb +204 -0
- data/lib/mongoid/association/referenced/syncable.rb +170 -0
- data/lib/mongoid/association/referenced.rb +7 -0
- data/lib/mongoid/{relations → association}/reflections.rb +21 -17
- data/lib/mongoid/association/relatable.rb +509 -0
- data/lib/mongoid/{relations.rb → association.rb} +57 -56
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic.rb +4 -4
- data/lib/mongoid/attributes/dynamic.rb +2 -2
- data/lib/mongoid/attributes/nested.rb +22 -11
- data/lib/mongoid/attributes/processing.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +2 -4
- data/lib/mongoid/attributes.rb +22 -13
- data/lib/mongoid/changeable.rb +1 -1
- data/lib/mongoid/clients/options.rb +7 -5
- data/lib/mongoid/composable.rb +4 -4
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +21 -3
- data/lib/mongoid/contextual/mongo.rb +10 -8
- data/lib/mongoid/copyable.rb +7 -6
- data/lib/mongoid/criteria/includable.rb +14 -14
- data/lib/mongoid/criteria/modifiable.rb +8 -14
- data/lib/mongoid/criteria/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
- data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
- data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
- data/lib/mongoid/criteria.rb +2 -2
- data/lib/mongoid/document.rb +15 -6
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
- data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
- data/lib/mongoid/errors/unknown_model.rb +25 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/extensions/array.rb +5 -5
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +5 -2
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/range.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/factory.rb +13 -3
- data/lib/mongoid/fields/foreign_key.rb +5 -5
- data/lib/mongoid/fields/standard.rb +2 -14
- data/lib/mongoid/fields/validators/macro.rb +1 -1
- data/lib/mongoid/fields.rb +3 -3
- data/lib/mongoid/indexable.rb +4 -1
- data/lib/mongoid/interceptable.rb +5 -5
- data/lib/mongoid/matchable/and.rb +1 -1
- data/lib/mongoid/matchable/elem_match.rb +9 -3
- data/lib/mongoid/matchable/eq.rb +22 -0
- data/lib/mongoid/matchable/ne.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -1
- data/lib/mongoid/persistable/deletable.rb +7 -6
- data/lib/mongoid/persistable/incrementable.rb +1 -1
- data/lib/mongoid/persistable/logical.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +57 -12
- data/lib/mongoid/persistable.rb +4 -5
- data/lib/mongoid/persistence_context.rb +20 -5
- data/lib/mongoid/query_cache.rb +8 -4
- data/lib/mongoid/railtie.rb +17 -0
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +4 -4
- data/lib/mongoid/shardable.rb +1 -1
- data/lib/mongoid/threaded.rb +36 -0
- data/lib/mongoid/touchable.rb +102 -0
- data/lib/mongoid/traversable.rb +3 -3
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +4 -4
- data/lib/mongoid/validatable.rb +8 -8
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
- data/spec/app/models/animal.rb +2 -1
- data/spec/app/models/bomb.rb +1 -1
- data/spec/app/models/message.rb +1 -1
- data/spec/app/models/minim.rb +7 -0
- data/spec/app/models/person.rb +5 -2
- data/spec/app/models/shipment_address.rb +1 -0
- data/spec/app/models/store_as_dup_test3.rb +7 -0
- data/spec/app/models/store_as_dup_test4.rb +7 -0
- data/spec/app/models/updatable.rb +7 -0
- data/spec/app/models/vertex.rb +6 -0
- data/spec/app/models/wiki_page.rb +1 -1
- data/spec/config/mongoid.yml +13 -3
- data/spec/integration/associations/belongs_to_spec.rb +13 -0
- data/spec/lite_spec_helper.rb +56 -0
- data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
- data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
- data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
- data/spec/mongoid/association/constrainable_spec.rb +115 -0
- data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +866 -0
- data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
- data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
- data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
- data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
- data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
- data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
- data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
- data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
- data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
- data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
- data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
- data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
- data/spec/mongoid/association/options_spec.rb +1321 -0
- data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
- data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
- data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
- data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
- data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
- data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
- data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
- data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
- data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
- data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
- data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
- data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
- data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
- data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
- data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
- data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
- data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
- data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
- data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
- data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
- data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
- data/spec/mongoid/atomic_spec.rb +4 -4
- data/spec/mongoid/attributes/nested_spec.rb +29 -11
- data/spec/mongoid/attributes/readonly_spec.rb +80 -125
- data/spec/mongoid/attributes_spec.rb +38 -2
- data/spec/mongoid/clients/factory_spec.rb +24 -18
- data/spec/mongoid/clients/options_spec.rb +58 -44
- data/spec/mongoid/clients/sessions_spec.rb +1 -1
- data/spec/mongoid/clients/transactions_spec.rb +369 -0
- data/spec/mongoid/clients_spec.rb +68 -8
- data/spec/mongoid/config_spec.rb +27 -1
- data/spec/mongoid/contextual/memory_spec.rb +19 -0
- data/spec/mongoid/contextual/mongo_spec.rb +33 -5
- data/spec/mongoid/copyable_spec.rb +90 -6
- data/spec/mongoid/copyable_spec_models.rb +17 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +33 -18
- data/spec/mongoid/document_spec.rb +83 -4
- data/spec/mongoid/extensions/array_spec.rb +11 -15
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- data/spec/mongoid/extensions/hash_spec.rb +18 -1
- data/spec/mongoid/extensions/object_spec.rb +7 -11
- data/spec/mongoid/extensions/range_spec.rb +7 -0
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/factory_spec.rb +19 -1
- data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
- data/spec/mongoid/fields_spec.rb +2 -2
- data/spec/mongoid/findable_spec.rb +1 -1
- data/spec/mongoid/indexable_spec.rb +18 -8
- data/spec/mongoid/interceptable_spec.rb +22 -1
- data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
- data/spec/mongoid/matchable/eq_spec.rb +48 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +2 -2
- data/spec/mongoid/persistable/settable_spec.rb +95 -10
- data/spec/mongoid/persistable_spec.rb +21 -6
- data/spec/mongoid/persistence_context_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +61 -22
- data/spec/mongoid/relations/proxy_spec.rb +124 -124
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/shardable_spec.rb +32 -12
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
- data/spec/mongoid/validatable/associated_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +7 -6
- data/spec/mongoid/validatable_spec.rb +1 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +51 -25
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/spec_config.rb +39 -0
- metadata +602 -582
- checksums.yaml.gz.sig +0 -2
- data/lib/mongoid/relations/accessors.rb +0 -267
- data/lib/mongoid/relations/auto_save.rb +0 -94
- data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
- data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
- data/lib/mongoid/relations/bindings.rb +0 -9
- data/lib/mongoid/relations/builder.rb +0 -57
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
- data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
- data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
- data/lib/mongoid/relations/builders.rb +0 -106
- data/lib/mongoid/relations/cascading/delete.rb +0 -44
- data/lib/mongoid/relations/cascading/destroy.rb +0 -43
- data/lib/mongoid/relations/cascading/nullify.rb +0 -35
- data/lib/mongoid/relations/cascading/restrict.rb +0 -39
- data/lib/mongoid/relations/cascading.rb +0 -56
- data/lib/mongoid/relations/conversions.rb +0 -34
- data/lib/mongoid/relations/counter_cache.rb +0 -160
- data/lib/mongoid/relations/cyclic.rb +0 -107
- data/lib/mongoid/relations/eager/base.rb +0 -153
- data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
- data/lib/mongoid/relations/eager/has_many.rb +0 -38
- data/lib/mongoid/relations/eager/has_one.rb +0 -30
- data/lib/mongoid/relations/embedded/in.rb +0 -241
- data/lib/mongoid/relations/embedded/many.rb +0 -683
- data/lib/mongoid/relations/embedded/one.rb +0 -235
- data/lib/mongoid/relations/macros.rb +0 -367
- data/lib/mongoid/relations/metadata.rb +0 -1179
- data/lib/mongoid/relations/nested_builder.rb +0 -74
- data/lib/mongoid/relations/options.rb +0 -49
- data/lib/mongoid/relations/polymorphic.rb +0 -39
- data/lib/mongoid/relations/referenced/in.rb +0 -304
- data/lib/mongoid/relations/referenced/many.rb +0 -812
- data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
- data/lib/mongoid/relations/referenced/one.rb +0 -290
- data/lib/mongoid/relations/synchronization.rb +0 -169
- data/lib/mongoid/relations/targets/enumerable.rb +0 -493
- data/lib/mongoid/relations/targets.rb +0 -2
- data/lib/mongoid/relations/touchable.rb +0 -97
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
- data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
- data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
- data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
- data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
- data/spec/mongoid/relations/cascading_spec.rb +0 -355
- data/spec/mongoid/relations/constraint_spec.rb +0 -75
- data/spec/mongoid/relations/conversions_spec.rb +0 -128
- data/spec/mongoid/relations/metadata_spec.rb +0 -1985
- data/spec/mongoid/relations/options_spec.rb +0 -35
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
- /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
checksums.yaml.gz.sig
DELETED
|
@@ -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
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
|
|
5
|
-
# This module contains the behaviour for auto-saving relations in
|
|
6
|
-
# different collections.
|
|
7
|
-
module AutoSave
|
|
8
|
-
extend ActiveSupport::Concern
|
|
9
|
-
|
|
10
|
-
# Used to prevent infinite loops in associated autosaves.
|
|
11
|
-
#
|
|
12
|
-
# @example Is the document autosaved?
|
|
13
|
-
# document.autosaved?
|
|
14
|
-
#
|
|
15
|
-
# @return [ true, false ] Has the document already been autosaved?
|
|
16
|
-
#
|
|
17
|
-
# @since 3.0.0
|
|
18
|
-
def autosaved?
|
|
19
|
-
Threaded.autosaved?(self)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# Begin the associated autosave.
|
|
23
|
-
#
|
|
24
|
-
# @example Begin autosave.
|
|
25
|
-
# document.__autosaving__
|
|
26
|
-
#
|
|
27
|
-
# @since 3.1.3
|
|
28
|
-
def __autosaving__
|
|
29
|
-
Threaded.begin_autosave(self)
|
|
30
|
-
yield
|
|
31
|
-
ensure
|
|
32
|
-
Threaded.exit_autosave(self)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Check if there is changes for auto-saving
|
|
36
|
-
#
|
|
37
|
-
# @example Return true if there is changes on self or in
|
|
38
|
-
# autosaved relations.
|
|
39
|
-
# document.changed_for_autosave?
|
|
40
|
-
#
|
|
41
|
-
# @since 3.1.3
|
|
42
|
-
def changed_for_autosave?(doc)
|
|
43
|
-
doc.new_record? || doc.changed? || doc.marked_for_destruction?
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
module ClassMethods
|
|
47
|
-
|
|
48
|
-
# Set up the autosave behaviour for references many and references one
|
|
49
|
-
# relations. When the option is set to true, these relations will get
|
|
50
|
-
# saved automatically when the parent saved, if they are dirty.
|
|
51
|
-
#
|
|
52
|
-
# @example Set up autosave options.
|
|
53
|
-
# Person.autosave(metadata)
|
|
54
|
-
#
|
|
55
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
56
|
-
#
|
|
57
|
-
# @since 2.0.0.rc.1
|
|
58
|
-
def autosave(metadata)
|
|
59
|
-
if metadata.autosave? && !metadata.embedded?
|
|
60
|
-
save_method = :"autosave_documents_for_#{metadata.name}"
|
|
61
|
-
define_method(save_method) do
|
|
62
|
-
if before_callback_halted?
|
|
63
|
-
self.before_callback_halted = false
|
|
64
|
-
else
|
|
65
|
-
__autosaving__ do
|
|
66
|
-
if relation = ivar(metadata.name)
|
|
67
|
-
if :belongs_to == metadata.macro
|
|
68
|
-
if changed_for_autosave?(relation)
|
|
69
|
-
relation.with(persistence_context) do |_relation|
|
|
70
|
-
_relation.save
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
else
|
|
74
|
-
Array(relation).each do |doc|
|
|
75
|
-
if changed_for_autosave?(doc)
|
|
76
|
-
doc.with(persistence_context) do |d|
|
|
77
|
-
d.save
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
after_save save_method, unless: :autosaved?
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Bindings
|
|
5
|
-
module Embedded
|
|
6
|
-
|
|
7
|
-
# Binding class for embedded_in relations.
|
|
8
|
-
class In < Binding
|
|
9
|
-
|
|
10
|
-
# Binds the base object to the inverse of the relation. This is so we
|
|
11
|
-
# are referenced to the actual objects themselves on both sides.
|
|
12
|
-
#
|
|
13
|
-
# This case sets the metadata on the inverse object as well as the
|
|
14
|
-
# document itself.
|
|
15
|
-
#
|
|
16
|
-
# @example Bind the documents.
|
|
17
|
-
# name.person.bind(:continue => true)
|
|
18
|
-
# name.person = Person.new
|
|
19
|
-
#
|
|
20
|
-
# @option options [ true, false ] :continue Continue binding the inverse.
|
|
21
|
-
# @option options [ true, false ] :binding Are we in build mode?
|
|
22
|
-
#
|
|
23
|
-
# @since 2.0.0.rc.1
|
|
24
|
-
def bind_one
|
|
25
|
-
base.__metadata = metadata.inverse_metadata(target) unless base.__metadata
|
|
26
|
-
base.parentize(target)
|
|
27
|
-
binding do
|
|
28
|
-
if base.embedded_many?
|
|
29
|
-
target.do_or_do_not(metadata.inverse(target)).push(base)
|
|
30
|
-
else
|
|
31
|
-
target.do_or_do_not(metadata.inverse_setter(target), base)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Unbinds the base object and the inverse, caused by setting the
|
|
37
|
-
# reference to nil.
|
|
38
|
-
#
|
|
39
|
-
# @example Unbind the document.
|
|
40
|
-
# name.person.unbind(:continue => true)
|
|
41
|
-
# name.person = nil
|
|
42
|
-
#
|
|
43
|
-
# @option options [ true, false ] :continue Do we continue unbinding?
|
|
44
|
-
#
|
|
45
|
-
# @since 2.0.0.rc.1
|
|
46
|
-
def unbind_one
|
|
47
|
-
binding do
|
|
48
|
-
if base.embedded_many?
|
|
49
|
-
target.do_or_do_not(metadata.inverse(target)).delete(base)
|
|
50
|
-
else
|
|
51
|
-
target.do_or_do_not(metadata.inverse_setter(target), nil)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Bindings
|
|
5
|
-
module Referenced
|
|
6
|
-
|
|
7
|
-
# Binding class for all referenced_in relations.
|
|
8
|
-
class In < Binding
|
|
9
|
-
|
|
10
|
-
# Binds the base object to the inverse of the relation. This is so we
|
|
11
|
-
# are referenced to the actual objects themselves on both sides.
|
|
12
|
-
#
|
|
13
|
-
# This case sets the metadata on the inverse object as well as the
|
|
14
|
-
# document itself.
|
|
15
|
-
#
|
|
16
|
-
# @example Bind the documents.
|
|
17
|
-
# game.person.bind(:continue => true)
|
|
18
|
-
# game.person = Person.new
|
|
19
|
-
#
|
|
20
|
-
# @since 2.0.0.rc.1
|
|
21
|
-
def bind_one
|
|
22
|
-
binding do
|
|
23
|
-
check_inverses!(target)
|
|
24
|
-
bind_foreign_key(base, record_id(target))
|
|
25
|
-
bind_polymorphic_inverse_type(base, target.class.name)
|
|
26
|
-
if inverse = metadata.inverse(target)
|
|
27
|
-
if set_base_metadata
|
|
28
|
-
if base.referenced_many?
|
|
29
|
-
target.__send__(inverse).push(base)
|
|
30
|
-
else
|
|
31
|
-
target.set_relation(inverse, base)
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Unbinds the base object and the inverse, caused by setting the
|
|
39
|
-
# reference to nil.
|
|
40
|
-
#
|
|
41
|
-
# @example Unbind the document.
|
|
42
|
-
# game.person.unbind(:continue => true)
|
|
43
|
-
# game.person = nil
|
|
44
|
-
#
|
|
45
|
-
# @since 2.0.0.rc.1
|
|
46
|
-
def unbind_one
|
|
47
|
-
binding do
|
|
48
|
-
inverse = metadata.inverse(target)
|
|
49
|
-
bind_foreign_key(base, nil)
|
|
50
|
-
bind_polymorphic_inverse_type(base, nil)
|
|
51
|
-
if inverse
|
|
52
|
-
set_base_metadata
|
|
53
|
-
if base.referenced_many?
|
|
54
|
-
target.__send__(inverse).delete(base)
|
|
55
|
-
else
|
|
56
|
-
target.set_relation(inverse, nil)
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Bindings
|
|
5
|
-
module Referenced
|
|
6
|
-
|
|
7
|
-
# Binding class for all references_and_referenced_in_many relations.
|
|
8
|
-
class ManyToMany < Binding
|
|
9
|
-
|
|
10
|
-
# Binds a single document with the inverse relation. Used
|
|
11
|
-
# specifically when appending to the proxy.
|
|
12
|
-
#
|
|
13
|
-
# @example Bind one document.
|
|
14
|
-
# person.preferences.bind_one(preference)
|
|
15
|
-
#
|
|
16
|
-
# @param [ Document ] doc The single document to bind.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.0.0.rc.1
|
|
19
|
-
def bind_one(doc)
|
|
20
|
-
binding do
|
|
21
|
-
inverse_keys = doc.you_must(metadata.inverse_foreign_key)
|
|
22
|
-
if inverse_keys
|
|
23
|
-
record_id = inverse_record_id(doc)
|
|
24
|
-
unless inverse_keys.include?(record_id)
|
|
25
|
-
doc.you_must(metadata.inverse_foreign_key_setter, inverse_keys.push(record_id))
|
|
26
|
-
end
|
|
27
|
-
doc.reset_relation_criteria(metadata.inverse)
|
|
28
|
-
end
|
|
29
|
-
base._synced[metadata.foreign_key] = true
|
|
30
|
-
doc._synced[metadata.inverse_foreign_key] = true
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Unbind a single document.
|
|
35
|
-
#
|
|
36
|
-
# @example Unbind the document.
|
|
37
|
-
# person.preferences.unbind_one(document)
|
|
38
|
-
#
|
|
39
|
-
# @since 2.0.0.rc.1
|
|
40
|
-
def unbind_one(doc)
|
|
41
|
-
binding do
|
|
42
|
-
base.send(metadata.foreign_key).delete_one(record_id(doc))
|
|
43
|
-
inverse_keys = doc.you_must(metadata.inverse_foreign_key)
|
|
44
|
-
if inverse_keys
|
|
45
|
-
inverse_keys.delete_one(inverse_record_id(doc))
|
|
46
|
-
doc.reset_relation_criteria(metadata.inverse)
|
|
47
|
-
end
|
|
48
|
-
base._synced[metadata.foreign_key] = true
|
|
49
|
-
doc._synced[metadata.inverse_foreign_key] = true
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
# Find the inverse id referenced by inverse_keys
|
|
54
|
-
def inverse_record_id(doc)
|
|
55
|
-
inverse_metadata = determine_inverse_metadata(doc)
|
|
56
|
-
if inverse_metadata
|
|
57
|
-
base.__send__(inverse_metadata.primary_key)
|
|
58
|
-
else
|
|
59
|
-
base._id
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def determine_inverse_metadata(doc)
|
|
64
|
-
doc.relations[base.class.name.demodulize.underscore.pluralize]
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/relations/binding"
|
|
3
|
-
require "mongoid/relations/bindings/embedded/in"
|
|
4
|
-
require "mongoid/relations/bindings/embedded/many"
|
|
5
|
-
require "mongoid/relations/bindings/embedded/one"
|
|
6
|
-
require "mongoid/relations/bindings/referenced/in"
|
|
7
|
-
require "mongoid/relations/bindings/referenced/many"
|
|
8
|
-
require "mongoid/relations/bindings/referenced/many_to_many"
|
|
9
|
-
require "mongoid/relations/bindings/referenced/one"
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
|
|
5
|
-
# Superclass for all builder objects. Builders are responsible for either
|
|
6
|
-
# looking up a relation's target from the database, or creating them from a
|
|
7
|
-
# supplied attributes hash.
|
|
8
|
-
class Builder
|
|
9
|
-
include Threaded::Lifecycle
|
|
10
|
-
|
|
11
|
-
attr_reader :base, :metadata, :object
|
|
12
|
-
|
|
13
|
-
# Instantiate the new builder for a relation.
|
|
14
|
-
#
|
|
15
|
-
# @example Create the builder.
|
|
16
|
-
# Builder.new(metadata, { :field => "value })
|
|
17
|
-
#
|
|
18
|
-
# @param [ Document ] base The base document.
|
|
19
|
-
# @param [ Metdata ] metadata The metadata for the relation.
|
|
20
|
-
# @param [ Hash, BSON::ObjectId ] object The attributes to build from or
|
|
21
|
-
# id to query with.
|
|
22
|
-
#
|
|
23
|
-
# @since 2.0.0.rc.1
|
|
24
|
-
def initialize(base, metadata, object)
|
|
25
|
-
@base, @metadata, @object = base, metadata, object
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
protected
|
|
29
|
-
|
|
30
|
-
# Get the class from the metadata.
|
|
31
|
-
#
|
|
32
|
-
# @example Get the class.
|
|
33
|
-
# builder.klass
|
|
34
|
-
#
|
|
35
|
-
# @return [ Class ] The class from the metadata.
|
|
36
|
-
#
|
|
37
|
-
# @since 2.3.2
|
|
38
|
-
def klass
|
|
39
|
-
@klass ||= metadata.klass
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# Do we need to perform a database query? It will be so if the object we
|
|
43
|
-
# have is not a document.
|
|
44
|
-
#
|
|
45
|
-
# @example Should we query the database?
|
|
46
|
-
# builder.query?
|
|
47
|
-
#
|
|
48
|
-
# @return [ true, false ] Whether a database query should happen.
|
|
49
|
-
#
|
|
50
|
-
# @since 2.0.0.rc.1
|
|
51
|
-
def query?
|
|
52
|
-
obj = object.__array__.first
|
|
53
|
-
!obj.is_a?(Mongoid::Document) && !obj.nil?
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|