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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 6f483fd6267d4f9d7cdd88cd53e8fda43b3266d5
|
|
4
|
+
data.tar.gz: a9dc77a3e44b2e719b5bc5e74c918c0d20dc964d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5404ab3c5ee259a29c80848cdf90f5709cb4665945c41edbaab5c329a9bd28b5350dedc115e3e41d537043f730f1b90db8646a5d8b075c26f324c0a94f4e6b35
|
|
7
|
+
data.tar.gz: f14bad6291f3628cf3c767c55b7707d32f9fe0bb001e34bd466c66d483378752f0550666359a206afbd1f0bf3409b6fb4eb12f4b2fea0cc4cc0e83f737a50da6
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data.tar.gz.sig
CHANGED
|
Binary file
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
require "bundler"
|
|
2
|
-
require "bundler/gem_tasks"
|
|
3
2
|
Bundler.setup
|
|
4
3
|
|
|
5
4
|
require "rake"
|
|
@@ -8,9 +7,6 @@ require "rspec/core/rake_task"
|
|
|
8
7
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
|
9
8
|
require "mongoid/version"
|
|
10
9
|
|
|
11
|
-
tasks = Rake.application.instance_variable_get('@tasks')
|
|
12
|
-
tasks['release:do'] = tasks.delete('release')
|
|
13
|
-
|
|
14
10
|
task :gem => :build
|
|
15
11
|
task :build do
|
|
16
12
|
system "gem build mongoid.gemspec"
|
|
@@ -37,25 +33,3 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
|
|
|
37
33
|
end
|
|
38
34
|
|
|
39
35
|
task :default => :spec
|
|
40
|
-
|
|
41
|
-
desc "Generate all documentation"
|
|
42
|
-
task :docs => 'docs:yard'
|
|
43
|
-
|
|
44
|
-
namespace :docs do
|
|
45
|
-
desc "Generate yard documention"
|
|
46
|
-
task :yard do
|
|
47
|
-
out = File.join('yard-docs', Mongoid::VERSION)
|
|
48
|
-
FileUtils.rm_rf(out)
|
|
49
|
-
system "yardoc -o #{out} --title mongoid-#{Mongoid::VERSION}"
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
namespace :release do
|
|
54
|
-
task :check_private_key do
|
|
55
|
-
unless File.exist?('gem-private_key.pem')
|
|
56
|
-
raise "No private key present, cannot release"
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
task :release => ['release:check_private_key', 'release:do']
|
data/lib/config/locales/en.yml
CHANGED
|
@@ -91,6 +91,11 @@ en:
|
|
|
91
91
|
expecting the option to be there, please consult the following page
|
|
92
92
|
with repect to Mongoid's configuration:\n\n
|
|
93
93
|
\_\_http://mongoid.org/en/mongoid/docs/installation.html"
|
|
94
|
+
invalid_dependent_strategy:
|
|
95
|
+
message: "Invalid dependent strategy: %{invalid_strategy}."
|
|
96
|
+
summary: "An invalid dependent strategy was defined for the association:
|
|
97
|
+
%{association}. The valid strategies are: %{valid_strategies}."
|
|
98
|
+
resolution: "Change the dependent strategy to one of the valid types."
|
|
94
99
|
invalid_field:
|
|
95
100
|
message: "Defining a field named '%{name}' is not allowed."
|
|
96
101
|
summary: "Defining this field would override the method '%{name}',
|
|
@@ -196,6 +201,11 @@ en:
|
|
|
196
201
|
allowed, and don't use these names. These include names that also
|
|
197
202
|
conflict with core Ruby methods on Object, Module, Enumerable, or
|
|
198
203
|
included gems that inject methods into these or Mongoid internals."
|
|
204
|
+
invalid_relation_option:
|
|
205
|
+
message: "Invalid relation option :%{option} for relation '%{name}' on class
|
|
206
|
+
%{klass}."
|
|
207
|
+
summary: "An invalid option was provided for a relation."
|
|
208
|
+
resolution: "Valid options are: %{valid_options}, make sure you use only those."
|
|
199
209
|
invalid_scope:
|
|
200
210
|
message: "Defining a scope of value %{value} on %{klass} is not
|
|
201
211
|
allowed."
|
|
@@ -206,20 +216,6 @@ en:
|
|
|
206
216
|
\_\_\_\_include Mongoid::Document\n
|
|
207
217
|
\_\_\_\_scope :inactive, ->{ where(active: false) }\n
|
|
208
218
|
\_\_end\n\n"
|
|
209
|
-
invalid_session_use:
|
|
210
|
-
message: "A session was attempted to be used with a model whose client cannot use
|
|
211
|
-
that session."
|
|
212
|
-
summary: "Sessions are started via driver clients (Model#mongo_client) and, in most cases, driver
|
|
213
|
-
clients are shared across models. When different models have their own clients, a session cannot
|
|
214
|
-
be obtained via one model and used for operations on another model."
|
|
215
|
-
resolution: "Only execute operations on the model class or instances of the model through which
|
|
216
|
-
the session was created. Otherwise, ensure that all models on which operations are executed
|
|
217
|
-
in the session block share the same driver client. For example, a model may have a different
|
|
218
|
-
client specified in its 'store_in' options.\n\n"
|
|
219
|
-
invalid_session_nesting:
|
|
220
|
-
message: "A session was started while another session was being used."
|
|
221
|
-
summary: "Sessions cannot be nested. Only one session can be used in a thread at once."
|
|
222
|
-
resolution: "Only use one session at a time; sessions cannot be nested."
|
|
223
219
|
invalid_storage_options:
|
|
224
220
|
message: "Invalid options passed to %{klass}.store_in: %{options}."
|
|
225
221
|
summary: "The :store_in macro takes only a hash of parameters with
|
|
@@ -466,13 +462,6 @@ en:
|
|
|
466
462
|
with the already defined method %{model_name}, or set the
|
|
467
463
|
configuration option Mongoid.scope_overwrite_exception to false,
|
|
468
464
|
which is its default. In this case a warning will be logged."
|
|
469
|
-
sessions_not_supported:
|
|
470
|
-
message: "Sessions are not supported by the connected server(s)."
|
|
471
|
-
summary: "A session was attempted to be used with a MongoDB server version
|
|
472
|
-
that doesn't support sessions. Sessions are supported in MongoDB
|
|
473
|
-
server versions 3.6 and higher."
|
|
474
|
-
resolution: "Verify that all servers in your deployment are at least
|
|
475
|
-
version 3.6 or don't attempt to use sessions with older server versions."
|
|
476
465
|
taken:
|
|
477
466
|
"is already taken"
|
|
478
467
|
too_many_nested_attribute_records:
|
|
@@ -494,6 +483,13 @@ en:
|
|
|
494
483
|
attributes hash, and is raised instead of getting a NoMethodError."
|
|
495
484
|
resolution: "You can include Mongoid::Attributes::Dynamic if you
|
|
496
485
|
expect to be writing values for undefined fields often."
|
|
486
|
+
unknown_model:
|
|
487
|
+
message: "Attempted to instantiate an object of the unknown Model '%{klass}'."
|
|
488
|
+
summary: "A document with the value '%{value}' at the key '_type' was used to
|
|
489
|
+
instantiate a model object but Mongoid cannot find this Class."
|
|
490
|
+
resolution: "The _type field is a reserved one used by Mongoid to determine the
|
|
491
|
+
class for instantiating an object. Please don't save data in this field or ensure
|
|
492
|
+
that any values in this field correspond to valid Models."
|
|
497
493
|
unsaved_document:
|
|
498
494
|
message: "Attempted to save %{document} before the parent %{base}."
|
|
499
495
|
summary: "You cannot call create or create! through the
|
data/lib/mongoid.rb
CHANGED
|
@@ -42,7 +42,7 @@ module Mongoid
|
|
|
42
42
|
PLATFORM_DETAILS = "mongoid-#{VERSION}".freeze
|
|
43
43
|
|
|
44
44
|
# The minimum MongoDB version supported.
|
|
45
|
-
MONGODB_VERSION = "2.
|
|
45
|
+
MONGODB_VERSION = "2.4.0"
|
|
46
46
|
|
|
47
47
|
# Sets the Mongoid configuration options. Best used by passing a block.
|
|
48
48
|
#
|
|
@@ -101,5 +101,5 @@ module Mongoid
|
|
|
101
101
|
# Mongoid.database = Mongo::Connection.new.db("test")
|
|
102
102
|
#
|
|
103
103
|
# @since 1.0.0
|
|
104
|
-
delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ]
|
|
104
|
+
delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
|
|
105
105
|
end
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
require 'mongoid/association/accessors'
|
|
2
|
+
require 'mongoid/association/builders'
|
|
3
|
+
require 'mongoid/association/bindable'
|
|
4
|
+
require 'mongoid/association/depending'
|
|
5
|
+
require 'mongoid/association/proxy'
|
|
6
|
+
require 'mongoid/association/touchable'
|
|
7
|
+
|
|
8
|
+
require 'mongoid/association/many'
|
|
9
|
+
require 'mongoid/association/one'
|
|
10
|
+
require 'mongoid/association/relatable'
|
|
11
|
+
require 'mongoid/association/nested'
|
|
12
|
+
require 'mongoid/association/referenced'
|
|
13
|
+
require 'mongoid/association/embedded'
|
|
14
|
+
require 'mongoid/association/macros'
|
|
15
|
+
|
|
16
|
+
require 'mongoid/association/reflections'
|
|
17
|
+
require 'mongoid/association/eager_loadable'
|
|
18
|
+
|
|
19
|
+
module Mongoid
|
|
20
|
+
module Association
|
|
21
|
+
extend ActiveSupport::Concern
|
|
22
|
+
include Embedded::Cyclic
|
|
23
|
+
include Referenced::AutoSave
|
|
24
|
+
include Referenced::CounterCache
|
|
25
|
+
include Referenced::Syncable
|
|
26
|
+
include Accessors
|
|
27
|
+
include Depending
|
|
28
|
+
include Builders
|
|
29
|
+
include Macros
|
|
30
|
+
include Reflections
|
|
31
|
+
|
|
32
|
+
# Map the macros to their corresponding Association classes.
|
|
33
|
+
#
|
|
34
|
+
# @return [ Hash ] The mapping from macros to their Association class.
|
|
35
|
+
#
|
|
36
|
+
# @since 7.0
|
|
37
|
+
MACRO_MAPPING = {
|
|
38
|
+
embeds_one: Association::Embedded::EmbedsOne,
|
|
39
|
+
embeds_many: Association::Embedded::EmbedsMany,
|
|
40
|
+
embedded_in: Association::Embedded::EmbeddedIn,
|
|
41
|
+
has_one: Association::Referenced::HasOne,
|
|
42
|
+
has_many: Association::Referenced::HasMany,
|
|
43
|
+
has_and_belongs_to_many: Association::Referenced::HasAndBelongsToMany,
|
|
44
|
+
belongs_to: Association::Referenced::BelongsTo,
|
|
45
|
+
}.freeze
|
|
46
|
+
|
|
47
|
+
attr_accessor :_association
|
|
48
|
+
|
|
49
|
+
included do
|
|
50
|
+
class_attribute :polymorphic
|
|
51
|
+
self.polymorphic = false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Determine if the document itself is embedded in another document via the
|
|
55
|
+
# proper channels. (If it has a parent document.)
|
|
56
|
+
#
|
|
57
|
+
# @example Is the document embedded?
|
|
58
|
+
# address.embedded?
|
|
59
|
+
#
|
|
60
|
+
# @return [ true, false ] True if the document has a parent document.
|
|
61
|
+
#
|
|
62
|
+
# @since 2.0.0.rc.1
|
|
63
|
+
def embedded?
|
|
64
|
+
@embedded ||= (cyclic ? _parent.present? : self.class.embedded?)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Determine if the document is part of an embeds_many relation.
|
|
68
|
+
#
|
|
69
|
+
# @example Is the document in an embeds many?
|
|
70
|
+
# address.embedded_many?
|
|
71
|
+
#
|
|
72
|
+
# @return [ true, false ] True if in an embeds many.
|
|
73
|
+
#
|
|
74
|
+
# @since 2.0.0.rc.1
|
|
75
|
+
def embedded_many?
|
|
76
|
+
_association && _association.is_a?(Association::Embedded::EmbedsMany)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Determine if the document is part of an embeds_one relation.
|
|
80
|
+
#
|
|
81
|
+
# @example Is the document in an embeds one?
|
|
82
|
+
# address.embedded_one?
|
|
83
|
+
#
|
|
84
|
+
# @return [ true, false ] True if in an embeds one.
|
|
85
|
+
#
|
|
86
|
+
# @since 2.0.0.rc.1
|
|
87
|
+
def embedded_one?
|
|
88
|
+
_association && _association.is_a?(Association::Embedded::EmbedsOne)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Get the association name for this document. If no association was defined
|
|
92
|
+
# an error will be raised.
|
|
93
|
+
#
|
|
94
|
+
# @example Get the association name.
|
|
95
|
+
# document.association_name
|
|
96
|
+
#
|
|
97
|
+
# @raise [ Errors::NoMetadata ] If no association metadata is present.
|
|
98
|
+
#
|
|
99
|
+
# @return [ Symbol ] The association name.
|
|
100
|
+
#
|
|
101
|
+
# @since 3.0.0
|
|
102
|
+
def association_name
|
|
103
|
+
raise Errors::NoMetadata.new(self.class.name) unless _association
|
|
104
|
+
_association.name
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Determine if the document is part of an references_many relation.
|
|
108
|
+
#
|
|
109
|
+
# @example Is the document in a references many?
|
|
110
|
+
# post.referenced_many?
|
|
111
|
+
#
|
|
112
|
+
# @return [ true, false ] True if in a references many.
|
|
113
|
+
#
|
|
114
|
+
# @since 2.0.0.rc.1
|
|
115
|
+
def referenced_many?
|
|
116
|
+
_association && _association.is_a?(Association::Referenced::HasMany)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Determine if the document is part of an references_one relation.
|
|
120
|
+
#
|
|
121
|
+
# @example Is the document in a references one?
|
|
122
|
+
# address.referenced_one?
|
|
123
|
+
#
|
|
124
|
+
# @return [ true, false ] True if in a references one.
|
|
125
|
+
#
|
|
126
|
+
# @since 2.0.0.rc.1
|
|
127
|
+
def referenced_one?
|
|
128
|
+
_association && _association.is_a?(Association::Referenced::HasOne)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Convenience method for iterating through the loaded relations and
|
|
132
|
+
# reloading them.
|
|
133
|
+
#
|
|
134
|
+
# @example Reload the relations.
|
|
135
|
+
# document.reload_relations
|
|
136
|
+
#
|
|
137
|
+
# @return [ Hash ] The association metadata.
|
|
138
|
+
#
|
|
139
|
+
# @since 2.1.6
|
|
140
|
+
def reload_relations
|
|
141
|
+
relations.each_pair do |name, meta|
|
|
142
|
+
if instance_variable_defined?("@_#{name}")
|
|
143
|
+
if _parent.nil? || instance_variable_get("@_#{name}") != _parent
|
|
144
|
+
remove_instance_variable("@_#{name}")
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Association
|
|
4
|
+
|
|
5
|
+
# This module contains all the behaviour related to accessing relations
|
|
6
|
+
# through the getters and setters, and how to delegate to builders to
|
|
7
|
+
# create new ones.
|
|
8
|
+
module Accessors
|
|
9
|
+
extend ActiveSupport::Concern
|
|
10
|
+
|
|
11
|
+
# Builds the related document and creates the relation unless the
|
|
12
|
+
# document is nil, then sets the relation on this document.
|
|
13
|
+
#
|
|
14
|
+
# @example Build the relation.
|
|
15
|
+
# person.__build__(:addresses, { :_id => 1 }, association)
|
|
16
|
+
#
|
|
17
|
+
# @param [ String, Symbol ] name The name of the relation.
|
|
18
|
+
# @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
|
|
19
|
+
# @param [ Association ] association The association metadata.
|
|
20
|
+
#
|
|
21
|
+
# @return [ Proxy ] The relation.
|
|
22
|
+
#
|
|
23
|
+
# @since 2.0.0.rc.1
|
|
24
|
+
def __build__(name, object, association)
|
|
25
|
+
relation = create_relation(object, association)
|
|
26
|
+
set_relation(name, relation)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Create a relation from an object and association.
|
|
30
|
+
#
|
|
31
|
+
# @example Create the relation.
|
|
32
|
+
# person.create_relation(document, association)
|
|
33
|
+
#
|
|
34
|
+
# @param [ Document, Array<Document> ] object The relation target.
|
|
35
|
+
# @param [ Association ] association The association metadata.
|
|
36
|
+
#
|
|
37
|
+
# @return [ Proxy ] The relation.
|
|
38
|
+
#
|
|
39
|
+
# @since 2.0.0.rc.1
|
|
40
|
+
def create_relation(object, association)
|
|
41
|
+
type = @attributes[association.inverse_type]
|
|
42
|
+
target = association.build(self, object, type)
|
|
43
|
+
target ? association.create_relation(self, target) : nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Resets the criteria inside the relation proxy. Used by many-to-many
|
|
47
|
+
# relations to keep the underlying ids array in sync.
|
|
48
|
+
#
|
|
49
|
+
# @example Reset the relation criteria.
|
|
50
|
+
# person.reset_relation_criteria(:preferences)
|
|
51
|
+
#
|
|
52
|
+
# @param [ Symbol ] name The name of the relation.
|
|
53
|
+
#
|
|
54
|
+
# @since 3.0.14
|
|
55
|
+
def reset_relation_criteria(name)
|
|
56
|
+
if instance_variable_defined?("@_#{name}")
|
|
57
|
+
send(name).reset_unloaded
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Set the supplied relation to an instance variable on the class with the
|
|
62
|
+
# provided name. Used as a helper just for code cleanliness.
|
|
63
|
+
#
|
|
64
|
+
# @example Set the proxy on the document.
|
|
65
|
+
# person.set(:addresses, addresses)
|
|
66
|
+
#
|
|
67
|
+
# @param [ String, Symbol ] name The name of the relation.
|
|
68
|
+
# @param [ Proxy ] relation The relation to set.
|
|
69
|
+
#
|
|
70
|
+
# @return [ Proxy ] The relation.
|
|
71
|
+
#
|
|
72
|
+
# @since 2.0.0.rc.1
|
|
73
|
+
def set_relation(name, relation)
|
|
74
|
+
instance_variable_set("@_#{name}", relation)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# Get the relation. Extracted out from the getter method to avoid
|
|
80
|
+
# infinite recursion when overriding the getter.
|
|
81
|
+
#
|
|
82
|
+
# @api private
|
|
83
|
+
#
|
|
84
|
+
# @example Get the relation.
|
|
85
|
+
# document.get_relation(:name, association)
|
|
86
|
+
#
|
|
87
|
+
# @param [ Symbol ] name The name of the relation.
|
|
88
|
+
# @param [ Association ] association The association metadata.
|
|
89
|
+
# @param [ Object ] object The object used to build the relation.
|
|
90
|
+
# @param [ true, false ] reload If the relation is to be reloaded.
|
|
91
|
+
#
|
|
92
|
+
# @return [ Proxy ] The relation.
|
|
93
|
+
#
|
|
94
|
+
# @since 3.0.16
|
|
95
|
+
def get_relation(name, association, object, reload = false)
|
|
96
|
+
if !reload && (value = ivar(name)) != false
|
|
97
|
+
value
|
|
98
|
+
else
|
|
99
|
+
_building do
|
|
100
|
+
_loading do
|
|
101
|
+
if object && needs_no_database_query?(object, association)
|
|
102
|
+
__build__(name, object, association)
|
|
103
|
+
else
|
|
104
|
+
__build__(name, attributes[association.key], association)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def needs_no_database_query?(object, association)
|
|
112
|
+
object.is_a?(Document) && !object.embedded? &&
|
|
113
|
+
object._id == attributes[association.key]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Is the current code executing without autobuild functionality?
|
|
117
|
+
#
|
|
118
|
+
# @example Is autobuild disabled?
|
|
119
|
+
# document.without_autobuild?
|
|
120
|
+
#
|
|
121
|
+
# @return [ true, false ] If autobuild is disabled.
|
|
122
|
+
#
|
|
123
|
+
# @since 3.0.0
|
|
124
|
+
def without_autobuild?
|
|
125
|
+
Threaded.executing?(:without_autobuild)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Yield to the block with autobuild functionality turned off.
|
|
129
|
+
#
|
|
130
|
+
# @example Execute without autobuild.
|
|
131
|
+
# document.without_autobuild do
|
|
132
|
+
# document.name
|
|
133
|
+
# end
|
|
134
|
+
#
|
|
135
|
+
# @return [ Object ] The result of the yield.
|
|
136
|
+
#
|
|
137
|
+
# @since 3.0.0
|
|
138
|
+
def without_autobuild
|
|
139
|
+
Threaded.begin_execution("without_autobuild")
|
|
140
|
+
yield
|
|
141
|
+
ensure
|
|
142
|
+
Threaded.exit_execution("without_autobuild")
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Parse out the attributes and the options from the args passed to a
|
|
146
|
+
# build_ or create_ methods.
|
|
147
|
+
#
|
|
148
|
+
# @example Parse the args.
|
|
149
|
+
# doc.parse_args(:name => "Joe")
|
|
150
|
+
#
|
|
151
|
+
# @param [ Array ] args The arguments.
|
|
152
|
+
#
|
|
153
|
+
# @return [ Array<Hash> ] The attributes and options.
|
|
154
|
+
#
|
|
155
|
+
# @since 2.3.4
|
|
156
|
+
def parse_args(*args)
|
|
157
|
+
[args.first || {}, args.size > 1 ? args[1] : {}]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Adds the existence check for relations.
|
|
161
|
+
#
|
|
162
|
+
# @example Add the existence check.
|
|
163
|
+
# Person.define_existence_check!(association)
|
|
164
|
+
#
|
|
165
|
+
# @example Check if a relation exists.
|
|
166
|
+
# person = Person.new
|
|
167
|
+
# person.has_game?
|
|
168
|
+
# person.game?
|
|
169
|
+
#
|
|
170
|
+
# @param [ Association ] association The association.
|
|
171
|
+
#
|
|
172
|
+
# @return [ Class ] The model being set up.
|
|
173
|
+
#
|
|
174
|
+
# @since 3.0.0
|
|
175
|
+
def self.define_existence_check!(association)
|
|
176
|
+
name = association.name
|
|
177
|
+
association.inverse_class.tap do |klass|
|
|
178
|
+
klass.module_eval <<-END, __FILE__, __LINE__ + 1
|
|
179
|
+
def #{name}?
|
|
180
|
+
without_autobuild { !__send__(:#{name}).blank? }
|
|
181
|
+
end
|
|
182
|
+
alias :has_#{name}? :#{name}?
|
|
183
|
+
END
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Defines the getter for the relation. Nothing too special here: just
|
|
188
|
+
# return the instance variable for the relation if it exists or build
|
|
189
|
+
# the thing.
|
|
190
|
+
#
|
|
191
|
+
# @example Set up the getter for the relation.
|
|
192
|
+
# Person.define_getter!(association)
|
|
193
|
+
#
|
|
194
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
195
|
+
#
|
|
196
|
+
# @return [ Class ] The class being set up.
|
|
197
|
+
#
|
|
198
|
+
# @since 2.0.0.rc.1
|
|
199
|
+
def self.define_getter!(association)
|
|
200
|
+
name = association.name
|
|
201
|
+
association.inverse_class.tap do |klass|
|
|
202
|
+
klass.re_define_method(name) do |reload = false|
|
|
203
|
+
value = get_relation(name, association, nil, reload)
|
|
204
|
+
if value.nil? && association.autobuilding? && !without_autobuild?
|
|
205
|
+
value = send("build_#{name}")
|
|
206
|
+
end
|
|
207
|
+
value
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Defines the getter for the ids of documents in the relation. Should
|
|
213
|
+
# be specify only for referenced many relations.
|
|
214
|
+
#
|
|
215
|
+
# @example Set up the ids getter for the relation.
|
|
216
|
+
# Person.define_ids_getter!(association)
|
|
217
|
+
#
|
|
218
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
219
|
+
#
|
|
220
|
+
# @return [ Class ] The class being set up.
|
|
221
|
+
def self.define_ids_getter!(association)
|
|
222
|
+
ids_method = "#{association.name.to_s.singularize}_ids"
|
|
223
|
+
association.inverse_class.tap do |klass|
|
|
224
|
+
klass.re_define_method(ids_method) do
|
|
225
|
+
send(association.name).only(:id).map(&:id)
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Defines the setter for the relation. This does a few things based on
|
|
231
|
+
# some conditions. If there is an existing association, a target
|
|
232
|
+
# substitution will take place, otherwise a new relation will be
|
|
233
|
+
# created with the supplied target.
|
|
234
|
+
#
|
|
235
|
+
# @example Set up the setter for the relation.
|
|
236
|
+
# Person.define_setter!(association)
|
|
237
|
+
#
|
|
238
|
+
# @param [ Association ] association The association metadata for the relation.
|
|
239
|
+
#
|
|
240
|
+
# @return [ Class ] The class being set up.
|
|
241
|
+
#
|
|
242
|
+
# @since 2.0.0.rc.1
|
|
243
|
+
def self.define_setter!(association)
|
|
244
|
+
name = association.name
|
|
245
|
+
association.inverse_class.tap do |klass|
|
|
246
|
+
klass.re_define_method("#{name}=") do |object|
|
|
247
|
+
without_autobuild do
|
|
248
|
+
if value = get_relation(name, association, object)
|
|
249
|
+
if value.respond_to?(:substitute)
|
|
250
|
+
set_relation(name, value.substitute(object.substitutable))
|
|
251
|
+
else
|
|
252
|
+
value = __build__(name, value, association)
|
|
253
|
+
set_relation(name, value.substitute(object.substitutable))
|
|
254
|
+
end
|
|
255
|
+
else
|
|
256
|
+
__build__(name, object.substitutable, association)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Defines the setter method that allows you to set documents
|
|
264
|
+
# in this relation by their ids. The defined setter, finds
|
|
265
|
+
# documents with given ids and invokes regular relation setter
|
|
266
|
+
# with found documents. Ids setters should be defined only for
|
|
267
|
+
# referenced many relations.
|
|
268
|
+
#
|
|
269
|
+
# @example Set up the id_setter for the relation.
|
|
270
|
+
# Person.define_ids_setter!(association)
|
|
271
|
+
#
|
|
272
|
+
# @param [ Association ] association The association for the relation.
|
|
273
|
+
#
|
|
274
|
+
# @return [ Class ] The class being set up.
|
|
275
|
+
def self.define_ids_setter!(association)
|
|
276
|
+
ids_method = "#{association.name.to_s.singularize}_ids="
|
|
277
|
+
association.inverse_class.tap do |klass|
|
|
278
|
+
klass.re_define_method(ids_method) do |ids|
|
|
279
|
+
send(association.setter, association.relation_class.find(ids.reject(&:blank?)))
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# Defines a builder method for an embeds_one relation. This is
|
|
285
|
+
# defined as #build_name.
|
|
286
|
+
#
|
|
287
|
+
# @example
|
|
288
|
+
# Person.define_builder!(association)
|
|
289
|
+
#
|
|
290
|
+
# @param [ Association ] association The association for the relation.
|
|
291
|
+
#
|
|
292
|
+
# @return [ Class ] The class being set up.
|
|
293
|
+
#
|
|
294
|
+
# @since 2.0.0.rc.1
|
|
295
|
+
def self.define_builder!(association)
|
|
296
|
+
name = association.name
|
|
297
|
+
association.inverse_class.tap do |klass|
|
|
298
|
+
klass.re_define_method("build_#{name}") do |*args|
|
|
299
|
+
attributes, _options = parse_args(*args)
|
|
300
|
+
document = Factory.build(association.relation_class, attributes)
|
|
301
|
+
_building do
|
|
302
|
+
child = send("#{name}=", document)
|
|
303
|
+
child.run_callbacks(:build)
|
|
304
|
+
child
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# Defines a creator method for an embeds_one relation. This is
|
|
311
|
+
# defined as #create_name. After the object is built it will
|
|
312
|
+
# immediately save.
|
|
313
|
+
#
|
|
314
|
+
# @example
|
|
315
|
+
# Person.define_creator!(association)
|
|
316
|
+
#
|
|
317
|
+
# @param [ Association ] association The association for the relation.
|
|
318
|
+
#
|
|
319
|
+
# @return [ Class ] The class being set up.
|
|
320
|
+
#
|
|
321
|
+
# @since 2.0.0.rc.1
|
|
322
|
+
def self.define_creator!(association)
|
|
323
|
+
name = association.name
|
|
324
|
+
association.inverse_class.tap do |klass|
|
|
325
|
+
klass.re_define_method("create_#{name}") do |*args|
|
|
326
|
+
attributes, _options = parse_args(*args)
|
|
327
|
+
document = Factory.build(association.klass, attributes)
|
|
328
|
+
doc = _assigning do
|
|
329
|
+
send("#{name}=", document)
|
|
330
|
+
end
|
|
331
|
+
doc.save
|
|
332
|
+
save if new_record? && association.stores_foreign_key?
|
|
333
|
+
doc
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|