mongoid 6.4.8 → 7.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +0 -26
- data/lib/config/locales/en.yml +17 -21
- data/lib/mongoid.rb +2 -2
- data/lib/mongoid/association.rb +150 -0
- data/lib/mongoid/association/accessors.rb +339 -0
- data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
- data/lib/mongoid/association/builders.rb +92 -0
- data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
- data/lib/mongoid/association/depending.rb +116 -0
- data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
- data/lib/mongoid/association/embedded.rb +4 -0
- data/lib/mongoid/{relations → association}/embedded/batchable.rb +27 -53
- data/lib/mongoid/association/embedded/cyclic.rb +109 -0
- data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
- data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
- data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
- data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
- data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
- data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
- data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
- data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
- data/lib/mongoid/association/macros.rb +204 -0
- data/lib/mongoid/{relations → association}/many.rb +18 -52
- data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
- data/lib/mongoid/association/nested.rb +15 -0
- data/lib/mongoid/association/nested/many.rb +200 -0
- data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
- data/lib/mongoid/association/nested/one.rb +127 -0
- data/lib/mongoid/{relations → association}/one.rb +6 -6
- data/lib/mongoid/association/options.rb +152 -0
- data/lib/mongoid/{relations → association}/proxy.rb +31 -58
- data/lib/mongoid/association/referenced.rb +7 -0
- data/lib/mongoid/association/referenced/auto_save.rb +79 -0
- data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
- data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
- data/lib/mongoid/association/referenced/eager.rb +159 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
- data/lib/mongoid/association/referenced/has_many.rb +273 -0
- data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
- data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
- data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +479 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +577 -0
- data/lib/mongoid/association/referenced/has_one.rb +204 -0
- data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
- data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
- data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
- data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
- data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
- data/lib/mongoid/association/referenced/syncable.rb +170 -0
- data/lib/mongoid/{relations → association}/reflections.rb +21 -17
- data/lib/mongoid/association/relatable.rb +415 -0
- data/lib/mongoid/association/touchable.rb +97 -0
- data/lib/mongoid/atomic.rb +6 -6
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/attributes.rb +2 -1
- data/lib/mongoid/attributes/nested.rb +10 -10
- data/lib/mongoid/attributes/processing.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +2 -4
- data/lib/mongoid/clients.rb +0 -2
- data/lib/mongoid/clients/options.rb +1 -1
- data/lib/mongoid/clients/storage_options.rb +0 -1
- data/lib/mongoid/composable.rb +3 -4
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +3 -6
- data/lib/mongoid/contextual/map_reduce.rb +3 -7
- data/lib/mongoid/contextual/memory.rb +5 -10
- data/lib/mongoid/contextual/mongo.rb +10 -27
- data/lib/mongoid/copyable.rb +6 -6
- data/lib/mongoid/criteria.rb +1 -2
- data/lib/mongoid/criteria/includable.rb +14 -14
- data/lib/mongoid/criteria/modifiable.rb +8 -14
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -3
- data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
- data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
- data/lib/mongoid/document.rb +6 -6
- data/lib/mongoid/errors.rb +3 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
- data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
- data/lib/mongoid/errors/unknown_model.rb +25 -0
- data/lib/mongoid/extensions/array.rb +5 -5
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/range.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +0 -1
- data/lib/mongoid/extensions/string.rb +1 -3
- data/lib/mongoid/factory.rb +4 -3
- data/lib/mongoid/fields.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +5 -5
- data/lib/mongoid/fields/standard.rb +2 -14
- data/lib/mongoid/fields/validators/macro.rb +1 -1
- data/lib/mongoid/indexable.rb +8 -5
- data/lib/mongoid/interceptable.rb +5 -5
- data/lib/mongoid/matchable.rb +0 -3
- data/lib/mongoid/persistable.rb +4 -5
- data/lib/mongoid/persistable/creatable.rb +2 -4
- data/lib/mongoid/persistable/deletable.rb +9 -10
- data/lib/mongoid/persistable/destroyable.rb +5 -1
- data/lib/mongoid/persistable/incrementable.rb +1 -1
- data/lib/mongoid/persistable/logical.rb +1 -1
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +2 -2
- data/lib/mongoid/persistable/upsertable.rb +1 -2
- data/lib/mongoid/persistence_context.rb +4 -9
- data/lib/mongoid/query_cache.rb +18 -65
- data/lib/mongoid/railtie.rb +0 -17
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +3 -3
- data/lib/mongoid/tasks/database.rb +2 -3
- data/lib/mongoid/threaded.rb +0 -74
- data/lib/mongoid/traversable.rb +2 -2
- data/lib/mongoid/validatable.rb +8 -8
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +4 -4
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -4
- data/spec/app/models/animal.rb +2 -1
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/bomb.rb +1 -1
- data/spec/app/models/message.rb +1 -1
- data/spec/app/models/person.rb +5 -2
- data/spec/app/models/vertex.rb +6 -0
- data/spec/app/models/wiki_page.rb +1 -1
- data/spec/config/mongoid.yml +1 -0
- data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
- data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
- data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
- data/spec/mongoid/association/constrainable_spec.rb +115 -0
- data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +613 -0
- data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
- data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
- data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
- data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
- data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
- data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
- data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
- data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
- data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
- data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
- data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
- data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
- data/spec/mongoid/{relations → association}/macros_spec.rb +148 -93
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
- data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
- data/spec/mongoid/association/options_spec.rb +1321 -0
- data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
- data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
- data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
- data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
- data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
- data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
- data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
- data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
- data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
- data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +11 -11
- data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +1 -109
- data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
- data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
- data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
- data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
- data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
- data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
- data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
- data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
- data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
- data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -12
- data/spec/mongoid/attributes/readonly_spec.rb +80 -125
- data/spec/mongoid/clients/factory_spec.rb +28 -52
- data/spec/mongoid/clients/options_spec.rb +65 -69
- data/spec/mongoid/config_spec.rb +24 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
- data/spec/mongoid/contextual/mongo_spec.rb +4 -112
- data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +6 -74
- data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
- data/spec/mongoid/criteria/scopable_spec.rb +0 -81
- data/spec/mongoid/criteria_spec.rb +16 -19
- data/spec/mongoid/document_spec.rb +2 -56
- data/spec/mongoid/extensions/array_spec.rb +11 -15
- data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
- data/spec/mongoid/extensions/object_spec.rb +7 -11
- data/spec/mongoid/extensions/range_spec.rb +7 -0
- data/spec/mongoid/extensions/regexp_spec.rb +0 -23
- data/spec/mongoid/extensions/string_spec.rb +7 -35
- data/spec/mongoid/factory_spec.rb +18 -11
- data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
- data/spec/mongoid/fields_spec.rb +2 -2
- data/spec/mongoid/findable_spec.rb +1 -1
- data/spec/mongoid/indexable_spec.rb +18 -8
- data/spec/mongoid/interceptable_spec.rb +21 -2
- data/spec/mongoid/matchable_spec.rb +1 -26
- data/spec/mongoid/persistable/deletable_spec.rb +0 -19
- data/spec/mongoid/persistable/destroyable_spec.rb +0 -19
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +3 -3
- data/spec/mongoid/persistable/settable_spec.rb +1 -35
- data/spec/mongoid/persistable/updatable_spec.rb +2 -2
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/persistence_context_spec.rb +0 -14
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +18 -87
- data/spec/mongoid/relations/proxy_spec.rb +124 -124
- data/spec/mongoid/scopable_spec.rb +0 -13
- data/spec/mongoid/threaded_spec.rb +0 -68
- data/spec/mongoid/validatable/associated_spec.rb +1 -1
- data/spec/mongoid/validatable/presence_spec.rb +7 -6
- data/spec/mongoid/validatable_spec.rb +1 -1
- data/spec/spec_helper.rb +7 -83
- metadata +586 -611
- metadata.gz.sig +2 -5
- data/lib/mongoid/clients/sessions.rb +0 -113
- data/lib/mongoid/errors/invalid_session_use.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/railties/controller_runtime.rb +0 -86
- data/lib/mongoid/relations.rb +0 -148
- data/lib/mongoid/relations/accessors.rb +0 -267
- data/lib/mongoid/relations/auto_save.rb +0 -94
- data/lib/mongoid/relations/bindings.rb +0 -9
- data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
- data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
- data/lib/mongoid/relations/builder.rb +0 -57
- data/lib/mongoid/relations/builders.rb +0 -106
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
- data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
- data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
- data/lib/mongoid/relations/cascading.rb +0 -56
- data/lib/mongoid/relations/cascading/delete.rb +0 -44
- data/lib/mongoid/relations/cascading/destroy.rb +0 -43
- data/lib/mongoid/relations/cascading/nullify.rb +0 -35
- data/lib/mongoid/relations/cascading/restrict.rb +0 -39
- data/lib/mongoid/relations/conversions.rb +0 -34
- data/lib/mongoid/relations/counter_cache.rb +0 -160
- data/lib/mongoid/relations/cyclic.rb +0 -107
- data/lib/mongoid/relations/eager/base.rb +0 -153
- data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
- data/lib/mongoid/relations/eager/has_many.rb +0 -38
- data/lib/mongoid/relations/eager/has_one.rb +0 -30
- data/lib/mongoid/relations/embedded/in.rb +0 -241
- data/lib/mongoid/relations/embedded/many.rb +0 -683
- data/lib/mongoid/relations/embedded/one.rb +0 -235
- data/lib/mongoid/relations/macros.rb +0 -367
- data/lib/mongoid/relations/metadata.rb +0 -1179
- data/lib/mongoid/relations/nested_builder.rb +0 -74
- data/lib/mongoid/relations/options.rb +0 -49
- data/lib/mongoid/relations/polymorphic.rb +0 -39
- data/lib/mongoid/relations/referenced/in.rb +0 -304
- data/lib/mongoid/relations/referenced/many.rb +0 -812
- data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
- data/lib/mongoid/relations/referenced/one.rb +0 -290
- data/lib/mongoid/relations/synchronization.rb +0 -169
- data/lib/mongoid/relations/targets.rb +0 -2
- data/lib/mongoid/relations/targets/enumerable.rb +0 -493
- data/lib/mongoid/relations/touchable.rb +0 -97
- data/spec/app/models/array_field.rb +0 -7
- data/spec/app/models/delegating_patient.rb +0 -16
- data/spec/integration/document_spec.rb +0 -22
- data/spec/mongoid/clients/sessions_spec.rb +0 -334
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
- data/spec/mongoid/matchable/nor_spec.rb +0 -209
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
- data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
- data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
- data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
- data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
- data/spec/mongoid/relations/cascading_spec.rb +0 -355
- data/spec/mongoid/relations/constraint_spec.rb +0 -75
- data/spec/mongoid/relations/conversions_spec.rb +0 -128
- data/spec/mongoid/relations/metadata_spec.rb +0 -1985
- data/spec/mongoid/relations/options_spec.rb +0 -35
- data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/constraints.rb +0 -101
- data/spec/support/macros.rb +0 -20
- data/spec/support/session_registry.rb +0 -50
- data/spec/support/spec_config.rb +0 -42
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class BelongsTo
|
|
6
|
+
|
|
7
|
+
# Eager class for belongs_to associations.
|
|
8
|
+
class Eager < Association::Referenced::Eager::Base
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def preload
|
|
13
|
+
raise Errors::EagerLoad.new(@association.name) if @association.polymorphic?
|
|
14
|
+
|
|
15
|
+
@docs.each do |d|
|
|
16
|
+
set_relation(d, nil)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
each_loaded_document do |doc|
|
|
20
|
+
id = doc.send(key)
|
|
21
|
+
set_on_parent(id, doc)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def group_by_key
|
|
26
|
+
@association.foreign_key
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def key
|
|
30
|
+
@association.primary_key
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class BelongsTo
|
|
6
|
+
|
|
7
|
+
# This class handles all behaviour for relations that are either
|
|
8
|
+
# one-to-many or one-to-one, where the foreign key is stored on this side
|
|
9
|
+
# of the relation and the reference is to document(s) in another
|
|
10
|
+
# collection.
|
|
11
|
+
class Proxy < Association::One
|
|
12
|
+
include Evolvable
|
|
13
|
+
|
|
14
|
+
# Instantiate a new belongs_to association proxy.
|
|
15
|
+
#
|
|
16
|
+
# @example Create the new proxy.
|
|
17
|
+
# Association::BelongsTo::Proxy.new(game, person, association)
|
|
18
|
+
#
|
|
19
|
+
# @param [ Document ] base The document this relation hangs off of.
|
|
20
|
+
# @param [ Document, Array<Document> ] target The target (parent) of the
|
|
21
|
+
# relation.
|
|
22
|
+
# @param [ Association ] association The association object.
|
|
23
|
+
def initialize(base, target, association)
|
|
24
|
+
init(base, target, association) do
|
|
25
|
+
characterize_one(_target)
|
|
26
|
+
bind_one
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Removes the association between the base document and the target
|
|
31
|
+
# document by deleting the foreign key and the reference, orphaning
|
|
32
|
+
# the target document in the process.
|
|
33
|
+
#
|
|
34
|
+
# @example Nullify the relation.
|
|
35
|
+
# person.game.nullify
|
|
36
|
+
#
|
|
37
|
+
def nullify
|
|
38
|
+
unbind_one
|
|
39
|
+
_target.save
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Substitutes the supplied target documents for the existing document
|
|
43
|
+
# in the relation.
|
|
44
|
+
#
|
|
45
|
+
# @example Substitute the relation.
|
|
46
|
+
# name.substitute(new_name)
|
|
47
|
+
#
|
|
48
|
+
# @param [ Document, Array<Document> ] replacement The replacement.
|
|
49
|
+
#
|
|
50
|
+
# @return [ self, nil ] The relation or nil.
|
|
51
|
+
#
|
|
52
|
+
# @since 2.0.0.rc.1
|
|
53
|
+
def substitute(replacement)
|
|
54
|
+
unbind_one
|
|
55
|
+
if replacement
|
|
56
|
+
self._target = normalize(replacement)
|
|
57
|
+
bind_one
|
|
58
|
+
self
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
# Instantiate the binding associated with this relation.
|
|
65
|
+
#
|
|
66
|
+
# @example Get the binding object.
|
|
67
|
+
# binding([ address ])
|
|
68
|
+
#
|
|
69
|
+
# @return [ Binding ] The binding object.
|
|
70
|
+
#
|
|
71
|
+
# @since 2.0.0.rc.1
|
|
72
|
+
def binding
|
|
73
|
+
BelongsTo::Binding.new(_base, _target, _association)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Normalize the value provided as a replacement for substitution.
|
|
77
|
+
#
|
|
78
|
+
# @api private
|
|
79
|
+
#
|
|
80
|
+
# @example Normalize the substitute.
|
|
81
|
+
# proxy.normalize(id)
|
|
82
|
+
#
|
|
83
|
+
# @param [ Document, Object ] replacement The replacement object.
|
|
84
|
+
#
|
|
85
|
+
# @return [ Document ] The document.
|
|
86
|
+
#
|
|
87
|
+
# @since 3.1.5
|
|
88
|
+
def normalize(replacement)
|
|
89
|
+
return replacement if replacement.is_a?(Document)
|
|
90
|
+
_association.build(klass, replacement)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Are we able to persist this relation?
|
|
94
|
+
#
|
|
95
|
+
# @example Can we persist the relation?
|
|
96
|
+
# relation.persistable?
|
|
97
|
+
#
|
|
98
|
+
# @return [ true, false ] If the relation is persistable.
|
|
99
|
+
#
|
|
100
|
+
# @since 2.1.0
|
|
101
|
+
def persistable?
|
|
102
|
+
_target.persisted? && !_binding? && !_building?
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class << self
|
|
106
|
+
|
|
107
|
+
# Get the Eager object for this type of association.
|
|
108
|
+
#
|
|
109
|
+
# @example Get the eager loader object
|
|
110
|
+
#
|
|
111
|
+
# @param [ Association ] association The association object.
|
|
112
|
+
# @param [ Array<Document> ] docs The array of documents.
|
|
113
|
+
#
|
|
114
|
+
# @since 7.0
|
|
115
|
+
def eager_loader(association, docs)
|
|
116
|
+
Eager.new(association, docs)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Returns true if the relation is an embedded one. In this case
|
|
120
|
+
# always false.
|
|
121
|
+
#
|
|
122
|
+
# @example Is this relation embedded?
|
|
123
|
+
# Association::BelongsTo::Proxy.embedded?
|
|
124
|
+
#
|
|
125
|
+
# @return [ false ] Always false.
|
|
126
|
+
#
|
|
127
|
+
# @since 2.0.0.rc.1
|
|
128
|
+
def embedded?
|
|
129
|
+
false
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
module CounterCache
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
# Reset the given counter using the .count() query from the
|
|
9
|
+
# db. This method is usuful in case that a counter got
|
|
10
|
+
# corrupted, or a new counter was added to the collection.
|
|
11
|
+
#
|
|
12
|
+
# @example Reset the given counter cache
|
|
13
|
+
# post.reset_counters(:comments)
|
|
14
|
+
#
|
|
15
|
+
# @param [ Symbol, Array ] counters One or more counter caches to reset
|
|
16
|
+
#
|
|
17
|
+
# @since 4.0.0
|
|
18
|
+
def reset_counters(*counters)
|
|
19
|
+
self.class.with(persistence_context) do |_class|
|
|
20
|
+
_class.reset_counters(self, *counters)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
module ClassMethods
|
|
25
|
+
|
|
26
|
+
# Reset the given counter using the .count() query from the
|
|
27
|
+
# db. This method is usuful in case that a counter got
|
|
28
|
+
# corrupted, or a new counter was added to the collection.
|
|
29
|
+
#
|
|
30
|
+
# @example Reset the given counter cache
|
|
31
|
+
# Post.reset_counters('50e0edd97c71c17ea9000001', :comments)
|
|
32
|
+
#
|
|
33
|
+
# @param [ String ] id The id of the object that will be reset.
|
|
34
|
+
# @param [ Symbol, Array ] counters One or more counter caches to reset
|
|
35
|
+
#
|
|
36
|
+
# @since 3.1.0
|
|
37
|
+
def reset_counters(id, *counters)
|
|
38
|
+
document = id.is_a?(Document) ? id : find(id)
|
|
39
|
+
counters.each do |name|
|
|
40
|
+
relation_association = relations[name]
|
|
41
|
+
counter_name = relation_association.inverse_association.counter_cache_column_name
|
|
42
|
+
document.update_attribute(counter_name, document.send(name).count)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Update the given counters by the value factor. It uses the
|
|
47
|
+
# atomic $inc command.
|
|
48
|
+
#
|
|
49
|
+
# @example Add 5 to comments counter and remove 2 from likes
|
|
50
|
+
# counter.
|
|
51
|
+
# Post.update_counters('50e0edd97c71c17ea9000001',
|
|
52
|
+
# :comments_count => 5, :likes_count => -2)
|
|
53
|
+
#
|
|
54
|
+
# @param [ String ] id The id of the object to update.
|
|
55
|
+
# @param [ Hash ] counters
|
|
56
|
+
#
|
|
57
|
+
# @since 3.1.0
|
|
58
|
+
def update_counters(id, counters)
|
|
59
|
+
where(:_id => id).inc(counters)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Increment the counter name from the entries that match the
|
|
63
|
+
# id by one. This method is used on associations callbacks
|
|
64
|
+
# when counter_cache is enabled
|
|
65
|
+
#
|
|
66
|
+
# @example Increment comments counter
|
|
67
|
+
# Post.increment_counter(:comments_count, '50e0edd97c71c17ea9000001')
|
|
68
|
+
#
|
|
69
|
+
# @param [ Symbol ] counter_name Counter cache name
|
|
70
|
+
# @param [ String ] id The id of the object that will have its counter incremented.
|
|
71
|
+
#
|
|
72
|
+
# @since 3.1.0
|
|
73
|
+
def increment_counter(counter_name, id)
|
|
74
|
+
update_counters(id, counter_name.to_sym => 1)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Decrement the counter name from the entries that match the
|
|
78
|
+
# id by one. This method is used on associations callbacks
|
|
79
|
+
# when counter_cache is enabled
|
|
80
|
+
#
|
|
81
|
+
# @example Decrement comments counter
|
|
82
|
+
# Post.decrement_counter(:comments_count, '50e0edd97c71c17ea9000001')
|
|
83
|
+
#
|
|
84
|
+
# @param [ Symbol ] counter_name Counter cache name
|
|
85
|
+
# @param [ String ] id The id of the object that will have its counter decremented.
|
|
86
|
+
#
|
|
87
|
+
# @since 3.1.0
|
|
88
|
+
def decrement_counter(counter_name, id)
|
|
89
|
+
update_counters(id, counter_name.to_sym => -1)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Add the callbacks responsible for update the counter cache field.
|
|
94
|
+
#
|
|
95
|
+
# @api private
|
|
96
|
+
#
|
|
97
|
+
# @example Add the touchable.
|
|
98
|
+
# Mongoid::Association::Referenced::CounterCache.define_callbacks!(association)
|
|
99
|
+
#
|
|
100
|
+
# @param [ Association ] association The association.
|
|
101
|
+
#
|
|
102
|
+
# @return [ Class ] The association's owning class.
|
|
103
|
+
#
|
|
104
|
+
# @since 7.0
|
|
105
|
+
def self.define_callbacks!(association)
|
|
106
|
+
name = association.name
|
|
107
|
+
cache_column = association.counter_cache_column_name.to_sym
|
|
108
|
+
|
|
109
|
+
association.inverse_class.tap do |klass|
|
|
110
|
+
klass.after_update do
|
|
111
|
+
if record = __send__(name)
|
|
112
|
+
foreign_key = association.foreign_key
|
|
113
|
+
|
|
114
|
+
if attribute_changed?(foreign_key)
|
|
115
|
+
original, current = attribute_change(foreign_key)
|
|
116
|
+
|
|
117
|
+
unless original.nil?
|
|
118
|
+
record.class.with(persistence_context) do |_class|
|
|
119
|
+
_class.decrement_counter(cache_column, original)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
unless current.nil?
|
|
124
|
+
record[cache_column] = (record[cache_column] || 0) + 1
|
|
125
|
+
record.class.with(record.persistence_context) do |_class|
|
|
126
|
+
_class.increment_counter(cache_column, current) if record.persisted?
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
klass.after_create do
|
|
134
|
+
if record = __send__(name)
|
|
135
|
+
record[cache_column] = (record[cache_column] || 0) + 1
|
|
136
|
+
|
|
137
|
+
if record.persisted?
|
|
138
|
+
record.class.with(record.persistence_context) do |_class|
|
|
139
|
+
_class.increment_counter(cache_column, record._id)
|
|
140
|
+
end
|
|
141
|
+
record.remove_change(cache_column)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
klass.before_destroy do
|
|
147
|
+
if record = __send__(name)
|
|
148
|
+
record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen?
|
|
149
|
+
|
|
150
|
+
if record.persisted?
|
|
151
|
+
record.class.with(record.persistence_context) do |_class|
|
|
152
|
+
_class.decrement_counter(cache_column, record._id)
|
|
153
|
+
end
|
|
154
|
+
record.remove_change(cache_column)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
module Eager
|
|
6
|
+
|
|
7
|
+
# Base class for eager load preload functions.
|
|
8
|
+
#
|
|
9
|
+
# @since 4.0.0
|
|
10
|
+
class Base
|
|
11
|
+
|
|
12
|
+
# Instantiate the eager load class.
|
|
13
|
+
#
|
|
14
|
+
# @example Create the new belongs to eager load preloader.
|
|
15
|
+
# BelongsTo.new(association, parent_docs)
|
|
16
|
+
#
|
|
17
|
+
# @param [ Array<Association> ] associations Associations to eager load
|
|
18
|
+
# @param [ Array<Document> ] docs Documents to preload the relations
|
|
19
|
+
#
|
|
20
|
+
# @return [ Base ] The eager load preloader
|
|
21
|
+
#
|
|
22
|
+
# @since 4.0.0
|
|
23
|
+
def initialize(associations, docs)
|
|
24
|
+
@associations = associations
|
|
25
|
+
@docs = docs
|
|
26
|
+
@grouped_docs = {}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Run the preloader.
|
|
30
|
+
#
|
|
31
|
+
# @example Preload the relations into the documents.
|
|
32
|
+
# loader.run
|
|
33
|
+
#
|
|
34
|
+
# @return [ Array ] The list of documents given.
|
|
35
|
+
#
|
|
36
|
+
# @since 4.0.0
|
|
37
|
+
def run
|
|
38
|
+
@loaded = []
|
|
39
|
+
while shift_association
|
|
40
|
+
preload
|
|
41
|
+
@loaded << @docs.collect { |d| d.send(@association.name) if d.respond_to?(@association.name) }
|
|
42
|
+
end
|
|
43
|
+
@loaded.flatten
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
protected
|
|
47
|
+
|
|
48
|
+
# Preload the current relation.
|
|
49
|
+
#
|
|
50
|
+
# This method should be implemented in the subclass
|
|
51
|
+
#
|
|
52
|
+
# @example Preload the current relation into the documents.
|
|
53
|
+
# loader.preload
|
|
54
|
+
#
|
|
55
|
+
# @since 4.0.0
|
|
56
|
+
def preload
|
|
57
|
+
raise NotImplementedError
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Run the preloader.
|
|
61
|
+
#
|
|
62
|
+
# @example Iterate over the documents loaded for the current relation
|
|
63
|
+
# loader.each_loaded_document { |doc| }
|
|
64
|
+
#
|
|
65
|
+
# @since 4.0.0
|
|
66
|
+
def each_loaded_document
|
|
67
|
+
criteria = @association.klass.any_in(key => keys_from_docs)
|
|
68
|
+
criteria.inclusions = criteria.inclusions - [@association]
|
|
69
|
+
criteria.each do |doc|
|
|
70
|
+
yield doc
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Set the pre-loaded document into its parent.
|
|
75
|
+
#
|
|
76
|
+
# @example Set docs into parent with pk = "foo"
|
|
77
|
+
# loader.set_on_parent("foo", docs)
|
|
78
|
+
#
|
|
79
|
+
# @param [ ObjectId ] id parent`s id
|
|
80
|
+
# @param [ Document, Array ] element to push into the parent
|
|
81
|
+
#
|
|
82
|
+
# @since 4.0.0
|
|
83
|
+
def set_on_parent(id, element)
|
|
84
|
+
grouped_docs[id].each do |d|
|
|
85
|
+
set_relation(d, element)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Return a hash with the current documents grouped by key.
|
|
90
|
+
#
|
|
91
|
+
# @example Return a hash with the current documents grouped by key.
|
|
92
|
+
# loader.grouped_docs
|
|
93
|
+
#
|
|
94
|
+
# @return [ Hash ] hash with grouped documents.
|
|
95
|
+
#
|
|
96
|
+
# @since 4.0.0
|
|
97
|
+
def grouped_docs
|
|
98
|
+
@grouped_docs[@association.name] ||= @docs.group_by do |doc|
|
|
99
|
+
doc.send(group_by_key) if doc.respond_to?(group_by_key)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Group the documents and return the keys
|
|
104
|
+
#
|
|
105
|
+
# @example
|
|
106
|
+
# loader.keys_from_docs
|
|
107
|
+
#
|
|
108
|
+
# @return [ Array ] keys, ids
|
|
109
|
+
#
|
|
110
|
+
# @since 4.0.0
|
|
111
|
+
def keys_from_docs
|
|
112
|
+
grouped_docs.keys
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Return the key to group the current documents.
|
|
116
|
+
#
|
|
117
|
+
# This method should be implemented in the subclass
|
|
118
|
+
#
|
|
119
|
+
# @example Return the key for group
|
|
120
|
+
# loader.group_by_key
|
|
121
|
+
#
|
|
122
|
+
# @return [ Symbol ] Key to group by the current documents.
|
|
123
|
+
#
|
|
124
|
+
# @since 4.0.0
|
|
125
|
+
def group_by_key
|
|
126
|
+
raise NotImplementedError
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Set the pre-loaded document into its parent.
|
|
130
|
+
#
|
|
131
|
+
# @example Set docs into parent using the current relation name.
|
|
132
|
+
# loader.set_relation(doc, docs)
|
|
133
|
+
#
|
|
134
|
+
# @param [ Document ] doc The object to set the relation on
|
|
135
|
+
# @param [ Document, Array ] element to set into the parent
|
|
136
|
+
#
|
|
137
|
+
# @since 4.0.0
|
|
138
|
+
def set_relation(doc, element)
|
|
139
|
+
doc.set_relation(@association.name, element) unless doc.blank?
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
|
|
144
|
+
# Shift the current association metadata
|
|
145
|
+
#
|
|
146
|
+
# @example Shift the current association.
|
|
147
|
+
# loader.shift_association
|
|
148
|
+
#
|
|
149
|
+
# @return [ Association ] The association object.
|
|
150
|
+
#
|
|
151
|
+
# @since 4.0.0
|
|
152
|
+
def shift_association
|
|
153
|
+
@association = @associations.shift
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|