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
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6f9840f2a5bdcfd628358c56f70818857080118680059a6ca299c6de3b4554c2
|
|
4
|
+
data.tar.gz: f8700656e769546f2c8d2555013aa601d10552e9e48faf37f24c66fded700b1d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a05fb92510939cf2ccff55855219033db8a9a45399865f725e695af95a9501f72a0db72422766dd54fc9946854e0065b9beb870bfeb3a02b8ac9e605962419e0
|
|
7
|
+
data.tar.gz: 267ff19b100ca5ef83f383ddd8d4ece8ce0e122a16cbc6c1605bc872e391ad775bd6336beb53af733ba8d7b47d9ec01d9842f5502c7f0c135cdc2fa258b80b47
|
data/README.md
CHANGED
data/lib/config/locales/en.yml
CHANGED
|
@@ -91,6 +91,11 @@ en:
|
|
|
91
91
|
expecting the option to be there, please consult the following page
|
|
92
92
|
with repect to Mongoid's configuration:\n\n
|
|
93
93
|
\_\_http://mongoid.org/en/mongoid/docs/installation.html"
|
|
94
|
+
invalid_dependent_strategy:
|
|
95
|
+
message: "Invalid dependent strategy: %{invalid_strategy}."
|
|
96
|
+
summary: "An invalid dependent strategy was defined for the association:
|
|
97
|
+
%{association}. The valid strategies are: %{valid_strategies}."
|
|
98
|
+
resolution: "Change the dependent strategy to one of the valid types."
|
|
94
99
|
invalid_field:
|
|
95
100
|
message: "Defining a field named '%{name}' is not allowed."
|
|
96
101
|
summary: "Defining this field would override the method '%{name}',
|
|
@@ -196,6 +201,11 @@ en:
|
|
|
196
201
|
allowed, and don't use these names. These include names that also
|
|
197
202
|
conflict with core Ruby methods on Object, Module, Enumerable, or
|
|
198
203
|
included gems that inject methods into these or Mongoid internals."
|
|
204
|
+
invalid_relation_option:
|
|
205
|
+
message: "Invalid relation option :%{option} for relation '%{name}' on class
|
|
206
|
+
%{klass}."
|
|
207
|
+
summary: "An invalid option was provided for a relation."
|
|
208
|
+
resolution: "Valid options are: %{valid_options}, make sure you use only those."
|
|
199
209
|
invalid_scope:
|
|
200
210
|
message: "Defining a scope of value %{value} on %{klass} is not
|
|
201
211
|
allowed."
|
|
@@ -494,6 +504,13 @@ en:
|
|
|
494
504
|
attributes hash, and is raised instead of getting a NoMethodError."
|
|
495
505
|
resolution: "You can include Mongoid::Attributes::Dynamic if you
|
|
496
506
|
expect to be writing values for undefined fields often."
|
|
507
|
+
unknown_model:
|
|
508
|
+
message: "Attempted to instantiate an object of the unknown Model '%{klass}'."
|
|
509
|
+
summary: "A document with the value '%{value}' at the key '_type' was used to
|
|
510
|
+
instantiate a model object but Mongoid cannot find this Class."
|
|
511
|
+
resolution: "The _type field is a reserved one used by Mongoid to determine the
|
|
512
|
+
class for instantiating an object. Please don't save data in this field or ensure
|
|
513
|
+
that any values in this field correspond to valid Models."
|
|
497
514
|
unsaved_document:
|
|
498
515
|
message: "Attempted to save %{document} before the parent %{base}."
|
|
499
516
|
summary: "You cannot call create or create! through the
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
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 }, association)
|
|
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 [ Association ] association The association metadata.
|
|
20
|
+
#
|
|
21
|
+
# @return [ Proxy ] The relation.
|
|
22
|
+
#
|
|
23
|
+
# @since 2.0.0.rc.1
|
|
24
|
+
def __build__(name, object, association)
|
|
25
|
+
relation = create_relation(object, association)
|
|
26
|
+
set_relation(name, relation)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Create a relation from an object and association.
|
|
30
|
+
#
|
|
31
|
+
# @example Create the relation.
|
|
32
|
+
# person.create_relation(document, association)
|
|
33
|
+
#
|
|
34
|
+
# @param [ Document, Array<Document> ] object The relation target.
|
|
35
|
+
# @param [ Association ] association The association metadata.
|
|
36
|
+
#
|
|
37
|
+
# @return [ Proxy ] The relation.
|
|
38
|
+
#
|
|
39
|
+
# @since 2.0.0.rc.1
|
|
40
|
+
def create_relation(object, association)
|
|
41
|
+
type = @attributes[association.inverse_type]
|
|
42
|
+
target = association.build(self, object, type)
|
|
43
|
+
target ? association.create_relation(self, target) : 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, association)
|
|
86
|
+
#
|
|
87
|
+
# @param [ Symbol ] name The name of the relation.
|
|
88
|
+
# @param [ Association ] association The association metadata.
|
|
89
|
+
# @param [ Object ] object The object used to build the relation.
|
|
90
|
+
# @param [ true, false ] reload If the relation is to be reloaded.
|
|
91
|
+
#
|
|
92
|
+
# @return [ Proxy ] The relation.
|
|
93
|
+
#
|
|
94
|
+
# @since 3.0.16
|
|
95
|
+
def get_relation(name, association, object, reload = false)
|
|
96
|
+
if !reload && (value = ivar(name)) != false
|
|
97
|
+
value
|
|
98
|
+
else
|
|
99
|
+
_building do
|
|
100
|
+
_loading do
|
|
101
|
+
if object && needs_no_database_query?(object, association)
|
|
102
|
+
__build__(name, object, association)
|
|
103
|
+
else
|
|
104
|
+
__build__(name, attributes[association.key], association)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def needs_no_database_query?(object, association)
|
|
112
|
+
object.is_a?(Document) && !object.embedded? &&
|
|
113
|
+
object._id == attributes[association.key]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Is the current code executing without autobuild functionality?
|
|
117
|
+
#
|
|
118
|
+
# @example Is autobuild disabled?
|
|
119
|
+
# document.without_autobuild?
|
|
120
|
+
#
|
|
121
|
+
# @return [ true, false ] If autobuild is disabled.
|
|
122
|
+
#
|
|
123
|
+
# @since 3.0.0
|
|
124
|
+
def without_autobuild?
|
|
125
|
+
Threaded.executing?(:without_autobuild)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Yield to the block with autobuild functionality turned off.
|
|
129
|
+
#
|
|
130
|
+
# @example Execute without autobuild.
|
|
131
|
+
# document.without_autobuild do
|
|
132
|
+
# document.name
|
|
133
|
+
# end
|
|
134
|
+
#
|
|
135
|
+
# @return [ Object ] The result of the yield.
|
|
136
|
+
#
|
|
137
|
+
# @since 3.0.0
|
|
138
|
+
def without_autobuild
|
|
139
|
+
Threaded.begin_execution("without_autobuild")
|
|
140
|
+
yield
|
|
141
|
+
ensure
|
|
142
|
+
Threaded.exit_execution("without_autobuild")
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Parse out the attributes and the options from the args passed to a
|
|
146
|
+
# build_ or create_ methods.
|
|
147
|
+
#
|
|
148
|
+
# @example Parse the args.
|
|
149
|
+
# doc.parse_args(:name => "Joe")
|
|
150
|
+
#
|
|
151
|
+
# @param [ Array ] args The arguments.
|
|
152
|
+
#
|
|
153
|
+
# @return [ Array<Hash> ] The attributes and options.
|
|
154
|
+
#
|
|
155
|
+
# @since 2.3.4
|
|
156
|
+
def parse_args(*args)
|
|
157
|
+
[args.first || {}, args.size > 1 ? args[1] : {}]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Adds the existence check for relations.
|
|
161
|
+
#
|
|
162
|
+
# @example Add the existence check.
|
|
163
|
+
# Person.define_existence_check!(association)
|
|
164
|
+
#
|
|
165
|
+
# @example Check if a relation exists.
|
|
166
|
+
# person = Person.new
|
|
167
|
+
# person.has_game?
|
|
168
|
+
# person.game?
|
|
169
|
+
#
|
|
170
|
+
# @param [ Association ] association The association.
|
|
171
|
+
#
|
|
172
|
+
# @return [ Class ] The model being set up.
|
|
173
|
+
#
|
|
174
|
+
# @since 3.0.0
|
|
175
|
+
def self.define_existence_check!(association)
|
|
176
|
+
name = association.name
|
|
177
|
+
association.inverse_class.tap do |klass|
|
|
178
|
+
klass.module_eval <<-END, __FILE__, __LINE__ + 1
|
|
179
|
+
def #{name}?
|
|
180
|
+
without_autobuild { !__send__(:#{name}).blank? }
|
|
181
|
+
end
|
|
182
|
+
alias :has_#{name}? :#{name}?
|
|
183
|
+
END
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Defines the getter for the relation. Nothing too special here: just
|
|
188
|
+
# return the instance variable for the relation if it exists or build
|
|
189
|
+
# the thing.
|
|
190
|
+
#
|
|
191
|
+
# @example Set up the getter for the relation.
|
|
192
|
+
# Person.define_getter!(association)
|
|
193
|
+
#
|
|
194
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
195
|
+
#
|
|
196
|
+
# @return [ Class ] The class being set up.
|
|
197
|
+
#
|
|
198
|
+
# @since 2.0.0.rc.1
|
|
199
|
+
def self.define_getter!(association)
|
|
200
|
+
name = association.name
|
|
201
|
+
association.inverse_class.tap do |klass|
|
|
202
|
+
klass.re_define_method(name) do |reload = false|
|
|
203
|
+
value = get_relation(name, association, nil, reload)
|
|
204
|
+
if value.nil? && association.autobuilding? && !without_autobuild?
|
|
205
|
+
value = send("build_#{name}")
|
|
206
|
+
end
|
|
207
|
+
value
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Defines the getter for the ids of documents in the relation. Should
|
|
213
|
+
# be specify only for referenced many relations.
|
|
214
|
+
#
|
|
215
|
+
# @example Set up the ids getter for the relation.
|
|
216
|
+
# Person.define_ids_getter!(association)
|
|
217
|
+
#
|
|
218
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
219
|
+
#
|
|
220
|
+
# @return [ Class ] The class being set up.
|
|
221
|
+
def self.define_ids_getter!(association)
|
|
222
|
+
ids_method = "#{association.name.to_s.singularize}_ids"
|
|
223
|
+
association.inverse_class.tap do |klass|
|
|
224
|
+
klass.re_define_method(ids_method) do
|
|
225
|
+
send(association.name).only(:id).map(&:id)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Defines the setter for the relation. This does a few things based on
|
|
231
|
+
# some conditions. If there is an existing association, a target
|
|
232
|
+
# substitution will take place, otherwise a new relation will be
|
|
233
|
+
# created with the supplied target.
|
|
234
|
+
#
|
|
235
|
+
# @example Set up the setter for the relation.
|
|
236
|
+
# Person.define_setter!(association)
|
|
237
|
+
#
|
|
238
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
239
|
+
#
|
|
240
|
+
# @return [ Class ] The class being set up.
|
|
241
|
+
#
|
|
242
|
+
# @since 2.0.0.rc.1
|
|
243
|
+
def self.define_setter!(association)
|
|
244
|
+
name = association.name
|
|
245
|
+
association.inverse_class.tap do |klass|
|
|
246
|
+
klass.re_define_method("#{name}=") do |object|
|
|
247
|
+
without_autobuild do
|
|
248
|
+
if value = get_relation(name, association, object)
|
|
249
|
+
if value.respond_to?(:substitute)
|
|
250
|
+
set_relation(name, value.substitute(object.substitutable))
|
|
251
|
+
else
|
|
252
|
+
value = __build__(name, value, association)
|
|
253
|
+
set_relation(name, value.substitute(object.substitutable))
|
|
254
|
+
end
|
|
255
|
+
else
|
|
256
|
+
__build__(name, object.substitutable, association)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Defines the setter method that allows you to set documents
|
|
264
|
+
# in this relation by their ids. The defined setter, finds
|
|
265
|
+
# documents with given ids and invokes regular relation setter
|
|
266
|
+
# with found documents. Ids setters should be defined only for
|
|
267
|
+
# referenced many relations.
|
|
268
|
+
#
|
|
269
|
+
# @example Set up the id_setter for the relation.
|
|
270
|
+
# Person.define_ids_setter!(association)
|
|
271
|
+
#
|
|
272
|
+
# @param [ Association ] association The association for the relation.
|
|
273
|
+
#
|
|
274
|
+
# @return [ Class ] The class being set up.
|
|
275
|
+
def self.define_ids_setter!(association)
|
|
276
|
+
ids_method = "#{association.name.to_s.singularize}_ids="
|
|
277
|
+
association.inverse_class.tap do |klass|
|
|
278
|
+
klass.re_define_method(ids_method) do |ids|
|
|
279
|
+
send(association.setter, association.relation_class.find(ids.reject(&:blank?)))
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Defines a builder method for an embeds_one relation. This is
|
|
285
|
+
# defined as #build_name.
|
|
286
|
+
#
|
|
287
|
+
# @example
|
|
288
|
+
# Person.define_builder!(association)
|
|
289
|
+
#
|
|
290
|
+
# @param [ Association ] association The association for the relation.
|
|
291
|
+
#
|
|
292
|
+
# @return [ Class ] The class being set up.
|
|
293
|
+
#
|
|
294
|
+
# @since 2.0.0.rc.1
|
|
295
|
+
def self.define_builder!(association)
|
|
296
|
+
name = association.name
|
|
297
|
+
association.inverse_class.tap do |klass|
|
|
298
|
+
klass.re_define_method("build_#{name}") do |*args|
|
|
299
|
+
attributes, _options = parse_args(*args)
|
|
300
|
+
document = Factory.build(association.relation_class, attributes)
|
|
301
|
+
_building do
|
|
302
|
+
child = send("#{name}=", document)
|
|
303
|
+
child.run_callbacks(:build)
|
|
304
|
+
child
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Defines a creator method for an embeds_one relation. This is
|
|
311
|
+
# defined as #create_name. After the object is built it will
|
|
312
|
+
# immediately save.
|
|
313
|
+
#
|
|
314
|
+
# @example
|
|
315
|
+
# Person.define_creator!(association)
|
|
316
|
+
#
|
|
317
|
+
# @param [ Association ] association The association for the relation.
|
|
318
|
+
#
|
|
319
|
+
# @return [ Class ] The class being set up.
|
|
320
|
+
#
|
|
321
|
+
# @since 2.0.0.rc.1
|
|
322
|
+
def self.define_creator!(association)
|
|
323
|
+
name = association.name
|
|
324
|
+
association.inverse_class.tap do |klass|
|
|
325
|
+
klass.re_define_method("create_#{name}") do |*args|
|
|
326
|
+
attributes, _options = parse_args(*args)
|
|
327
|
+
document = Factory.build(association.klass, attributes)
|
|
328
|
+
doc = _assigning do
|
|
329
|
+
send("#{name}=", document)
|
|
330
|
+
end
|
|
331
|
+
doc.save
|
|
332
|
+
save if new_record? && association.stores_foreign_key?
|
|
333
|
+
doc
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Association
|
|
4
4
|
|
|
5
5
|
# Superclass for all objects that bind relations together.
|
|
6
|
-
|
|
6
|
+
module Bindable
|
|
7
7
|
include Threaded::Lifecycle
|
|
8
8
|
|
|
9
|
-
attr_reader :
|
|
9
|
+
attr_reader :_base, :_target, :_association
|
|
10
10
|
|
|
11
11
|
# Create the new binding.
|
|
12
12
|
#
|
|
13
13
|
# @example Initialize a binding.
|
|
14
|
-
# Binding.new(base, target,
|
|
14
|
+
# Binding.new(base, target, association)
|
|
15
15
|
#
|
|
16
16
|
# @param [ Document ] base The base of the binding.
|
|
17
17
|
# @param [ Document, Array<Document> ] target The target of the binding.
|
|
18
|
-
# @param [
|
|
18
|
+
# @param [ Association ] association The association metadata.
|
|
19
19
|
#
|
|
20
20
|
# @since 2.0.0.rc.1
|
|
21
|
-
def initialize(base, target,
|
|
22
|
-
@
|
|
21
|
+
def initialize(base, target, association)
|
|
22
|
+
@_base, @_target, @_association = base, target, association
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
# Execute the provided block inside a binding.
|
|
@@ -55,32 +55,12 @@ module Mongoid
|
|
|
55
55
|
#
|
|
56
56
|
# @since 3.0.0
|
|
57
57
|
def check_inverse!(doc)
|
|
58
|
-
|
|
59
|
-
!doc.respond_to?(metadata.foreign_key_setter)
|
|
58
|
+
unless _association.bindable?(doc)
|
|
60
59
|
raise Errors::InverseNotFound.new(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Check for problems with multiple inverse definitions.
|
|
70
|
-
#
|
|
71
|
-
# @api private
|
|
72
|
-
#
|
|
73
|
-
# @example Check for inverses errors.
|
|
74
|
-
# binding.check_inverses!(doc)
|
|
75
|
-
#
|
|
76
|
-
# @param [ Document ] doc The document to check.
|
|
77
|
-
#
|
|
78
|
-
# @since 3.0.0
|
|
79
|
-
def check_inverses!(doc)
|
|
80
|
-
inverses = metadata.inverses(doc)
|
|
81
|
-
if inverses.count > 1 && base.send(metadata.foreign_key).nil?
|
|
82
|
-
raise Errors::InvalidSetPolymorphicRelation.new(
|
|
83
|
-
metadata.name, base.class.name, target.class.name
|
|
60
|
+
_base.class,
|
|
61
|
+
_association.name,
|
|
62
|
+
doc.class,
|
|
63
|
+
_association.foreign_key
|
|
84
64
|
)
|
|
85
65
|
end
|
|
86
66
|
end
|
|
@@ -99,7 +79,7 @@ module Mongoid
|
|
|
99
79
|
# @since 3.0.0
|
|
100
80
|
def bind_foreign_key(keyed, id)
|
|
101
81
|
unless keyed.frozen?
|
|
102
|
-
keyed.you_must(
|
|
82
|
+
keyed.you_must(_association.foreign_key_setter, id)
|
|
103
83
|
end
|
|
104
84
|
end
|
|
105
85
|
|
|
@@ -116,8 +96,8 @@ module Mongoid
|
|
|
116
96
|
#
|
|
117
97
|
# @since 3.0.0
|
|
118
98
|
def bind_polymorphic_type(typed, name)
|
|
119
|
-
if
|
|
120
|
-
typed.you_must(
|
|
99
|
+
if _association.type
|
|
100
|
+
typed.you_must(_association.type_setter, name)
|
|
121
101
|
end
|
|
122
102
|
end
|
|
123
103
|
|
|
@@ -134,8 +114,8 @@ module Mongoid
|
|
|
134
114
|
#
|
|
135
115
|
# @since 3.0.0
|
|
136
116
|
def bind_polymorphic_inverse_type(typed, name)
|
|
137
|
-
if
|
|
138
|
-
typed.you_must(
|
|
117
|
+
if _association.inverse_type
|
|
118
|
+
typed.you_must(_association.inverse_type_setter, name)
|
|
139
119
|
end
|
|
140
120
|
end
|
|
141
121
|
|
|
@@ -152,8 +132,8 @@ module Mongoid
|
|
|
152
132
|
#
|
|
153
133
|
# @since 3.0.0
|
|
154
134
|
def bind_inverse(doc, inverse)
|
|
155
|
-
if doc.respond_to?(
|
|
156
|
-
doc.you_must(
|
|
135
|
+
if doc.respond_to?(_association.inverse_setter)
|
|
136
|
+
doc.you_must(_association.inverse_setter, inverse)
|
|
157
137
|
end
|
|
158
138
|
end
|
|
159
139
|
|
|
@@ -169,31 +149,31 @@ module Mongoid
|
|
|
169
149
|
# @since 3.0.0
|
|
170
150
|
def bind_from_relational_parent(doc)
|
|
171
151
|
check_inverse!(doc)
|
|
172
|
-
bind_foreign_key(doc, record_id(
|
|
173
|
-
bind_polymorphic_type(doc,
|
|
174
|
-
bind_inverse(doc,
|
|
152
|
+
bind_foreign_key(doc, record_id(_base))
|
|
153
|
+
bind_polymorphic_type(doc, _base.class.name)
|
|
154
|
+
bind_inverse(doc, _base)
|
|
175
155
|
end
|
|
176
156
|
|
|
177
|
-
def record_id(
|
|
178
|
-
|
|
157
|
+
def record_id(_base)
|
|
158
|
+
_base.__send__(_association.primary_key)
|
|
179
159
|
end
|
|
180
160
|
|
|
181
|
-
# Ensure that the
|
|
161
|
+
# Ensure that the association on the base is correct, for the cases
|
|
182
162
|
# where we have multiple belongs to definitions and were are setting
|
|
183
163
|
# different parents in memory in order.
|
|
184
164
|
#
|
|
185
165
|
# @api private
|
|
186
166
|
#
|
|
187
|
-
# @example Set the base
|
|
188
|
-
# binding.
|
|
167
|
+
# @example Set the base association.
|
|
168
|
+
# binding.set_base_association
|
|
189
169
|
#
|
|
190
|
-
# @return [ true, false ] If the
|
|
170
|
+
# @return [ true, false ] If the association changed.
|
|
191
171
|
#
|
|
192
172
|
# @since 2.4.4
|
|
193
|
-
def
|
|
194
|
-
|
|
195
|
-
if
|
|
196
|
-
|
|
173
|
+
def set_base_association
|
|
174
|
+
inverse_association = _association.inverse_association(_target)
|
|
175
|
+
if inverse_association != _association && !inverse_association.nil?
|
|
176
|
+
_base._association = inverse_association
|
|
197
177
|
end
|
|
198
178
|
end
|
|
199
179
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Mongoid
|
|
4
|
+
module Association
|
|
5
|
+
|
|
6
|
+
# This module is responsible for defining the build and create methods used
|
|
7
|
+
# in one to one relations.
|
|
8
|
+
#
|
|
9
|
+
# @example Methods that get created.
|
|
10
|
+
#
|
|
11
|
+
# class Person
|
|
12
|
+
# include Mongoid::Document
|
|
13
|
+
# embeds_one :name
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# # The following methods get created:
|
|
17
|
+
# person.build_name({ :first_name => "Durran" })
|
|
18
|
+
# person.create_name({ :first_name => "Durran" })
|
|
19
|
+
#
|
|
20
|
+
# @since 2.0.0.rc.1
|
|
21
|
+
module Builders
|
|
22
|
+
extend ActiveSupport::Concern
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
# Parse out the attributes and the options from the args passed to a
|
|
27
|
+
# build_ or create_ methods.
|
|
28
|
+
#
|
|
29
|
+
# @example Parse the args.
|
|
30
|
+
# doc.parse_args(:name => "Joe")
|
|
31
|
+
#
|
|
32
|
+
# @param [ Array ] args The arguments.
|
|
33
|
+
#
|
|
34
|
+
# @return [ Array<Hash> ] The attributes and options.
|
|
35
|
+
#
|
|
36
|
+
# @since 2.3.4
|
|
37
|
+
def parse_args(*args)
|
|
38
|
+
[ args.first || {}, args.size > 1 ? args[1] : {} ]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Defines a builder method. This is defined as #build_name.
|
|
42
|
+
#
|
|
43
|
+
# @example
|
|
44
|
+
# Person.define_builder!(association)
|
|
45
|
+
#
|
|
46
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
47
|
+
#
|
|
48
|
+
# @return [ Class ] The class being set up.
|
|
49
|
+
#
|
|
50
|
+
# @since 2.0.0.rc.1
|
|
51
|
+
def self.define_builder!(association)
|
|
52
|
+
association.inverse_class.tap do |klass|
|
|
53
|
+
klass.re_define_method("build_#{association.name}") do |*args|
|
|
54
|
+
attributes, _options = parse_args(*args)
|
|
55
|
+
document = Factory.build(association.relation_class, attributes)
|
|
56
|
+
_building do
|
|
57
|
+
child = send("#{association.name}=", document)
|
|
58
|
+
child.run_callbacks(:build)
|
|
59
|
+
child
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Defines a creator method. This is defined as #create_name.
|
|
66
|
+
# After the object is built it will immediately save.
|
|
67
|
+
#
|
|
68
|
+
# @example
|
|
69
|
+
# Person.define_creator!(association)
|
|
70
|
+
#
|
|
71
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
72
|
+
#
|
|
73
|
+
# @return [ Class ] The class being set up.
|
|
74
|
+
#
|
|
75
|
+
# @since 2.0.0.rc.1
|
|
76
|
+
def self.define_creator!(association)
|
|
77
|
+
association.inverse_class.tap do |klass|
|
|
78
|
+
klass.re_define_method("create_#{association.name}") do |*args|
|
|
79
|
+
attributes, _options = parse_args(*args)
|
|
80
|
+
document = Factory.build(association.relation_class, attributes)
|
|
81
|
+
doc = _assigning do
|
|
82
|
+
send("#{association.name}=", document)
|
|
83
|
+
end
|
|
84
|
+
doc.save
|
|
85
|
+
save if new_record? && association.stores_foreign_key?
|
|
86
|
+
doc
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|