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
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
require 'mongoid/association/embedded/embeds_many/binding'
|
|
2
|
+
require 'mongoid/association/embedded/embeds_many/buildable'
|
|
3
|
+
require 'mongoid/association/embedded/embeds_many/proxy'
|
|
4
|
+
|
|
5
|
+
module Mongoid
|
|
6
|
+
module Association
|
|
7
|
+
module Embedded
|
|
8
|
+
|
|
9
|
+
# The EmbedsMany type association.
|
|
10
|
+
#
|
|
11
|
+
# @since 7.0
|
|
12
|
+
class EmbedsMany
|
|
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
|
+
:as,
|
|
24
|
+
:cascade_callbacks,
|
|
25
|
+
:cyclic,
|
|
26
|
+
:order,
|
|
27
|
+
:store_as,
|
|
28
|
+
:before_add,
|
|
29
|
+
:after_add,
|
|
30
|
+
:before_remove,
|
|
31
|
+
:after_remove
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
# The complete list of valid options for this association, including
|
|
35
|
+
# the shared ones.
|
|
36
|
+
#
|
|
37
|
+
# @return [ Array<Symbol> ] The valid options.
|
|
38
|
+
#
|
|
39
|
+
# @since 7.0
|
|
40
|
+
VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
|
|
41
|
+
|
|
42
|
+
# Setup the instance methods, fields, etc. on the association owning class.
|
|
43
|
+
#
|
|
44
|
+
# @return [ self ]
|
|
45
|
+
#
|
|
46
|
+
# @since 7.0
|
|
47
|
+
def setup!
|
|
48
|
+
setup_instance_methods!
|
|
49
|
+
@owner_class.embedded_relations = @owner_class.embedded_relations.merge(name => self)
|
|
50
|
+
@owner_class.aliased_fields[name.to_s] = store_as if store_as
|
|
51
|
+
self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# The field key used to store the list of association objects.
|
|
55
|
+
#
|
|
56
|
+
# @return [ String ] The field name.
|
|
57
|
+
#
|
|
58
|
+
# @since 7.0
|
|
59
|
+
def store_as
|
|
60
|
+
@store_as ||= (@options[:store_as].try(:to_s) || name.to_s)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# The key that is used to get the attributes for the associated object.
|
|
64
|
+
#
|
|
65
|
+
# @return [ String ] The name of the field used to store the relation.
|
|
66
|
+
#
|
|
67
|
+
# @since 7.0
|
|
68
|
+
def key
|
|
69
|
+
store_as.to_s
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Is this association type embedded?
|
|
73
|
+
#
|
|
74
|
+
# @return [ true ] Always true.
|
|
75
|
+
#
|
|
76
|
+
# @since 7.0
|
|
77
|
+
def embedded?; true; end
|
|
78
|
+
|
|
79
|
+
# Get the default validation setting for the relation. Determines if
|
|
80
|
+
# by default a validates associated will occur.
|
|
81
|
+
#
|
|
82
|
+
# @example Get the validation default.
|
|
83
|
+
# Proxy.validation_default
|
|
84
|
+
#
|
|
85
|
+
# @return [ true ] Always true.
|
|
86
|
+
#
|
|
87
|
+
# @since 2.1.9
|
|
88
|
+
def validation_default; true; end
|
|
89
|
+
|
|
90
|
+
# Does this association type store the foreign key?
|
|
91
|
+
#
|
|
92
|
+
# @return [ false ] Always false.
|
|
93
|
+
#
|
|
94
|
+
# @since 7.0
|
|
95
|
+
def stores_foreign_key?; false; end
|
|
96
|
+
|
|
97
|
+
# The primary key
|
|
98
|
+
#
|
|
99
|
+
# @return [ nil ] Not relevant for this relation
|
|
100
|
+
def primary_key; end
|
|
101
|
+
|
|
102
|
+
# Get the relation proxy class for this association type.
|
|
103
|
+
#
|
|
104
|
+
# @return [ Association::Embedded::EmbedsMany::Proxy ] The proxy class.
|
|
105
|
+
#
|
|
106
|
+
# @since 7.0
|
|
107
|
+
def relation
|
|
108
|
+
Proxy
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Is this association polymorphic?
|
|
112
|
+
#
|
|
113
|
+
# @return [ true, false ] Whether this association is polymorphic.
|
|
114
|
+
#
|
|
115
|
+
# @since 7.0
|
|
116
|
+
def polymorphic?
|
|
117
|
+
@polymorphic ||= !!@options[:as]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# The field used to store the type of the related object.
|
|
121
|
+
#
|
|
122
|
+
# @note Only relevant if the association is polymorphic.
|
|
123
|
+
#
|
|
124
|
+
# @return [ String, nil ] The field for storing the associated object's type.
|
|
125
|
+
#
|
|
126
|
+
# @since 7.0
|
|
127
|
+
def type
|
|
128
|
+
@type ||= "#{as}_type" if polymorphic?
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# The nested builder object.
|
|
132
|
+
#
|
|
133
|
+
# @param [ Hash ] attributes The attributes to use to build the association object.
|
|
134
|
+
# @param [ Hash ] options The options for the association.
|
|
135
|
+
#
|
|
136
|
+
# @return [ Association::Nested::Many ] The Nested Builder object.
|
|
137
|
+
#
|
|
138
|
+
# @since 7.0
|
|
139
|
+
def nested_builder(attributes, options)
|
|
140
|
+
Nested::Many.new(self, attributes, options)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Get the path calculator for the supplied document.
|
|
144
|
+
#
|
|
145
|
+
# @example Get the path calculator.
|
|
146
|
+
# Proxy.path(document)
|
|
147
|
+
#
|
|
148
|
+
# @param [ Document ] document The document to calculate on.
|
|
149
|
+
#
|
|
150
|
+
# @return [ Mongoid::Atomic::Paths::Embedded::Many ]
|
|
151
|
+
# The embedded many atomic path calculator.
|
|
152
|
+
#
|
|
153
|
+
# @since 2.1.0
|
|
154
|
+
def path(document)
|
|
155
|
+
Mongoid::Atomic::Paths::Embedded::Many.new(document)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Get a criteria object for searching given a parent and children documents.
|
|
159
|
+
#
|
|
160
|
+
# @param [ Document ] base The base document.
|
|
161
|
+
# @param [ Document ] target The children documents.
|
|
162
|
+
#
|
|
163
|
+
# @since 7.0
|
|
164
|
+
def criteria(base, target)
|
|
165
|
+
criterion = klass.scoped
|
|
166
|
+
criterion.embedded = true
|
|
167
|
+
criterion.documents = target
|
|
168
|
+
criterion.parent_document = base
|
|
169
|
+
criterion.association = self
|
|
170
|
+
apply_ordering(criterion)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
private
|
|
174
|
+
|
|
175
|
+
def apply_ordering(criteria)
|
|
176
|
+
order ? criteria.order_by(order) : criteria
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def setup_instance_methods!
|
|
180
|
+
define_getter!
|
|
181
|
+
define_setter!
|
|
182
|
+
define_existence_check!
|
|
183
|
+
define_builder!
|
|
184
|
+
define_creator!
|
|
185
|
+
@owner_class.cyclic = true if cyclic?
|
|
186
|
+
@owner_class.validates_associated(name) if validate?
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def relation_complements
|
|
190
|
+
@relation_complements ||= [ Embedded::EmbeddedIn ].freeze
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def polymorphic_inverses(other = nil)
|
|
194
|
+
[ as ]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def determine_inverses(other)
|
|
198
|
+
matches = relation_class.relations.values.select do |rel|
|
|
199
|
+
relation_complements.include?(rel.class) &&
|
|
200
|
+
rel.relation_class_name == inverse_class_name
|
|
201
|
+
end
|
|
202
|
+
if matches.size > 1
|
|
203
|
+
raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
|
|
204
|
+
end
|
|
205
|
+
matches.collect { |m| m.name } unless matches.blank?
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
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 if non-nil, so only
|
|
56
|
+
# run the callbacks and state-changing code by passing persist: false in that case.
|
|
57
|
+
_target.destroy(persist: !replacement) 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,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
|