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,173 @@
|
|
|
1
|
+
require 'mongoid/association/embedded/embeds_one/binding'
|
|
2
|
+
require 'mongoid/association/embedded/embeds_one/buildable'
|
|
3
|
+
require 'mongoid/association/embedded/embeds_one/proxy'
|
|
4
|
+
|
|
5
|
+
module Mongoid
|
|
6
|
+
module Association
|
|
7
|
+
module Embedded
|
|
8
|
+
|
|
9
|
+
# The EmbedsOne type association.
|
|
10
|
+
#
|
|
11
|
+
# @since 7.0
|
|
12
|
+
class EmbedsOne
|
|
13
|
+
include Relatable
|
|
14
|
+
include Buildable
|
|
15
|
+
|
|
16
|
+
# The options available for this type of association, in addition to the
|
|
17
|
+
# common ones.
|
|
18
|
+
#
|
|
19
|
+
# @return [ Array<Symbol> ] The extra valid options.
|
|
20
|
+
#
|
|
21
|
+
# @since 7.0
|
|
22
|
+
ASSOCIATION_OPTIONS = [
|
|
23
|
+
:autobuild,
|
|
24
|
+
:as,
|
|
25
|
+
:cascade_callbacks,
|
|
26
|
+
:cyclic,
|
|
27
|
+
:store_as
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
# The complete list of valid options for this association, including
|
|
31
|
+
# the shared ones.
|
|
32
|
+
#
|
|
33
|
+
# @return [ Array<Symbol> ] The valid options.
|
|
34
|
+
#
|
|
35
|
+
# @since 7.0
|
|
36
|
+
VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
|
|
37
|
+
|
|
38
|
+
# Setup the instance methods, fields, etc. on the association owning class.
|
|
39
|
+
#
|
|
40
|
+
# @return [ self ]
|
|
41
|
+
#
|
|
42
|
+
# @since 7.0
|
|
43
|
+
def setup!
|
|
44
|
+
setup_instance_methods!
|
|
45
|
+
@owner_class.embedded_relations = @owner_class.embedded_relations.merge(name => self)
|
|
46
|
+
@owner_class.aliased_fields[name.to_s] = store_as if store_as
|
|
47
|
+
self
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# The field key used to store the association object.
|
|
51
|
+
#
|
|
52
|
+
# @return [ String ] The field name.
|
|
53
|
+
#
|
|
54
|
+
# @since 7.0
|
|
55
|
+
def store_as
|
|
56
|
+
@store_as ||= (@options[:store_as].try(:to_s) || name.to_s)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# The key that is used to get the attributes for the associated object.
|
|
60
|
+
#
|
|
61
|
+
# @return [ String ] The name of the field used to store the relation.
|
|
62
|
+
#
|
|
63
|
+
# @since 7.0
|
|
64
|
+
def key
|
|
65
|
+
store_as.to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Is this association type embedded?
|
|
69
|
+
#
|
|
70
|
+
# @return [ true ] Always true.
|
|
71
|
+
#
|
|
72
|
+
# @since 7.0
|
|
73
|
+
def embedded?; true; end
|
|
74
|
+
|
|
75
|
+
# Get the default validation setting for the relation. Determines if
|
|
76
|
+
# by default a validates associated will occur.
|
|
77
|
+
#
|
|
78
|
+
# @example Get the validation default.
|
|
79
|
+
# Proxy.validation_default
|
|
80
|
+
#
|
|
81
|
+
# @return [ true, false ] The validation default.
|
|
82
|
+
#
|
|
83
|
+
# @since 2.1.9
|
|
84
|
+
def validation_default; true; end
|
|
85
|
+
|
|
86
|
+
# Does this association type store the foreign key?
|
|
87
|
+
#
|
|
88
|
+
# @return [ false ] Always false.
|
|
89
|
+
#
|
|
90
|
+
# @since 7.0
|
|
91
|
+
def stores_foreign_key?; false; end
|
|
92
|
+
|
|
93
|
+
# The primary key
|
|
94
|
+
#
|
|
95
|
+
# @return [ nil ] Not relevant for this relation
|
|
96
|
+
def primary_key; end
|
|
97
|
+
|
|
98
|
+
# Get the relation proxy class for this association type.
|
|
99
|
+
#
|
|
100
|
+
# @return [ Association::Embedded::EmbedsMany::Proxy ] The proxy class.
|
|
101
|
+
#
|
|
102
|
+
# @since 7.0
|
|
103
|
+
def relation
|
|
104
|
+
Proxy
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Is this association polymorphic?
|
|
108
|
+
#
|
|
109
|
+
# @return [ true, false ] Whether this association is polymorphic.
|
|
110
|
+
#
|
|
111
|
+
# @since 7.0
|
|
112
|
+
def polymorphic?
|
|
113
|
+
@polymorphic ||= !!@options[:as]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# The field used to store the type of the related object.
|
|
117
|
+
#
|
|
118
|
+
# @note Only relevant if the association is polymorphic.
|
|
119
|
+
#
|
|
120
|
+
# @return [ String, nil ] The field for storing the associated object's type.
|
|
121
|
+
#
|
|
122
|
+
# @since 7.0
|
|
123
|
+
def type
|
|
124
|
+
@type ||= "#{as}_type" if polymorphic?
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# The nested builder object.
|
|
128
|
+
#
|
|
129
|
+
# @param [ Hash ] attributes The attributes to use to build the association object.
|
|
130
|
+
# @param [ Hash ] options The options for the association.
|
|
131
|
+
#
|
|
132
|
+
# @return [ Association::Nested::One ] The Nested Builder object.
|
|
133
|
+
#
|
|
134
|
+
# @since 7.0
|
|
135
|
+
def nested_builder(attributes, options)
|
|
136
|
+
Nested::One.new(self, attributes, options)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
private
|
|
140
|
+
|
|
141
|
+
def setup_instance_methods!
|
|
142
|
+
define_getter!
|
|
143
|
+
define_setter!
|
|
144
|
+
define_existence_check!
|
|
145
|
+
define_builder!
|
|
146
|
+
define_creator!
|
|
147
|
+
@owner_class.cyclic = true if cyclic?
|
|
148
|
+
@owner_class.validates_associated(name) if validate?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def relation_complements
|
|
152
|
+
@relation_complements ||= [ Embedded::EmbeddedIn ].freeze
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def polymorphic_inverses(other = nil)
|
|
156
|
+
[ as ]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def determine_inverses(other)
|
|
160
|
+
matches = relation_class.relations.values.select do |rel|
|
|
161
|
+
relation_complements.include?(rel.class) &&
|
|
162
|
+
rel.relation_class_name == inverse_class_name
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
if matches.size > 1
|
|
166
|
+
raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
|
|
167
|
+
end
|
|
168
|
+
matches.collect { |m| m.name } unless matches.blank?
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb}
RENAMED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
1
|
module Mongoid
|
|
3
|
-
module
|
|
4
|
-
module
|
|
5
|
-
|
|
2
|
+
module Association
|
|
3
|
+
module Embedded
|
|
4
|
+
class EmbedsOne
|
|
6
5
|
|
|
7
|
-
# Binding class for embeds_one relations.
|
|
8
|
-
|
|
6
|
+
# Binding class for all embeds_one relations.
|
|
7
|
+
#
|
|
8
|
+
# @since 7.0
|
|
9
|
+
class Binding
|
|
10
|
+
include Bindable
|
|
9
11
|
|
|
10
12
|
# Binds the base object to the inverse of the relation. This is so we
|
|
11
13
|
# are referenced to the actual objects themselves on both sides.
|
|
12
14
|
#
|
|
13
|
-
# This case sets the metadata on the inverse object as well as the
|
|
15
|
+
# This case sets the association metadata on the inverse object as well as the
|
|
14
16
|
# document itself.
|
|
15
17
|
#
|
|
16
18
|
# @example Bind the document.
|
|
@@ -19,9 +21,9 @@ module Mongoid
|
|
|
19
21
|
#
|
|
20
22
|
# @since 2.0.0.rc.1
|
|
21
23
|
def bind_one
|
|
22
|
-
|
|
24
|
+
_target.parentize(_base)
|
|
23
25
|
binding do
|
|
24
|
-
|
|
26
|
+
_target.do_or_do_not(_association.inverse_setter(_target), _base)
|
|
25
27
|
end
|
|
26
28
|
end
|
|
27
29
|
|
|
@@ -35,7 +37,7 @@ module Mongoid
|
|
|
35
37
|
# @since 2.0.0.rc.1
|
|
36
38
|
def unbind_one
|
|
37
39
|
binding do
|
|
38
|
-
|
|
40
|
+
_target.do_or_do_not(_association.inverse_setter(_target), nil)
|
|
39
41
|
end
|
|
40
42
|
end
|
|
41
43
|
end
|
data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb}
RENAMED
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
1
|
module Mongoid
|
|
3
|
-
module
|
|
4
|
-
module
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
module Association
|
|
3
|
+
module Embedded
|
|
4
|
+
class EmbedsOne
|
|
5
|
+
|
|
6
|
+
# Builder class for embeds_one associations.
|
|
7
|
+
#
|
|
8
|
+
# @since 7.0
|
|
9
|
+
module Buildable
|
|
10
|
+
include Threaded::Lifecycle
|
|
7
11
|
|
|
8
12
|
# Builds the document out of the attributes using the provided
|
|
9
|
-
# metadata on the relation. Instantiates through the factory in order
|
|
13
|
+
# association metadata on the relation. Instantiates through the factory in order
|
|
10
14
|
# to make sure subclasses and allocation are used if fitting.
|
|
11
15
|
#
|
|
12
16
|
# @example Build the document.
|
|
13
17
|
# Builder.new(meta, attrs).build
|
|
14
18
|
#
|
|
19
|
+
# @param [ Document ] base The document this relation hangs off of.
|
|
20
|
+
# @param [ Document ] object The related document.
|
|
15
21
|
# @param [ String ] _type Not used in this context.
|
|
16
22
|
#
|
|
17
23
|
# @return [ Document ] A single document.
|
|
18
|
-
def build(_type = nil)
|
|
24
|
+
def build(base, object, _type = nil)
|
|
19
25
|
return object unless object.is_a?(Hash)
|
|
20
26
|
if _loading? && base.persisted?
|
|
21
27
|
Factory.from_db(klass, object)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
module Embedded
|
|
4
|
+
class EmbedsOne
|
|
5
|
+
|
|
6
|
+
class Proxy < Association::One
|
|
7
|
+
|
|
8
|
+
# The valid options when defining this relation.
|
|
9
|
+
#
|
|
10
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
|
11
|
+
#
|
|
12
|
+
# @since 7.0
|
|
13
|
+
VALID_OPTIONS = [
|
|
14
|
+
:autobuild,
|
|
15
|
+
:as,
|
|
16
|
+
:cascade_callbacks,
|
|
17
|
+
:cyclic,
|
|
18
|
+
:store_as
|
|
19
|
+
].freeze
|
|
20
|
+
|
|
21
|
+
# Instantiate a new embeds_one relation.
|
|
22
|
+
#
|
|
23
|
+
# @example Create the new proxy.
|
|
24
|
+
# One.new(person, name, association)
|
|
25
|
+
#
|
|
26
|
+
# @param [ Document ] base The document this relation hangs off of.
|
|
27
|
+
# @param [ Document ] target The child document in the relation.
|
|
28
|
+
# @param [ Association ] association The association metadata.
|
|
29
|
+
def initialize(base, target, association)
|
|
30
|
+
init(base, target, association) do
|
|
31
|
+
characterize_one(_target)
|
|
32
|
+
bind_one
|
|
33
|
+
characterize_one(_target)
|
|
34
|
+
_base._reset_memoized_children!
|
|
35
|
+
_target.save if persistable?
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Substitutes the supplied target documents for the existing document
|
|
40
|
+
# in the relation.
|
|
41
|
+
#
|
|
42
|
+
# @example Substitute the new document.
|
|
43
|
+
# person.name.substitute(new_name)
|
|
44
|
+
#
|
|
45
|
+
# @param [ Document ] replacement A document to replace the target.
|
|
46
|
+
#
|
|
47
|
+
# @return [ Document, nil ] The relation or nil.
|
|
48
|
+
#
|
|
49
|
+
# @since 2.0.0.rc.1
|
|
50
|
+
def substitute(replacement)
|
|
51
|
+
if replacement != self
|
|
52
|
+
if _assigning?
|
|
53
|
+
_base.add_atomic_unset(_target) unless replacement
|
|
54
|
+
else
|
|
55
|
+
# The associated object will be replaced by the below update, so only
|
|
56
|
+
# run the callbacks and state-changing code by passing persist: false.
|
|
57
|
+
_target.destroy(persist: false) if persistable?
|
|
58
|
+
end
|
|
59
|
+
unbind_one
|
|
60
|
+
return nil unless replacement
|
|
61
|
+
replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
|
|
62
|
+
self._target = replacement
|
|
63
|
+
bind_one
|
|
64
|
+
characterize_one(_target)
|
|
65
|
+
_target.save if persistable?
|
|
66
|
+
end
|
|
67
|
+
self
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
# Instantiate the binding associated with this relation.
|
|
73
|
+
#
|
|
74
|
+
# @example Get the binding.
|
|
75
|
+
# relation.binding([ address ])
|
|
76
|
+
#
|
|
77
|
+
# @return [ Binding ] The relation's binding.
|
|
78
|
+
#
|
|
79
|
+
# @since 2.0.0.rc.1
|
|
80
|
+
def binding
|
|
81
|
+
Binding.new(_base, _target, _association)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Are we able to persist this relation?
|
|
85
|
+
#
|
|
86
|
+
# @example Can we persist the relation?
|
|
87
|
+
# relation.persistable?
|
|
88
|
+
#
|
|
89
|
+
# @return [ true, false ] If the relation is persistable.
|
|
90
|
+
#
|
|
91
|
+
# @since 2.1.0
|
|
92
|
+
def persistable?
|
|
93
|
+
_base.persisted? && !_binding? && !_building? && !_assigning?
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
class << self
|
|
97
|
+
|
|
98
|
+
# Returns true if the relation is an embedded one. In this case
|
|
99
|
+
# always true.
|
|
100
|
+
#
|
|
101
|
+
# @example Is this relation embedded?
|
|
102
|
+
# Association::Embedded::EmbedsOne.embedded?
|
|
103
|
+
#
|
|
104
|
+
# @return [ true ] true.
|
|
105
|
+
#
|
|
106
|
+
# @since 2.0.0.rc.1
|
|
107
|
+
def embedded?
|
|
108
|
+
true
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Get the path calculator for the supplied document.
|
|
112
|
+
#
|
|
113
|
+
# @example Get the path calculator.
|
|
114
|
+
# Proxy.path(document)
|
|
115
|
+
#
|
|
116
|
+
# @param [ Document ] document The document to calculate on.
|
|
117
|
+
#
|
|
118
|
+
# @return [ Mongoid::Atomic::Paths::Embedded::One ]
|
|
119
|
+
# The embedded one atomic path calculator.
|
|
120
|
+
#
|
|
121
|
+
# @since 2.1.0
|
|
122
|
+
def path(document)
|
|
123
|
+
Mongoid::Atomic::Paths::Embedded::One.new(document)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
|
|
5
|
+
# This module contains the core macros for defining relations between
|
|
6
|
+
# documents. They can be either embedded or referenced (relational).
|
|
7
|
+
module Macros
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
class_attribute :embedded, instance_reader: false
|
|
12
|
+
class_attribute :embedded_relations
|
|
13
|
+
class_attribute :relations
|
|
14
|
+
self.embedded = false
|
|
15
|
+
self.embedded_relations = BSON::Document.new
|
|
16
|
+
self.relations = BSON::Document.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# This is convenience for libraries still on the old API.
|
|
20
|
+
#
|
|
21
|
+
# @example Get the associations.
|
|
22
|
+
# person.associations
|
|
23
|
+
#
|
|
24
|
+
# @return [ Hash ] The relations.
|
|
25
|
+
#
|
|
26
|
+
# @since 2.3.1
|
|
27
|
+
def associations
|
|
28
|
+
self.relations
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module ClassMethods
|
|
32
|
+
|
|
33
|
+
# Adds the relation back to the parent document. This macro is
|
|
34
|
+
# necessary to set the references from the child back to the parent
|
|
35
|
+
# document. If a child does not define this relation calling
|
|
36
|
+
# persistence methods on the child object will cause a save to fail.
|
|
37
|
+
#
|
|
38
|
+
# @example Define the relation.
|
|
39
|
+
#
|
|
40
|
+
# class Person
|
|
41
|
+
# include Mongoid::Document
|
|
42
|
+
# embeds_many :addresses
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
# class Address
|
|
46
|
+
# include Mongoid::Document
|
|
47
|
+
# embedded_in :person
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# @param [ Symbol ] name The name of the relation.
|
|
51
|
+
# @param [ Hash ] options The relation options.
|
|
52
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
53
|
+
def embedded_in(name, options = {}, &block)
|
|
54
|
+
define_association!(__method__, name, options, &block)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Adds the relation from a parent document to its children. The name
|
|
58
|
+
# of the relation needs to be a pluralized form of the child class
|
|
59
|
+
# name.
|
|
60
|
+
#
|
|
61
|
+
# @example Define the relation.
|
|
62
|
+
#
|
|
63
|
+
# class Person
|
|
64
|
+
# include Mongoid::Document
|
|
65
|
+
# embeds_many :addresses
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# class Address
|
|
69
|
+
# include Mongoid::Document
|
|
70
|
+
# embedded_in :person
|
|
71
|
+
# end
|
|
72
|
+
#
|
|
73
|
+
# @param [ Symbol ] name The name of the relation.
|
|
74
|
+
# @param [ Hash ] options The relation options.
|
|
75
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
76
|
+
def embeds_many(name, options = {}, &block)
|
|
77
|
+
define_association!(__method__, name, options, &block)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Adds the relation from a parent document to its child. The name
|
|
81
|
+
# of the relation needs to be a singular form of the child class
|
|
82
|
+
# name.
|
|
83
|
+
#
|
|
84
|
+
# @example Define the relation.
|
|
85
|
+
#
|
|
86
|
+
# class Person
|
|
87
|
+
# include Mongoid::Document
|
|
88
|
+
# embeds_one :name
|
|
89
|
+
# end
|
|
90
|
+
#
|
|
91
|
+
# class Name
|
|
92
|
+
# include Mongoid::Document
|
|
93
|
+
# embedded_in :person
|
|
94
|
+
# end
|
|
95
|
+
#
|
|
96
|
+
# @param [ Symbol ] name The name of the relation.
|
|
97
|
+
# @param [ Hash ] options The relation options.
|
|
98
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
99
|
+
def embeds_one(name, options = {}, &block)
|
|
100
|
+
define_association!(__method__, name, options, &block)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Adds a relational association from the child Document to a Document in
|
|
104
|
+
# another database or collection.
|
|
105
|
+
#
|
|
106
|
+
# @example Define the relation.
|
|
107
|
+
#
|
|
108
|
+
# class Game
|
|
109
|
+
# include Mongoid::Document
|
|
110
|
+
# belongs_to :person
|
|
111
|
+
# end
|
|
112
|
+
#
|
|
113
|
+
# class Person
|
|
114
|
+
# include Mongoid::Document
|
|
115
|
+
# has_one :game
|
|
116
|
+
# end
|
|
117
|
+
#
|
|
118
|
+
# @param [ Symbol ] name The name of the relation.
|
|
119
|
+
# @param [ Hash ] options The relation options.
|
|
120
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
121
|
+
def belongs_to(name, options = {}, &block)
|
|
122
|
+
define_association!(__method__, name, options, &block)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Adds a relational association from a parent Document to many
|
|
126
|
+
# Documents in another database or collection.
|
|
127
|
+
#
|
|
128
|
+
# @example Define the relation.
|
|
129
|
+
#
|
|
130
|
+
# class Person
|
|
131
|
+
# include Mongoid::Document
|
|
132
|
+
# has_many :posts
|
|
133
|
+
# end
|
|
134
|
+
#
|
|
135
|
+
# class Game
|
|
136
|
+
# include Mongoid::Document
|
|
137
|
+
# belongs_to :person
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
# @param [ Symbol ] name The name of the relation.
|
|
141
|
+
# @param [ Hash ] options The relation options.
|
|
142
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
143
|
+
def has_many(name, options = {}, &block)
|
|
144
|
+
define_association!(__method__, name, options, &block)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Adds a relational many-to-many association between many of this
|
|
148
|
+
# Document and many of another Document.
|
|
149
|
+
#
|
|
150
|
+
# @example Define the relation.
|
|
151
|
+
#
|
|
152
|
+
# class Person
|
|
153
|
+
# include Mongoid::Document
|
|
154
|
+
# has_and_belongs_to_many :preferences
|
|
155
|
+
# end
|
|
156
|
+
#
|
|
157
|
+
# class Preference
|
|
158
|
+
# include Mongoid::Document
|
|
159
|
+
# has_and_belongs_to_many :people
|
|
160
|
+
# end
|
|
161
|
+
#
|
|
162
|
+
# @param [ Symbol ] name The name of the relation.
|
|
163
|
+
# @param [ Hash ] options The relation options.
|
|
164
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
165
|
+
#
|
|
166
|
+
# @since 2.0.0.rc.1
|
|
167
|
+
def has_and_belongs_to_many(name, options = {}, &block)
|
|
168
|
+
define_association!(__method__, name, options, &block)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Adds a relational association from the child Document to a Document in
|
|
172
|
+
# another database or collection.
|
|
173
|
+
#
|
|
174
|
+
# @example Define the relation.
|
|
175
|
+
#
|
|
176
|
+
# class Game
|
|
177
|
+
# include Mongoid::Document
|
|
178
|
+
# belongs_to :person
|
|
179
|
+
# end
|
|
180
|
+
#
|
|
181
|
+
# class Person
|
|
182
|
+
# include Mongoid::Document
|
|
183
|
+
# has_one :game
|
|
184
|
+
# end
|
|
185
|
+
#
|
|
186
|
+
# @param [ Symbol ] name The name of the relation.
|
|
187
|
+
# @param [ Hash ] options The relation options.
|
|
188
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
|
189
|
+
def has_one(name, options = {}, &block)
|
|
190
|
+
define_association!(__method__, name, options, &block)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
private
|
|
194
|
+
|
|
195
|
+
def define_association!(macro_name, name, options = {}, &block)
|
|
196
|
+
Association::MACRO_MAPPING[macro_name].new(self, name, options, &block).tap do |assoc|
|
|
197
|
+
assoc.setup!
|
|
198
|
+
self.relations = self.relations.merge(name => assoc)
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|