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,127 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Nested
|
|
5
|
+
class One
|
|
6
|
+
include Buildable
|
|
7
|
+
|
|
8
|
+
attr_accessor :destroy
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Builds the relation depending on the attributes and the options
|
|
12
|
+
# passed to the macro.
|
|
13
|
+
#
|
|
14
|
+
# @example Build a 1-1 nested document.
|
|
15
|
+
# one.build(person, as: :admin)
|
|
16
|
+
#
|
|
17
|
+
# @note This attempts to perform 3 operations, either one of an update of
|
|
18
|
+
# the existing relation, a replacement of the relation with a new
|
|
19
|
+
# document, or a removal of the relation.
|
|
20
|
+
#
|
|
21
|
+
# @param [ Document ] parent The parent document.
|
|
22
|
+
#
|
|
23
|
+
# @return [ Document ] The built document.
|
|
24
|
+
#
|
|
25
|
+
# @since 2.0.0
|
|
26
|
+
def build(parent)
|
|
27
|
+
return if reject?(parent, attributes)
|
|
28
|
+
@existing = parent.send(association.name)
|
|
29
|
+
if update?
|
|
30
|
+
attributes.delete_id
|
|
31
|
+
existing.assign_attributes(attributes)
|
|
32
|
+
elsif replace?
|
|
33
|
+
parent.send(association.setter, Factory.build(@class_name, attributes))
|
|
34
|
+
elsif delete?
|
|
35
|
+
parent.send(association.setter, nil)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Create the new builder for nested attributes on one-to-one
|
|
40
|
+
# relations.
|
|
41
|
+
#
|
|
42
|
+
# @example Instantiate the builder.
|
|
43
|
+
# One.new(association, attributes)
|
|
44
|
+
#
|
|
45
|
+
# @param [ Association ] association The association metadata.
|
|
46
|
+
# @param [ Hash ] attributes The attributes hash to attempt to set.
|
|
47
|
+
# @param [ Hash ] options The options defined.
|
|
48
|
+
#
|
|
49
|
+
# @since 2.0.0
|
|
50
|
+
def initialize(association, attributes, options)
|
|
51
|
+
@attributes = attributes.with_indifferent_access
|
|
52
|
+
@association = association
|
|
53
|
+
@options = options
|
|
54
|
+
@class_name = options[:class_name] ? options[:class_name].constantize : association.klass
|
|
55
|
+
@destroy = @attributes.delete(:_destroy)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
# Is the id in the attribtues acceptable for allowing an update to
|
|
61
|
+
# the existing relation?
|
|
62
|
+
#
|
|
63
|
+
# @api private
|
|
64
|
+
#
|
|
65
|
+
# @example Is the id acceptable?
|
|
66
|
+
# one.acceptable_id?
|
|
67
|
+
#
|
|
68
|
+
# @return [ true, false ] If the id part of the logic will allow an update.
|
|
69
|
+
#
|
|
70
|
+
# @since 2.0.0
|
|
71
|
+
def acceptable_id?
|
|
72
|
+
id = convert_id(existing.class, attributes[:id])
|
|
73
|
+
existing._id == id || id.nil? || (existing._id != id && update_only?)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Can the existing relation be deleted?
|
|
77
|
+
#
|
|
78
|
+
# @example Can the existing object be deleted?
|
|
79
|
+
# one.delete?
|
|
80
|
+
#
|
|
81
|
+
# @return [ true, false ] If the relation should be deleted.
|
|
82
|
+
#
|
|
83
|
+
# @since 2.0.0
|
|
84
|
+
def delete?
|
|
85
|
+
destroyable? && !attributes[:id].nil?
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Can the existing relation potentially be destroyed?
|
|
89
|
+
#
|
|
90
|
+
# @example Is the object destroyable?
|
|
91
|
+
# one.destroyable?({ :_destroy => "1" })
|
|
92
|
+
#
|
|
93
|
+
# @return [ true, false ] If the relation can potentially be
|
|
94
|
+
# destroyed.
|
|
95
|
+
#
|
|
96
|
+
# @since 2.0.0
|
|
97
|
+
def destroyable?
|
|
98
|
+
Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Is the document to be replaced?
|
|
102
|
+
#
|
|
103
|
+
# @example Is the document to be replaced?
|
|
104
|
+
# one.replace?
|
|
105
|
+
#
|
|
106
|
+
# @return [ true, false ] If the document should be replaced.
|
|
107
|
+
#
|
|
108
|
+
# @since 2.0.0
|
|
109
|
+
def replace?
|
|
110
|
+
!existing && !destroyable? && !attributes.blank?
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Should the document be updated?
|
|
114
|
+
#
|
|
115
|
+
# @example Should the document be updated?
|
|
116
|
+
# one.update?
|
|
117
|
+
#
|
|
118
|
+
# @return [ true, false ] If the object should have its attributes updated.
|
|
119
|
+
#
|
|
120
|
+
# @since 2.0.0
|
|
121
|
+
def update?
|
|
122
|
+
existing && !destroyable? && acceptable_id?
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'mongoid/association/nested/nested_buildable'
|
|
2
|
+
require 'mongoid/association/nested/many'
|
|
3
|
+
require 'mongoid/association/nested/one'
|
|
4
|
+
|
|
5
|
+
module Mongoid
|
|
6
|
+
module Association
|
|
7
|
+
module Nested
|
|
8
|
+
|
|
9
|
+
# The flags indicating that a relation can be destroyed.
|
|
10
|
+
#
|
|
11
|
+
# @since 7.0
|
|
12
|
+
DESTROY_FLAGS = [1, "1", true, "true"].freeze
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
-
module
|
|
3
|
+
module Association
|
|
4
4
|
|
|
5
5
|
# This is the superclass for one to one relations and defines the common
|
|
6
6
|
# behaviour or those proxies.
|
|
7
|
-
class One < Proxy
|
|
7
|
+
class One < Association::Proxy
|
|
8
8
|
|
|
9
9
|
# Clear this relation - same as calling #delete on the document.
|
|
10
10
|
#
|
|
@@ -15,7 +15,7 @@ module Mongoid
|
|
|
15
15
|
#
|
|
16
16
|
# @since 3.0.0
|
|
17
17
|
def clear
|
|
18
|
-
|
|
18
|
+
_target.delete
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# Get all the documents in the relation that are loaded into memory.
|
|
@@ -27,7 +27,7 @@ module Mongoid
|
|
|
27
27
|
#
|
|
28
28
|
# @since 2.1.0
|
|
29
29
|
def in_memory
|
|
30
|
-
[
|
|
30
|
+
[ _target ]
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# Since method_missing is overridden we should override this as well.
|
|
@@ -41,7 +41,7 @@ module Mongoid
|
|
|
41
41
|
#
|
|
42
42
|
# @since 2.1.8
|
|
43
43
|
def respond_to?(name, include_private = false)
|
|
44
|
-
|
|
44
|
+
_target.respond_to?(name, include_private) || super
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
# Evolve the proxy document into an object id.
|
|
@@ -53,7 +53,7 @@ module Mongoid
|
|
|
53
53
|
#
|
|
54
54
|
# @since 4.0.0
|
|
55
55
|
def __evolve_object_id__
|
|
56
|
-
|
|
56
|
+
_target._id
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
end
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
|
|
4
|
+
module Options
|
|
5
|
+
|
|
6
|
+
# Returns the name of the parent to a polymorphic child.
|
|
7
|
+
#
|
|
8
|
+
# @return [ String, Symbol ] The name.
|
|
9
|
+
#
|
|
10
|
+
# @since 7.0
|
|
11
|
+
def as
|
|
12
|
+
@options[:as]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Specify what happens to the associated object when the owner is destroyed.
|
|
16
|
+
#
|
|
17
|
+
# @return [ String ] The dependent option.
|
|
18
|
+
#
|
|
19
|
+
# @since 7.0
|
|
20
|
+
def dependent
|
|
21
|
+
@options[:dependent]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The custom sorting options on the relation.
|
|
25
|
+
#
|
|
26
|
+
# @return [ Criteria::Queryable::Key ] The custom sorting options.
|
|
27
|
+
#
|
|
28
|
+
# @since 7.0
|
|
29
|
+
def order
|
|
30
|
+
@options[:order]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Whether to index the primary or foreign key field.
|
|
34
|
+
#
|
|
35
|
+
# @return [ true, false ]
|
|
36
|
+
#
|
|
37
|
+
# @since 7.0
|
|
38
|
+
def indexed?
|
|
39
|
+
@indexed ||= !!@options[:index]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Whether the association is autobuilding.
|
|
43
|
+
#
|
|
44
|
+
# @return [ true, false ]
|
|
45
|
+
#
|
|
46
|
+
# @since 7.0
|
|
47
|
+
def autobuilding?
|
|
48
|
+
!!@options[:autobuild]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Is the relation cyclic.
|
|
52
|
+
#
|
|
53
|
+
# @return [ true, false ] Whether the relation is cyclic.
|
|
54
|
+
#
|
|
55
|
+
# @since 7.0
|
|
56
|
+
def cyclic?
|
|
57
|
+
!!@options[:cyclic]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# The name the owning object uses to refer to this relation.
|
|
61
|
+
#
|
|
62
|
+
# @return [ String ] The inverse_of option.
|
|
63
|
+
#
|
|
64
|
+
# @since 7.0
|
|
65
|
+
def inverse_of
|
|
66
|
+
@options[:inverse_of]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Mongoid assumes that the field used to hold the primary key of the association is id.
|
|
70
|
+
# You can override this and explicitly specify the primary key with the :primary_key option.
|
|
71
|
+
#
|
|
72
|
+
# @return [ Symbol, String ] The primary key.
|
|
73
|
+
#
|
|
74
|
+
# @since 7.0
|
|
75
|
+
def primary_key
|
|
76
|
+
@primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Options to save any loaded members and destroy members that are marked for destruction
|
|
80
|
+
# when the parent object is saved.
|
|
81
|
+
#
|
|
82
|
+
# @return [ true, false ] The autosave option.
|
|
83
|
+
#
|
|
84
|
+
# @since 7.0
|
|
85
|
+
def autosave
|
|
86
|
+
!!@options[:autosave]
|
|
87
|
+
end
|
|
88
|
+
alias :autosave? :autosave
|
|
89
|
+
|
|
90
|
+
# Whether the association is counter-cached.
|
|
91
|
+
#
|
|
92
|
+
# @return [ true, false ]
|
|
93
|
+
#
|
|
94
|
+
# @since 7.0
|
|
95
|
+
def counter_cached?
|
|
96
|
+
!!@options[:counter_cache]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Whether this association is polymorphic.
|
|
100
|
+
#
|
|
101
|
+
# @return [ true, false ] Whether the association is polymorphic.
|
|
102
|
+
#
|
|
103
|
+
# @since 7.0
|
|
104
|
+
def polymorphic?; false; end
|
|
105
|
+
|
|
106
|
+
# Whether the relation has callbacks cascaded down from the parent.
|
|
107
|
+
#
|
|
108
|
+
# @return [ true, false ] Whether callbacks are cascaded.
|
|
109
|
+
#
|
|
110
|
+
# @since 7.0
|
|
111
|
+
def cascading_callbacks?
|
|
112
|
+
!!@options[:cascade_callbacks]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# The store_as option.
|
|
116
|
+
#
|
|
117
|
+
# @return [ nil ] Default is nil.
|
|
118
|
+
#
|
|
119
|
+
# @since 7.0
|
|
120
|
+
def store_as; end
|
|
121
|
+
|
|
122
|
+
# Whether the association has forced nil inverse (So no foreign keys are saved).
|
|
123
|
+
#
|
|
124
|
+
# @return [ false ] Default is false.
|
|
125
|
+
#
|
|
126
|
+
# @since 7.0
|
|
127
|
+
def forced_nil_inverse?; false; end
|
|
128
|
+
|
|
129
|
+
# The field for saving the associated object's type.
|
|
130
|
+
#
|
|
131
|
+
# @return [ nil ] Default is nil.
|
|
132
|
+
#
|
|
133
|
+
# @since 7.0
|
|
134
|
+
def type; end
|
|
135
|
+
|
|
136
|
+
# The field for saving the associated object's type.
|
|
137
|
+
#
|
|
138
|
+
# @return [ nil ] Default is nil.
|
|
139
|
+
#
|
|
140
|
+
# @since 7.0
|
|
141
|
+
def touch_field
|
|
142
|
+
@touch_field ||= options[:touch] if (options[:touch].is_a?(String) || options[:touch].is_a?(Symbol))
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
def touchable?
|
|
148
|
+
!!@options[:touch]
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "mongoid/
|
|
2
|
+
require "mongoid/association/marshalable"
|
|
3
3
|
|
|
4
4
|
module Mongoid
|
|
5
|
-
module
|
|
5
|
+
module Association
|
|
6
6
|
|
|
7
7
|
# This class is the superclass for all relation proxy objects, and contains
|
|
8
8
|
# common behaviour for all of them.
|
|
@@ -18,29 +18,28 @@ module Mongoid
|
|
|
18
18
|
include Threaded::Lifecycle
|
|
19
19
|
include Marshalable
|
|
20
20
|
|
|
21
|
-
attr_accessor :
|
|
22
|
-
alias :relation_metadata :__metadata
|
|
21
|
+
attr_accessor :_base, :_association, :_target
|
|
23
22
|
|
|
24
23
|
# Backwards compatibility with Mongoid beta releases.
|
|
25
|
-
delegate :foreign_key, :inverse_foreign_key, to: :
|
|
24
|
+
delegate :foreign_key, :inverse_foreign_key, to: :_association
|
|
26
25
|
delegate :bind_one, :unbind_one, to: :binding
|
|
27
|
-
delegate :collection_name, to: :
|
|
26
|
+
delegate :collection_name, to: :_base
|
|
28
27
|
|
|
29
|
-
# Convenience for setting the target and the metadata properties since
|
|
28
|
+
# Convenience for setting the target and the association metadata properties since
|
|
30
29
|
# all proxies will need to do this.
|
|
31
30
|
#
|
|
32
31
|
# @example Initialize the proxy.
|
|
33
|
-
# proxy.init(person, name,
|
|
32
|
+
# proxy.init(person, name, association)
|
|
34
33
|
#
|
|
35
34
|
# @param [ Document ] base The base document on the proxy.
|
|
36
35
|
# @param [ Document, Array<Document> ] target The target of the proxy.
|
|
37
|
-
# @param [
|
|
36
|
+
# @param [ Association ] association The association metadata.
|
|
38
37
|
#
|
|
39
38
|
# @since 2.0.0.rc.1
|
|
40
|
-
def init(base, target,
|
|
41
|
-
@
|
|
39
|
+
def init(base, target, association)
|
|
40
|
+
@_base, @_target, @_association = base, target, association
|
|
42
41
|
yield(self) if block_given?
|
|
43
|
-
extend_proxies(
|
|
42
|
+
extend_proxies(association.extension) if association.extension
|
|
44
43
|
end
|
|
45
44
|
|
|
46
45
|
# Allow extension to be an array and extend each module
|
|
@@ -48,7 +47,7 @@ module Mongoid
|
|
|
48
47
|
extension.flatten.each {|ext| extend_proxy(ext) }
|
|
49
48
|
end
|
|
50
49
|
|
|
51
|
-
# Get the class from the
|
|
50
|
+
# Get the class from the association, or return nil if no association present.
|
|
52
51
|
#
|
|
53
52
|
# @example Get the class.
|
|
54
53
|
# proxy.klass
|
|
@@ -57,7 +56,7 @@ module Mongoid
|
|
|
57
56
|
#
|
|
58
57
|
# @since 3.0.15
|
|
59
58
|
def klass
|
|
60
|
-
|
|
59
|
+
_association ? _association.klass : nil
|
|
61
60
|
end
|
|
62
61
|
|
|
63
62
|
# Resets the criteria inside the relation proxy. Used by many to many
|
|
@@ -68,7 +67,7 @@ module Mongoid
|
|
|
68
67
|
#
|
|
69
68
|
# @since 3.0.14
|
|
70
69
|
def reset_unloaded
|
|
71
|
-
|
|
70
|
+
_target.reset_unloaded(criteria)
|
|
72
71
|
end
|
|
73
72
|
|
|
74
73
|
# The default substitutable object for a relation proxy is the clone of
|
|
@@ -81,7 +80,7 @@ module Mongoid
|
|
|
81
80
|
#
|
|
82
81
|
# @since 2.1.6
|
|
83
82
|
def substitutable
|
|
84
|
-
|
|
83
|
+
_target
|
|
85
84
|
end
|
|
86
85
|
|
|
87
86
|
protected
|
|
@@ -95,20 +94,20 @@ module Mongoid
|
|
|
95
94
|
#
|
|
96
95
|
# @since 2.0.0
|
|
97
96
|
def collection
|
|
98
|
-
root =
|
|
97
|
+
root = _base._root
|
|
99
98
|
root.collection unless root.embedded?
|
|
100
99
|
end
|
|
101
100
|
|
|
102
|
-
# Takes the supplied document and sets the
|
|
101
|
+
# Takes the supplied document and sets the association on it.
|
|
103
102
|
#
|
|
104
|
-
# @example Set the metadata.
|
|
103
|
+
# @example Set the association metadata.
|
|
105
104
|
# proxt.characterize_one(name)
|
|
106
105
|
#
|
|
107
106
|
# @param [ Document ] document The document to set on.
|
|
108
107
|
#
|
|
109
108
|
# @since 2.0.0.rc.4
|
|
110
109
|
def characterize_one(document)
|
|
111
|
-
document.
|
|
110
|
+
document._association = _association unless document._association
|
|
112
111
|
end
|
|
113
112
|
|
|
114
113
|
# Default behavior of method missing should be to delegate all calls
|
|
@@ -118,7 +117,7 @@ module Mongoid
|
|
|
118
117
|
# @param [ Array ] args The arguments passed to the method.
|
|
119
118
|
#
|
|
120
119
|
def method_missing(name, *args, &block)
|
|
121
|
-
|
|
120
|
+
_target.send(name, *args, &block)
|
|
122
121
|
end
|
|
123
122
|
|
|
124
123
|
# When the base document illegally references an embedded document this
|
|
@@ -131,7 +130,7 @@ module Mongoid
|
|
|
131
130
|
#
|
|
132
131
|
# @since 2.0.0
|
|
133
132
|
def raise_mixed
|
|
134
|
-
raise Errors::MixedRelations.new(
|
|
133
|
+
raise Errors::MixedRelations.new(_base.class, _association.klass)
|
|
135
134
|
end
|
|
136
135
|
|
|
137
136
|
# When the base is not yet saved and the user calls create or create!
|
|
@@ -146,30 +145,7 @@ module Mongoid
|
|
|
146
145
|
#
|
|
147
146
|
# @since 2.0.0.rc.6
|
|
148
147
|
def raise_unsaved(doc)
|
|
149
|
-
raise Errors::UnsavedDocument.new(
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# Return the name of defined callback method
|
|
153
|
-
#
|
|
154
|
-
# @example returns the before_add callback method name
|
|
155
|
-
# callback_method(:before_add)
|
|
156
|
-
#
|
|
157
|
-
# @param [ Symbol ] callback_name Which callback
|
|
158
|
-
#
|
|
159
|
-
# @return [ Array ] with callback methods to be executed, the array may have symbols and Procs
|
|
160
|
-
#
|
|
161
|
-
# @since 3.1.0
|
|
162
|
-
def callback_method(callback_name)
|
|
163
|
-
methods = []
|
|
164
|
-
metadata = __metadata[callback_name]
|
|
165
|
-
if metadata
|
|
166
|
-
if metadata.is_a?(Array)
|
|
167
|
-
methods.concat(metadata)
|
|
168
|
-
else
|
|
169
|
-
methods << metadata
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
methods
|
|
148
|
+
raise Errors::UnsavedDocument.new(_base, doc)
|
|
173
149
|
end
|
|
174
150
|
|
|
175
151
|
# Executes a callback method
|
|
@@ -181,14 +157,11 @@ module Mongoid
|
|
|
181
157
|
#
|
|
182
158
|
# @since 3.1.0
|
|
183
159
|
def execute_callback(callback, doc)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
else
|
|
190
|
-
base.send c, doc
|
|
191
|
-
end
|
|
160
|
+
_association.get_callbacks(callback).each do |c|
|
|
161
|
+
if c.is_a? Proc
|
|
162
|
+
c.call(_base, doc)
|
|
163
|
+
else
|
|
164
|
+
_base.send c, doc
|
|
192
165
|
end
|
|
193
166
|
end
|
|
194
167
|
end
|
|
@@ -198,16 +171,16 @@ module Mongoid
|
|
|
198
171
|
# Apply ordering to the criteria if it was defined on the relation.
|
|
199
172
|
#
|
|
200
173
|
# @example Apply the ordering.
|
|
201
|
-
# Proxy.apply_ordering(criteria,
|
|
174
|
+
# Proxy.apply_ordering(criteria, association)
|
|
202
175
|
#
|
|
203
176
|
# @param [ Criteria ] criteria The criteria to modify.
|
|
204
|
-
# @param [
|
|
177
|
+
# @param [ Association ] association The association metadata.
|
|
205
178
|
#
|
|
206
179
|
# @return [ Criteria ] The ordered criteria.
|
|
207
180
|
#
|
|
208
181
|
# @since 3.0.6
|
|
209
|
-
def apply_ordering(criteria,
|
|
210
|
-
|
|
182
|
+
def apply_ordering(criteria, association)
|
|
183
|
+
association.order ? criteria.order_by(association.order) : criteria
|
|
211
184
|
end
|
|
212
185
|
end
|
|
213
186
|
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Association
|
|
3
|
+
module Referenced
|
|
4
|
+
|
|
5
|
+
module AutoSave
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
# Used to prevent infinite loops in associated autosaves.
|
|
9
|
+
#
|
|
10
|
+
# @example Is the document autosaved?
|
|
11
|
+
# document.autosaved?
|
|
12
|
+
#
|
|
13
|
+
# @return [ true, false ] Has the document already been autosaved?
|
|
14
|
+
#
|
|
15
|
+
# @since 3.0.0
|
|
16
|
+
def autosaved?
|
|
17
|
+
Threaded.autosaved?(self)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Begin the associated autosave.
|
|
21
|
+
#
|
|
22
|
+
# @example Begin autosave.
|
|
23
|
+
# document.__autosaving__
|
|
24
|
+
#
|
|
25
|
+
# @since 3.1.3
|
|
26
|
+
def __autosaving__
|
|
27
|
+
Threaded.begin_autosave(self)
|
|
28
|
+
yield
|
|
29
|
+
ensure
|
|
30
|
+
Threaded.exit_autosave(self)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Check if there is changes for auto-saving
|
|
34
|
+
#
|
|
35
|
+
# @example Return true if there is changes on self or in
|
|
36
|
+
# autosaved relations.
|
|
37
|
+
# document.changed_for_autosave?
|
|
38
|
+
#
|
|
39
|
+
# @since 3.1.3
|
|
40
|
+
def changed_for_autosave?(doc)
|
|
41
|
+
doc.new_record? || doc.changed? || doc.marked_for_destruction?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Define the autosave method on an association's owning class for
|
|
45
|
+
# an associated object.
|
|
46
|
+
#
|
|
47
|
+
# @example Define the autosave method:
|
|
48
|
+
# Association::Referenced::Autosave.define_autosave!(association)
|
|
49
|
+
#
|
|
50
|
+
# @param [ Association ] association The association for which autosaving is enabled.
|
|
51
|
+
#
|
|
52
|
+
# @return [ Class ] The association's owner class.
|
|
53
|
+
#
|
|
54
|
+
# @since 7.0
|
|
55
|
+
def self.define_autosave!(association)
|
|
56
|
+
association.inverse_class.tap do |klass|
|
|
57
|
+
save_method = :"autosave_documents_for_#{association.name}"
|
|
58
|
+
klass.send(:define_method, save_method) do
|
|
59
|
+
if before_callback_halted?
|
|
60
|
+
self.before_callback_halted = false
|
|
61
|
+
else
|
|
62
|
+
__autosaving__ do
|
|
63
|
+
if relation = ivar(association.name)
|
|
64
|
+
Array(relation).each do |doc|
|
|
65
|
+
doc.with(persistence_context) do |d|
|
|
66
|
+
d.save
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
klass.after_save save_method, unless: :autosaved?
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|