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,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,162 @@
|
|
|
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
|
+
doc_keys = keys_from_docs
|
|
68
|
+
return @association.klass.none if doc_keys.all?(&:nil?)
|
|
69
|
+
|
|
70
|
+
criteria = @association.klass.any_in(key => doc_keys)
|
|
71
|
+
criteria.inclusions = criteria.inclusions - [@association]
|
|
72
|
+
criteria.each do |doc|
|
|
73
|
+
yield doc
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Set the pre-loaded document into its parent.
|
|
78
|
+
#
|
|
79
|
+
# @example Set docs into parent with pk = "foo"
|
|
80
|
+
# loader.set_on_parent("foo", docs)
|
|
81
|
+
#
|
|
82
|
+
# @param [ ObjectId ] id parent`s id
|
|
83
|
+
# @param [ Document, Array ] element to push into the parent
|
|
84
|
+
#
|
|
85
|
+
# @since 4.0.0
|
|
86
|
+
def set_on_parent(id, element)
|
|
87
|
+
grouped_docs[id].each do |d|
|
|
88
|
+
set_relation(d, element)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Return a hash with the current documents grouped by key.
|
|
93
|
+
#
|
|
94
|
+
# @example Return a hash with the current documents grouped by key.
|
|
95
|
+
# loader.grouped_docs
|
|
96
|
+
#
|
|
97
|
+
# @return [ Hash ] hash with grouped documents.
|
|
98
|
+
#
|
|
99
|
+
# @since 4.0.0
|
|
100
|
+
def grouped_docs
|
|
101
|
+
@grouped_docs[@association.name] ||= @docs.group_by do |doc|
|
|
102
|
+
doc.send(group_by_key) if doc.respond_to?(group_by_key)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Group the documents and return the keys
|
|
107
|
+
#
|
|
108
|
+
# @example
|
|
109
|
+
# loader.keys_from_docs
|
|
110
|
+
#
|
|
111
|
+
# @return [ Array ] keys, ids
|
|
112
|
+
#
|
|
113
|
+
# @since 4.0.0
|
|
114
|
+
def keys_from_docs
|
|
115
|
+
grouped_docs.keys
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Return the key to group the current documents.
|
|
119
|
+
#
|
|
120
|
+
# This method should be implemented in the subclass
|
|
121
|
+
#
|
|
122
|
+
# @example Return the key for group
|
|
123
|
+
# loader.group_by_key
|
|
124
|
+
#
|
|
125
|
+
# @return [ Symbol ] Key to group by the current documents.
|
|
126
|
+
#
|
|
127
|
+
# @since 4.0.0
|
|
128
|
+
def group_by_key
|
|
129
|
+
raise NotImplementedError
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Set the pre-loaded document into its parent.
|
|
133
|
+
#
|
|
134
|
+
# @example Set docs into parent using the current relation name.
|
|
135
|
+
# loader.set_relation(doc, docs)
|
|
136
|
+
#
|
|
137
|
+
# @param [ Document ] doc The object to set the relation on
|
|
138
|
+
# @param [ Document, Array ] element to set into the parent
|
|
139
|
+
#
|
|
140
|
+
# @since 4.0.0
|
|
141
|
+
def set_relation(doc, element)
|
|
142
|
+
doc.set_relation(@association.name, element) unless doc.blank?
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
private
|
|
146
|
+
|
|
147
|
+
# Shift the current association metadata
|
|
148
|
+
#
|
|
149
|
+
# @example Shift the current association.
|
|
150
|
+
# loader.shift_association
|
|
151
|
+
#
|
|
152
|
+
# @return [ Association ] The association object.
|
|
153
|
+
#
|
|
154
|
+
# @since 4.0.0
|
|
155
|
+
def shift_association
|
|
156
|
+
@association = @associations.shift
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class HasAndBelongsToMany
|
|
6
|
+
|
|
7
|
+
# Binding class for all has_and_belongs_to_many relations.
|
|
8
|
+
class Binding
|
|
9
|
+
include Bindable
|
|
10
|
+
|
|
11
|
+
# Binds a single document with the inverse relation. Used
|
|
12
|
+
# specifically when appending to the proxy.
|
|
13
|
+
#
|
|
14
|
+
# @example Bind one document.
|
|
15
|
+
# person.preferences.bind_one(preference)
|
|
16
|
+
#
|
|
17
|
+
# @param [ Document ] doc The single document to bind.
|
|
18
|
+
#
|
|
19
|
+
# @since 2.0.0.rc.1
|
|
20
|
+
def bind_one(doc)
|
|
21
|
+
binding do
|
|
22
|
+
inverse_keys = doc.you_must(_association.inverse_foreign_key)
|
|
23
|
+
if inverse_keys
|
|
24
|
+
record_id = inverse_record_id(doc)
|
|
25
|
+
unless inverse_keys.include?(record_id)
|
|
26
|
+
doc.you_must(_association.inverse_foreign_key_setter, inverse_keys.push(record_id))
|
|
27
|
+
end
|
|
28
|
+
doc.reset_relation_criteria(_association.inverse)
|
|
29
|
+
end
|
|
30
|
+
_base._synced[_association.foreign_key] = true
|
|
31
|
+
doc._synced[_association.inverse_foreign_key] = true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Unbind a single document.
|
|
36
|
+
#
|
|
37
|
+
# @example Unbind the document.
|
|
38
|
+
# person.preferences.unbind_one(document)
|
|
39
|
+
#
|
|
40
|
+
# @since 2.0.0.rc.1
|
|
41
|
+
def unbind_one(doc)
|
|
42
|
+
binding do
|
|
43
|
+
_base.send(_association.foreign_key).delete_one(record_id(doc))
|
|
44
|
+
inverse_keys = doc.you_must(_association.inverse_foreign_key)
|
|
45
|
+
if inverse_keys
|
|
46
|
+
inverse_keys.delete_one(inverse_record_id(doc))
|
|
47
|
+
doc.reset_relation_criteria(_association.inverse)
|
|
48
|
+
end
|
|
49
|
+
_base._synced[_association.foreign_key] = true
|
|
50
|
+
doc._synced[_association.inverse_foreign_key] = true
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Find the inverse id referenced by inverse_keys
|
|
55
|
+
def inverse_record_id(doc)
|
|
56
|
+
inverse_association = determine_inverse_association(doc)
|
|
57
|
+
if inverse_association
|
|
58
|
+
_base.__send__(inverse_association.primary_key)
|
|
59
|
+
else
|
|
60
|
+
_base._id
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def determine_inverse_association(doc)
|
|
65
|
+
doc.relations[_base.class.name.demodulize.underscore.pluralize]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class HasAndBelongsToMany
|
|
6
|
+
|
|
7
|
+
# The Builder behavior for has_and_belongs_to_many associations.
|
|
8
|
+
#
|
|
9
|
+
# @since 7.0
|
|
10
|
+
module Buildable
|
|
11
|
+
|
|
12
|
+
# This builder either takes a hash and queries for the
|
|
13
|
+
# object or an array of documents, where it will just return them.
|
|
14
|
+
#
|
|
15
|
+
# @example Build the documents.
|
|
16
|
+
# relation.build(association, attrs)
|
|
17
|
+
#
|
|
18
|
+
# @param [ Object ] base The base object.
|
|
19
|
+
# @param [ Object ] object The object to use to build the relation.
|
|
20
|
+
# @param [ String ] type Not used in this context.
|
|
21
|
+
#
|
|
22
|
+
# @return [ Array<Document> ] The documents.
|
|
23
|
+
def build(base, object, type = nil)
|
|
24
|
+
if query?(object)
|
|
25
|
+
query_criteria(object)
|
|
26
|
+
else
|
|
27
|
+
object.try(:dup)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def query?(object)
|
|
34
|
+
object.nil? || Array(object).all? { |d| !d.is_a?(Mongoid::Document) }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
module Referenced
|
|
5
|
+
class HasAndBelongsToMany
|
|
6
|
+
|
|
7
|
+
# Eager class for has_and_belongs_to_many associations.
|
|
8
|
+
class Eager < Association::Referenced::Eager::Base
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def preload
|
|
13
|
+
@docs.each do |d|
|
|
14
|
+
set_relation(d, [])
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
entries = {}
|
|
18
|
+
each_loaded_document do |doc|
|
|
19
|
+
entries[doc.send(key)] = doc
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
@docs.each do |d|
|
|
23
|
+
keys = d.send(group_by_key)
|
|
24
|
+
docs = entries.values_at(*keys).compact
|
|
25
|
+
set_relation(d, docs)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def keys_from_docs
|
|
30
|
+
keys = Set.new
|
|
31
|
+
@docs.each do |d|
|
|
32
|
+
keys += d.send(group_by_key)
|
|
33
|
+
end
|
|
34
|
+
keys.to_a
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def set_relation(doc, element)
|
|
38
|
+
doc.__build__(@association.name, element, @association) unless doc.blank?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def group_by_key
|
|
42
|
+
@association.foreign_key
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def key
|
|
46
|
+
@association.primary_key
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|