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
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module NestedAttributes
|
|
6
|
-
class Many < NestedBuilder
|
|
7
|
-
|
|
8
|
-
# Builds the relation depending on the attributes and the options
|
|
9
|
-
# passed to the macro.
|
|
10
|
-
#
|
|
11
|
-
# This attempts to perform 3 operations, either one of an update of
|
|
12
|
-
# the existing relation, a replacement of the relation with a new
|
|
13
|
-
# document, or a removal of the relation.
|
|
14
|
-
#
|
|
15
|
-
# @example Build the nested attrs.
|
|
16
|
-
# many.build(person)
|
|
17
|
-
#
|
|
18
|
-
# @param [ Document ] parent The parent document of the relation.
|
|
19
|
-
#
|
|
20
|
-
# @return [ Array ] The attributes.
|
|
21
|
-
def build(parent, options = {})
|
|
22
|
-
@existing = parent.send(metadata.name)
|
|
23
|
-
if over_limit?(attributes)
|
|
24
|
-
raise Errors::TooManyNestedAttributeRecords.new(existing, options[:limit])
|
|
25
|
-
end
|
|
26
|
-
attributes.each do |attrs|
|
|
27
|
-
if attrs.is_a?(::Hash)
|
|
28
|
-
process_attributes(parent, attrs.with_indifferent_access)
|
|
29
|
-
else
|
|
30
|
-
process_attributes(parent, attrs[1].with_indifferent_access)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# Create the new builder for nested attributes on one-to-many
|
|
36
|
-
# relations.
|
|
37
|
-
#
|
|
38
|
-
# @example Initialize the builder.
|
|
39
|
-
# One.new(metadata, attributes, options)
|
|
40
|
-
#
|
|
41
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
42
|
-
# @param [ Hash ] attributes The attributes hash to attempt to set.
|
|
43
|
-
# @param [ Hash ] options The options defined.
|
|
44
|
-
def initialize(metadata, attributes, options = {})
|
|
45
|
-
if attributes.respond_to?(:with_indifferent_access)
|
|
46
|
-
@attributes = attributes.with_indifferent_access.sort do |a, b|
|
|
47
|
-
a[0].to_i <=> b[0].to_i
|
|
48
|
-
end
|
|
49
|
-
else
|
|
50
|
-
@attributes = attributes
|
|
51
|
-
end
|
|
52
|
-
@metadata = metadata
|
|
53
|
-
@options = options
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
private
|
|
57
|
-
|
|
58
|
-
# Can the existing relation potentially be deleted?
|
|
59
|
-
#
|
|
60
|
-
# @example Is the document destroyable?
|
|
61
|
-
# destroyable?({ :_destroy => "1" })
|
|
62
|
-
#
|
|
63
|
-
# @param [ Hash ] attributes The attributes to pull the flag from.
|
|
64
|
-
#
|
|
65
|
-
# @return [ true, false ] If the relation can potentially be deleted.
|
|
66
|
-
def destroyable?(attributes)
|
|
67
|
-
destroy = attributes.delete(:_destroy)
|
|
68
|
-
[ 1, "1", true, "true" ].include?(destroy) && allow_destroy?
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Are the supplied attributes of greater number than the supplied
|
|
72
|
-
# limit?
|
|
73
|
-
#
|
|
74
|
-
# @example Are we over the set limit?
|
|
75
|
-
# builder.over_limit?({ "street" => "Bond" })
|
|
76
|
-
#
|
|
77
|
-
# @param [ Hash ] attributes The attributes being set.
|
|
78
|
-
#
|
|
79
|
-
# @return [ true, false ] If the attributes exceed the limit.
|
|
80
|
-
def over_limit?(attributes)
|
|
81
|
-
limit = options[:limit]
|
|
82
|
-
limit ? attributes.size > limit : false
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# Process each set of attributes one at a time for each potential
|
|
86
|
-
# new, existing, or ignored document.
|
|
87
|
-
#
|
|
88
|
-
# @api private
|
|
89
|
-
#
|
|
90
|
-
# @example Process the attributes
|
|
91
|
-
# builder.process_attributes({ "id" => 1, "street" => "Bond" })
|
|
92
|
-
#
|
|
93
|
-
# @param [ Document ] parent The parent document.
|
|
94
|
-
# @param [ Hash ] attrs The single document attributes to process.
|
|
95
|
-
#
|
|
96
|
-
# @since 2.0.0
|
|
97
|
-
def process_attributes(parent, attrs)
|
|
98
|
-
return if reject?(parent, attrs)
|
|
99
|
-
if id = attrs.extract_id
|
|
100
|
-
update_nested_relation(parent, id, attrs)
|
|
101
|
-
else
|
|
102
|
-
existing.push(Factory.build(metadata.klass, attrs)) unless destroyable?(attrs)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
# Destroy the child document, needs to do some checking for embedded
|
|
107
|
-
# relations and delay the destroy in case parent validation fails.
|
|
108
|
-
#
|
|
109
|
-
# @api private
|
|
110
|
-
#
|
|
111
|
-
# @example Destroy the child.
|
|
112
|
-
# builder.destroy(parent, relation, doc)
|
|
113
|
-
#
|
|
114
|
-
# @param [ Document ] parent The parent document.
|
|
115
|
-
# @param [ Proxy ] relation The relation proxy.
|
|
116
|
-
# @param [ Document ] doc The doc to destroy.
|
|
117
|
-
#
|
|
118
|
-
# @since 3.0.10
|
|
119
|
-
def destroy(parent, relation, doc)
|
|
120
|
-
doc.flagged_for_destroy = true
|
|
121
|
-
if !doc.embedded? || parent.new_record?
|
|
122
|
-
destroy_document(relation, doc)
|
|
123
|
-
else
|
|
124
|
-
parent.flagged_destroys.push(->{ destroy_document(relation, doc) })
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# Destroy the document.
|
|
129
|
-
#
|
|
130
|
-
# @api private
|
|
131
|
-
#
|
|
132
|
-
# @example Destroy the document.
|
|
133
|
-
# builder.destroy_document(relation, doc)
|
|
134
|
-
#
|
|
135
|
-
# @param [ Proxy ] relation The relation proxy.
|
|
136
|
-
# @param [ Document ] doc The document to delete.
|
|
137
|
-
#
|
|
138
|
-
# @since 3.0.10
|
|
139
|
-
def destroy_document(relation, doc)
|
|
140
|
-
relation.delete(doc)
|
|
141
|
-
doc.destroy unless doc.embedded? || doc.destroyed?
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Update the document.
|
|
145
|
-
#
|
|
146
|
-
# @api private
|
|
147
|
-
#
|
|
148
|
-
# @example Update the document.
|
|
149
|
-
# builder.update_document(doc, {}, options)
|
|
150
|
-
#
|
|
151
|
-
# @param [ Document ] doc The document to update.
|
|
152
|
-
# @param [ Hash ] attrs The attributes.
|
|
153
|
-
#
|
|
154
|
-
# @since 3.0.10
|
|
155
|
-
def update_document(doc, attrs)
|
|
156
|
-
attrs.delete_id
|
|
157
|
-
if metadata.embedded?
|
|
158
|
-
doc.assign_attributes(attrs)
|
|
159
|
-
else
|
|
160
|
-
doc.update_attributes(attrs)
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# Update nested relation.
|
|
165
|
-
#
|
|
166
|
-
# @api private
|
|
167
|
-
#
|
|
168
|
-
# @example Update nested relation.
|
|
169
|
-
# builder.update_nested_relation(parent, id, attrs)
|
|
170
|
-
#
|
|
171
|
-
# @param [ Document ] parent The parent document.
|
|
172
|
-
# @param [ String, BSON::ObjectId ] id of the related document.
|
|
173
|
-
# @param [ Hash ] attrs The single document attributes to process.
|
|
174
|
-
#
|
|
175
|
-
# @since 6.0.0
|
|
176
|
-
def update_nested_relation(parent, id, attrs)
|
|
177
|
-
first = existing.first
|
|
178
|
-
converted = first ? convert_id(first.class, id) : id
|
|
179
|
-
|
|
180
|
-
if existing.where(id: converted).exists?
|
|
181
|
-
# document exists in relation
|
|
182
|
-
doc = existing.find(converted)
|
|
183
|
-
if destroyable?(attrs)
|
|
184
|
-
destroy(parent, existing, doc)
|
|
185
|
-
else
|
|
186
|
-
update_document(doc, attrs)
|
|
187
|
-
end
|
|
188
|
-
else
|
|
189
|
-
# push existing document to relation
|
|
190
|
-
doc = existing.unscoped.find(converted)
|
|
191
|
-
update_document(doc, attrs)
|
|
192
|
-
existing.push(doc) unless destroyable?(attrs)
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
end
|
|
199
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
6
|
-
class In < Builder
|
|
7
|
-
|
|
8
|
-
# This builder either takes a foreign key and queries for the
|
|
9
|
-
# object or a document, where it will just return it.
|
|
10
|
-
#
|
|
11
|
-
# @example Build the document.
|
|
12
|
-
# Builder.new(meta, attrs).build
|
|
13
|
-
#
|
|
14
|
-
# @param [ String ] type The type of document to query for.
|
|
15
|
-
#
|
|
16
|
-
# @return [ Document ] A single document.
|
|
17
|
-
def build(type = nil)
|
|
18
|
-
return object unless query?
|
|
19
|
-
model = type ? type.constantize : metadata.klass
|
|
20
|
-
metadata.criteria(object, model).first
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
6
|
-
class Many < Builder
|
|
7
|
-
|
|
8
|
-
# This builder either takes a hash and queries for the
|
|
9
|
-
# object or an array of documents, where it will just return tem.
|
|
10
|
-
#
|
|
11
|
-
# @example Build the documents.
|
|
12
|
-
# Builder.new(meta, attrs).build
|
|
13
|
-
#
|
|
14
|
-
# @param [ String ] type The type of document to query for.
|
|
15
|
-
#
|
|
16
|
-
# @return [ Array<Document> ] The documents.
|
|
17
|
-
def build(type = nil)
|
|
18
|
-
return object unless query?
|
|
19
|
-
return [] if object.is_a?(Array)
|
|
20
|
-
metadata.criteria(Conversions.flag(object, metadata), base.class)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
6
|
-
class ManyToMany < Builder
|
|
7
|
-
|
|
8
|
-
# This builder either takes a hash and queries for the
|
|
9
|
-
# object or an array of documents, where it will just return them.
|
|
10
|
-
#
|
|
11
|
-
# @example Build the documents.
|
|
12
|
-
# Builder.new(meta, attrs).build
|
|
13
|
-
#
|
|
14
|
-
# @param [ String ] type The type of document to query for.
|
|
15
|
-
#
|
|
16
|
-
# @return [ Array<Document> ] The documents.
|
|
17
|
-
def build(type = nil)
|
|
18
|
-
return object.try(:dup) unless query?
|
|
19
|
-
ids = object || []
|
|
20
|
-
metadata.criteria(ids, base.class)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Do we need to perform a database query? It will be so if the object we
|
|
24
|
-
# have is not a document.
|
|
25
|
-
#
|
|
26
|
-
# @example Should we query the database?
|
|
27
|
-
# builder.query?
|
|
28
|
-
#
|
|
29
|
-
# @return [ true, false ] Whether a database query should happen.
|
|
30
|
-
#
|
|
31
|
-
# @since 2.0.0.rc.1
|
|
32
|
-
def query?
|
|
33
|
-
object.nil? || !object.first.is_a?(Mongoid::Document)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
6
|
-
class One < Builder
|
|
7
|
-
|
|
8
|
-
# This builder either takes an _id or an object and queries for the
|
|
9
|
-
# inverse side using the id or sets the object.
|
|
10
|
-
#
|
|
11
|
-
# @example Build the document.
|
|
12
|
-
# Builder.new(meta, attrs).build
|
|
13
|
-
#
|
|
14
|
-
# @param [ String ] type The type of document to query for.
|
|
15
|
-
#
|
|
16
|
-
# @return [ Document ] A single document.
|
|
17
|
-
def build(type = nil)
|
|
18
|
-
return object unless query?
|
|
19
|
-
return nil if base.new_record?
|
|
20
|
-
metadata.criteria(Conversions.flag(object, metadata), base.class).first
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/relations/builder"
|
|
3
|
-
require "mongoid/relations/nested_builder"
|
|
4
|
-
require "mongoid/relations/builders/embedded/in"
|
|
5
|
-
require "mongoid/relations/builders/embedded/many"
|
|
6
|
-
require "mongoid/relations/builders/embedded/one"
|
|
7
|
-
require "mongoid/relations/builders/nested_attributes/one"
|
|
8
|
-
require "mongoid/relations/builders/nested_attributes/many"
|
|
9
|
-
require "mongoid/relations/builders/referenced/in"
|
|
10
|
-
require "mongoid/relations/builders/referenced/many"
|
|
11
|
-
require "mongoid/relations/builders/referenced/many_to_many"
|
|
12
|
-
require "mongoid/relations/builders/referenced/one"
|
|
13
|
-
|
|
14
|
-
module Mongoid
|
|
15
|
-
module Relations
|
|
16
|
-
|
|
17
|
-
# This module is responsible for defining the build and create methods used
|
|
18
|
-
# in one to one relations.
|
|
19
|
-
#
|
|
20
|
-
# @example Methods that get created.
|
|
21
|
-
#
|
|
22
|
-
# class Person
|
|
23
|
-
# include Mongoid::Document
|
|
24
|
-
# embeds_one :name
|
|
25
|
-
# end
|
|
26
|
-
#
|
|
27
|
-
# # The following methods get created:
|
|
28
|
-
# person.build_name({ :first_name => "Durran" })
|
|
29
|
-
# person.create_name({ :first_name => "Durran" })
|
|
30
|
-
#
|
|
31
|
-
# @since 2.0.0.rc.1
|
|
32
|
-
module Builders
|
|
33
|
-
extend ActiveSupport::Concern
|
|
34
|
-
|
|
35
|
-
private
|
|
36
|
-
|
|
37
|
-
# Parse out the attributes and the options from the args passed to a
|
|
38
|
-
# build_ or create_ methods.
|
|
39
|
-
#
|
|
40
|
-
# @example Parse the args.
|
|
41
|
-
# doc.parse_args(:name => "Joe")
|
|
42
|
-
#
|
|
43
|
-
# @param [ Array ] args The arguments.
|
|
44
|
-
#
|
|
45
|
-
# @return [ Array<Hash> ] The attributes and options.
|
|
46
|
-
#
|
|
47
|
-
# @since 2.3.4
|
|
48
|
-
def parse_args(*args)
|
|
49
|
-
[ args.first || {}, args.size > 1 ? args[1] : {} ]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
module ClassMethods
|
|
53
|
-
|
|
54
|
-
# Defines a builder method for an embeds_one relation. This is
|
|
55
|
-
# defined as #build_name.
|
|
56
|
-
#
|
|
57
|
-
# @example
|
|
58
|
-
# Person.builder("name")
|
|
59
|
-
#
|
|
60
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
61
|
-
#
|
|
62
|
-
# @return [ Class ] The class being set up.
|
|
63
|
-
#
|
|
64
|
-
# @since 2.0.0.rc.1
|
|
65
|
-
def builder(name, metadata)
|
|
66
|
-
re_define_method("build_#{name}") do |*args|
|
|
67
|
-
attributes, _options = parse_args(*args)
|
|
68
|
-
document = Factory.build(metadata.klass, attributes)
|
|
69
|
-
_building do
|
|
70
|
-
child = send("#{name}=", document)
|
|
71
|
-
child.run_callbacks(:build)
|
|
72
|
-
child
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
self
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Defines a creator method for an embeds_one relation. This is
|
|
79
|
-
# defined as #create_name. After the object is built it will
|
|
80
|
-
# immediately save.
|
|
81
|
-
#
|
|
82
|
-
# @example
|
|
83
|
-
# Person.creator("name")
|
|
84
|
-
#
|
|
85
|
-
# @param [ String, Symbol ] name The name of the relation.
|
|
86
|
-
#
|
|
87
|
-
# @return [ Class ] The class being set up.
|
|
88
|
-
#
|
|
89
|
-
# @since 2.0.0.rc.1
|
|
90
|
-
def creator(name, metadata)
|
|
91
|
-
re_define_method("create_#{name}") do |*args|
|
|
92
|
-
attributes, _options = parse_args(*args)
|
|
93
|
-
document = Factory.build(metadata.klass, attributes)
|
|
94
|
-
doc = _assigning do
|
|
95
|
-
send("#{name}=", document)
|
|
96
|
-
end
|
|
97
|
-
doc.save
|
|
98
|
-
save if new_record? && metadata.stores_foreign_key?
|
|
99
|
-
doc
|
|
100
|
-
end
|
|
101
|
-
self
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Cascading
|
|
5
|
-
class Delete
|
|
6
|
-
|
|
7
|
-
attr_accessor :document, :relation, :metadata
|
|
8
|
-
|
|
9
|
-
# Initialize the new cascade strategy, which will set up the relation
|
|
10
|
-
# and the metadata.
|
|
11
|
-
#
|
|
12
|
-
# @example Instantiate the strategy
|
|
13
|
-
# Strategy.new(document, metadata)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Document ] document The document to cascade from.
|
|
16
|
-
# @param [ Metadata ] metadata The relation's metadata.
|
|
17
|
-
#
|
|
18
|
-
# @return [ Strategy ] The new strategy.
|
|
19
|
-
def initialize(document, metadata)
|
|
20
|
-
@document, @metadata = document, metadata
|
|
21
|
-
@relation = document.send(metadata.name)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Execute the cascading deletion for the relation if it already exists.
|
|
25
|
-
# This should be optimized in the future potentially not to load all
|
|
26
|
-
# objects from the db.
|
|
27
|
-
#
|
|
28
|
-
# @example Perform the cascading delete.
|
|
29
|
-
# strategy.cascade
|
|
30
|
-
#
|
|
31
|
-
# @since 2.0.0
|
|
32
|
-
def cascade
|
|
33
|
-
if relation
|
|
34
|
-
if relation.cascades.empty?
|
|
35
|
-
relation.clear
|
|
36
|
-
else
|
|
37
|
-
::Array.wrap(relation).each { |doc| doc.delete }
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Cascading
|
|
5
|
-
class Destroy
|
|
6
|
-
|
|
7
|
-
attr_accessor :document, :relation, :metadata
|
|
8
|
-
|
|
9
|
-
# Initialize the new cascade strategy, which will set up the relation
|
|
10
|
-
# and the metadata.
|
|
11
|
-
#
|
|
12
|
-
# @example Instantiate the strategy
|
|
13
|
-
# Strategy.new(document, metadata)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Document ] document The document to cascade from.
|
|
16
|
-
# @param [ Metadata ] metadata The relation's metadata.
|
|
17
|
-
#
|
|
18
|
-
# @return [ Strategy ] The new strategy.
|
|
19
|
-
def initialize(document, metadata)
|
|
20
|
-
@document, @metadata = document, metadata
|
|
21
|
-
@relation = document.send(metadata.name)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Execute the cascading deletion for the relation if it already exists.
|
|
25
|
-
# This should be optimized in the future potentially not to load all
|
|
26
|
-
# objects from the db.
|
|
27
|
-
#
|
|
28
|
-
# @example Perform the cascading destroy.
|
|
29
|
-
# strategy.cascade
|
|
30
|
-
def cascade
|
|
31
|
-
if relation
|
|
32
|
-
if relation.is_a?(Enumerable)
|
|
33
|
-
relation.entries
|
|
34
|
-
relation.each { |doc| doc.destroy }
|
|
35
|
-
else
|
|
36
|
-
relation.destroy
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Cascading
|
|
5
|
-
class Nullify
|
|
6
|
-
|
|
7
|
-
attr_accessor :document, :relation, :metadata
|
|
8
|
-
|
|
9
|
-
# Initialize the new cascade strategy, which will set up the relation
|
|
10
|
-
# and the metadata.
|
|
11
|
-
#
|
|
12
|
-
# @example Instantiate the strategy
|
|
13
|
-
# Strategy.new(document, metadata)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Document ] document The document to cascade from.
|
|
16
|
-
# @param [ Metadata ] metadata The relation's metadata.
|
|
17
|
-
#
|
|
18
|
-
# @return [ Strategy ] The new strategy.
|
|
19
|
-
def initialize(document, metadata)
|
|
20
|
-
@document, @metadata = document, metadata
|
|
21
|
-
@relation = document.send(metadata.name)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# This cascade does not delete the referenced relations, but instead
|
|
25
|
-
# sets the foreign key values to nil.
|
|
26
|
-
#
|
|
27
|
-
# @example Nullify the reference.
|
|
28
|
-
# strategy.cascade
|
|
29
|
-
def cascade
|
|
30
|
-
relation.nullify if relation
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Cascading
|
|
5
|
-
class Restrict
|
|
6
|
-
|
|
7
|
-
attr_accessor :document, :relation, :metadata
|
|
8
|
-
|
|
9
|
-
# Initialize the new cascade strategy, which will set up the relation
|
|
10
|
-
# and the metadata.
|
|
11
|
-
#
|
|
12
|
-
# @example Instantiate the strategy
|
|
13
|
-
# Strategy.new(document, metadata)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Document ] document The document to cascade from.
|
|
16
|
-
# @param [ Metadata ] metadata The relation's metadata.
|
|
17
|
-
#
|
|
18
|
-
# @return [ Strategy ] The new strategy.
|
|
19
|
-
def initialize(document, metadata)
|
|
20
|
-
@document, @metadata = document, metadata
|
|
21
|
-
@relation = document.send(metadata.name)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Execute the cascading deletion for the relation if it already exists.
|
|
25
|
-
# This should be optimized in the future potentially not to load all
|
|
26
|
-
# objects from the db.
|
|
27
|
-
#
|
|
28
|
-
# @example Perform the cascading delete.
|
|
29
|
-
# strategy.cascade
|
|
30
|
-
def cascade
|
|
31
|
-
unless relation.blank?
|
|
32
|
-
raise Errors::DeleteRestriction.new(document, metadata.name)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
require "mongoid/relations/cascading/delete"
|
|
3
|
-
require "mongoid/relations/cascading/destroy"
|
|
4
|
-
require "mongoid/relations/cascading/nullify"
|
|
5
|
-
require "mongoid/relations/cascading/restrict"
|
|
6
|
-
|
|
7
|
-
module Mongoid
|
|
8
|
-
module Relations
|
|
9
|
-
|
|
10
|
-
# This module defines the behaviour for setting up cascading deletes and
|
|
11
|
-
# nullifies for relations, and how to delegate to the approriate strategy.
|
|
12
|
-
module Cascading
|
|
13
|
-
extend ActiveSupport::Concern
|
|
14
|
-
|
|
15
|
-
included do
|
|
16
|
-
class_attribute :cascades
|
|
17
|
-
self.cascades = []
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Perform all cascading deletes, destroys, or nullifies. Will delegate to
|
|
21
|
-
# the appropriate strategy to perform the operation.
|
|
22
|
-
#
|
|
23
|
-
# @example Execute cascades.
|
|
24
|
-
# document.cascade!
|
|
25
|
-
#
|
|
26
|
-
# @since 2.0.0.rc.1
|
|
27
|
-
def cascade!
|
|
28
|
-
cascades.each do |name|
|
|
29
|
-
if meta = relations[name]
|
|
30
|
-
strategy = meta.cascade_strategy
|
|
31
|
-
strategy.new(self, meta).cascade if strategy
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
module ClassMethods
|
|
37
|
-
|
|
38
|
-
# Attempt to add the cascading information for the document to know how
|
|
39
|
-
# to handle associated documents on a removal.
|
|
40
|
-
#
|
|
41
|
-
# @example Set up cascading information
|
|
42
|
-
# Movie.cascade(metadata)
|
|
43
|
-
#
|
|
44
|
-
# @param [ Metadata ] metadata The metadata for the relation.
|
|
45
|
-
#
|
|
46
|
-
# @return [ Class ] The class of the document.
|
|
47
|
-
#
|
|
48
|
-
# @since 2.0.0.rc.1
|
|
49
|
-
def cascade(metadata)
|
|
50
|
-
cascades.push(metadata.name.to_s) if metadata.dependent?
|
|
51
|
-
self
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
|
|
5
|
-
# Contains utility methods for object id conversion.
|
|
6
|
-
module Conversions
|
|
7
|
-
extend self
|
|
8
|
-
|
|
9
|
-
# Mark the provided object as unconvertable to bson or not, and always
|
|
10
|
-
# return the provided object.
|
|
11
|
-
#
|
|
12
|
-
# @example Flag the object.
|
|
13
|
-
# Conversions.flag(metadata, 15)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Object ] object The object to flag.
|
|
16
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
17
|
-
#
|
|
18
|
-
# @return [ Object ] The provided object.
|
|
19
|
-
#
|
|
20
|
-
# @since 2.3.0
|
|
21
|
-
def flag(object, metadata)
|
|
22
|
-
inverse = metadata.inverse_klass
|
|
23
|
-
if inverse.using_object_ids? || object.is_a?(BSON::ObjectId)
|
|
24
|
-
object
|
|
25
|
-
else
|
|
26
|
-
if object.is_a?(String)
|
|
27
|
-
object.unconvertable_to_bson = true
|
|
28
|
-
end
|
|
29
|
-
object
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|