mongoid 2.8.1 → 3.0.0.rc
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.
- data/CHANGELOG.md +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +69 -50
- data/lib/mongoid/errors.rb +22 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/extensions/array.rb +127 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +26 -0
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- data/lib/mongoid/relations/accessors.rb +119 -19
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +3 -3
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/cascading.rb +6 -4
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +117 -132
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +69 -25
- metadata +110 -137
- checksums.yaml +0 -7
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -110
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -77
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
data/lib/mongoid/reloading.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
# This module handles reloading behaviour of documents.
|
4
4
|
module Reloading
|
5
5
|
|
@@ -16,18 +16,16 @@ module Mongoid #:nodoc:
|
|
16
16
|
#
|
17
17
|
# @since 1.0.0
|
18
18
|
def reload
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
@attributes = reloaded
|
24
|
-
end
|
25
|
-
tap do |doc|
|
26
|
-
doc.changed_attributes.clear
|
27
|
-
doc.apply_defaults
|
28
|
-
doc.reload_relations
|
29
|
-
doc.run_callbacks(:initialize)
|
19
|
+
reloaded = _reload
|
20
|
+
if Mongoid.raise_not_found_error && reloaded.empty?
|
21
|
+
raise Errors::DocumentNotFound.new(self.class, id, id)
|
30
22
|
end
|
23
|
+
@attributes = reloaded
|
24
|
+
changed_attributes.clear
|
25
|
+
apply_defaults
|
26
|
+
reload_relations
|
27
|
+
run_callbacks(:initialize)
|
28
|
+
self
|
31
29
|
end
|
32
30
|
|
33
31
|
private
|
@@ -54,7 +52,7 @@ module Mongoid #:nodoc:
|
|
54
52
|
#
|
55
53
|
# @since 2.3.2
|
56
54
|
def reload_root_document
|
57
|
-
{}.merge(collection.
|
55
|
+
{}.merge(collection.find(_id: id).one || {})
|
58
56
|
end
|
59
57
|
|
60
58
|
# Reload the embedded document.
|
@@ -67,7 +65,7 @@ module Mongoid #:nodoc:
|
|
67
65
|
# @since 2.3.2
|
68
66
|
def reload_embedded_document
|
69
67
|
extract_embedded_attributes({}.merge(
|
70
|
-
_root.collection.
|
68
|
+
_root.collection.find(_id: _root.id).one
|
71
69
|
))
|
72
70
|
end
|
73
71
|
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module contains behaviour for all Mongoid scoping - named scopes,
|
5
|
+
# default scopes, and criteria accessors via scoped and unscoped.
|
6
|
+
module Scoping
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
class_attribute :default_scoping
|
11
|
+
class_attribute :scopes
|
12
|
+
self.scopes = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
|
17
|
+
# Add a default scope to the model. This scope will be applied to all
|
18
|
+
# criteria unless #unscoped is specified.
|
19
|
+
#
|
20
|
+
# @example Define a default scope with a criteria.
|
21
|
+
# class Band
|
22
|
+
# include Mongoid::Document
|
23
|
+
# field :active, type: Boolean
|
24
|
+
# default_scope where(active: true)
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# @example Define a default scope with a proc.
|
28
|
+
# class Band
|
29
|
+
# include Mongoid::Document
|
30
|
+
# field :active, type: Boolean
|
31
|
+
# default_scope ->{ where(active: true) }
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @param [ Proc, Criteria ] scope The default scope.
|
35
|
+
#
|
36
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
|
37
|
+
#
|
38
|
+
# @return [ Proc ] The default scope.
|
39
|
+
#
|
40
|
+
# @since 1.0.0
|
41
|
+
def default_scope(value)
|
42
|
+
check_scope_validity(value)
|
43
|
+
self.default_scoping = value.to_proc
|
44
|
+
end
|
45
|
+
|
46
|
+
# Is the class able to have the default scope applied?
|
47
|
+
#
|
48
|
+
# @example Can the default scope be applied?
|
49
|
+
# Band.default_scopable?
|
50
|
+
#
|
51
|
+
# @return [ true, false ] If the default scope can be applied.
|
52
|
+
#
|
53
|
+
# @since 3.0.0
|
54
|
+
def default_scopable?
|
55
|
+
default_scoping? && !Threaded.executing?(:without_default_scope)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Get a queryable, either the last one on the scope stack or a fresh one.
|
59
|
+
#
|
60
|
+
# @api private
|
61
|
+
#
|
62
|
+
# @example Get a queryable.
|
63
|
+
# Model.queryable
|
64
|
+
#
|
65
|
+
# @return [ Criteria ] The queryable.
|
66
|
+
#
|
67
|
+
# @since 3.0.0
|
68
|
+
def queryable
|
69
|
+
scope_stack.last || Criteria.new(self)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Create a scope that can be accessed from the class level or chained to
|
73
|
+
# criteria by the provided name.
|
74
|
+
#
|
75
|
+
# @example Create named scopes.
|
76
|
+
#
|
77
|
+
# class Person
|
78
|
+
# include Mongoid::Document
|
79
|
+
# field :active, type: Boolean
|
80
|
+
# field :count, type: Integer
|
81
|
+
#
|
82
|
+
# scope :active, where(active: true)
|
83
|
+
# scope :at_least, ->(count){ where(:count.gt => count) }
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# @param [ Symbol ] name The name of the scope.
|
87
|
+
# @param [ Proc, Criteria ] conditions The conditions of the scope.
|
88
|
+
#
|
89
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
|
90
|
+
# @raise [ Errors::ScopeOverwrite ] If the scope name already exists.
|
91
|
+
#
|
92
|
+
# @since 1.0.0
|
93
|
+
def scope(name, value, &block)
|
94
|
+
normalized = name.to_sym
|
95
|
+
check_scope_validity(value)
|
96
|
+
check_scope_name(normalized)
|
97
|
+
scopes[normalized] = {
|
98
|
+
scope: strip_default_scope(value),
|
99
|
+
extension: Module.new(&block)
|
100
|
+
}
|
101
|
+
define_scope_method(normalized)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Initializes and returns the current scope stack.
|
105
|
+
#
|
106
|
+
# @example Get the scope stack.
|
107
|
+
# Person.scope_stack
|
108
|
+
#
|
109
|
+
# @return [ Array<Criteria> ] The scope stack.
|
110
|
+
#
|
111
|
+
# @since 1.0.0
|
112
|
+
def scope_stack
|
113
|
+
Threaded.scope_stack[object_id] ||= []
|
114
|
+
end
|
115
|
+
|
116
|
+
# Get a criteria for the document with normal scoping.
|
117
|
+
#
|
118
|
+
# @example Get the criteria.
|
119
|
+
# Band.scoped(skip: 10)
|
120
|
+
#
|
121
|
+
# @note This will force the default scope to be applied.
|
122
|
+
#
|
123
|
+
# @param [ Hash ] options Query options for the criteria.
|
124
|
+
#
|
125
|
+
# @option options [ Integer ] :skip Optional number of documents to skip.
|
126
|
+
# @option options [ Integer ] :limit Optional number of documents to
|
127
|
+
# limit.
|
128
|
+
# @option options [ Array ] :sort Optional sorting options.
|
129
|
+
#
|
130
|
+
# @return [ Criteria ] A scoped criteria.
|
131
|
+
#
|
132
|
+
# @since 3.0.0
|
133
|
+
def scoped(options = nil)
|
134
|
+
queryable.scoped(options)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Get the criteria without the default scoping applied.
|
138
|
+
#
|
139
|
+
# @example Get the unscoped criteria.
|
140
|
+
# Band.unscoped
|
141
|
+
#
|
142
|
+
# @example Yield to block with no default scoping.
|
143
|
+
# Band.unscoped do
|
144
|
+
# Band.where(name: "Depeche Mode")
|
145
|
+
# end
|
146
|
+
#
|
147
|
+
# @note This will force the default scope to be removed.
|
148
|
+
#
|
149
|
+
# @return [ Criteria, Object ] The unscoped criteria or result of the
|
150
|
+
# block.
|
151
|
+
#
|
152
|
+
# @since 3.0.0
|
153
|
+
def unscoped
|
154
|
+
if block_given?
|
155
|
+
without_default_scope do
|
156
|
+
yield(self)
|
157
|
+
end
|
158
|
+
else
|
159
|
+
queryable.unscoped
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# Get a criteria with the default scope applied, if possible.
|
164
|
+
#
|
165
|
+
# @example Get a criteria with the default scope.
|
166
|
+
# Model.with_default_scope
|
167
|
+
#
|
168
|
+
# @return [ Criteria ] The criteria.
|
169
|
+
#
|
170
|
+
# @since 3.0.0
|
171
|
+
def with_default_scope
|
172
|
+
queryable.with_default_scope
|
173
|
+
end
|
174
|
+
alias :criteria :with_default_scope
|
175
|
+
|
176
|
+
# Pushes the provided criteria onto the scope stack, and removes it after the
|
177
|
+
# provided block is yielded.
|
178
|
+
#
|
179
|
+
# @example Yield to the criteria.
|
180
|
+
# Person.with_scope(criteria)
|
181
|
+
#
|
182
|
+
# @param [ Criteria ] criteria The criteria to apply.
|
183
|
+
#
|
184
|
+
# @return [ Criteria ] The yielded criteria.
|
185
|
+
#
|
186
|
+
# @since 1.0.0
|
187
|
+
def with_scope(criteria)
|
188
|
+
scope_stack.push(criteria)
|
189
|
+
begin
|
190
|
+
yield criteria
|
191
|
+
ensure
|
192
|
+
scope_stack.pop
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
# Execute the block without applying the default scope.
|
197
|
+
#
|
198
|
+
# @example Execute without the default scope.
|
199
|
+
# Band.without_default_scope do
|
200
|
+
# Band.where(name: "Depeche Mode")
|
201
|
+
# end
|
202
|
+
#
|
203
|
+
# @return [ Object ] The result of the block.
|
204
|
+
#
|
205
|
+
# @since 3.0.0
|
206
|
+
def without_default_scope
|
207
|
+
Threaded.begin("without_default_scope")
|
208
|
+
yield
|
209
|
+
ensure
|
210
|
+
Threaded.exit("without_default_scope")
|
211
|
+
end
|
212
|
+
|
213
|
+
private
|
214
|
+
|
215
|
+
# Warns or raises exception if overriding another scope or method.
|
216
|
+
#
|
217
|
+
# @api private
|
218
|
+
#
|
219
|
+
# @example Warn or raise error if name exists.
|
220
|
+
# Model.valid_scope_name?("test")
|
221
|
+
#
|
222
|
+
# @param [ String, Symbol ] name The name of the scope.
|
223
|
+
#
|
224
|
+
# @raise [ Errors::ScopeOverwrite ] If the name exists and configured to
|
225
|
+
# raise the error.
|
226
|
+
#
|
227
|
+
# @since 2.1.0
|
228
|
+
def check_scope_name(name)
|
229
|
+
if scopes[name] || respond_to?(name, true)
|
230
|
+
if Mongoid.scope_overwrite_exception
|
231
|
+
raise Errors::ScopeOverwrite.new(self.name, name)
|
232
|
+
else
|
233
|
+
if Mongoid.logger
|
234
|
+
Mongoid.logger.warn(
|
235
|
+
"Creating scope :#{name}. " +
|
236
|
+
"Overwriting existing method #{self.name}.#{name}."
|
237
|
+
)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
# Checks if the intended scope is a valid object, either a criteria or
|
244
|
+
# proc with a criteria.
|
245
|
+
#
|
246
|
+
# @api private
|
247
|
+
#
|
248
|
+
# @example Check if the scope is valid.
|
249
|
+
# Model.check_scope_validity({})
|
250
|
+
#
|
251
|
+
# @param [ Object ] value The intended scope.
|
252
|
+
#
|
253
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a valid object.
|
254
|
+
#
|
255
|
+
# @since 3.0.0
|
256
|
+
def check_scope_validity(value)
|
257
|
+
unless value.respond_to?(:to_proc)
|
258
|
+
raise Errors::InvalidScope.new(self, value)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
# Defines the actual class method that will execute the scope when
|
263
|
+
# called.
|
264
|
+
#
|
265
|
+
# @api private
|
266
|
+
#
|
267
|
+
# @example Define the scope class method.
|
268
|
+
# Model.define_scope_method(:active)
|
269
|
+
#
|
270
|
+
# @param [ Symbol ] name The method/scope name.
|
271
|
+
#
|
272
|
+
# @return [ Method ] The defined method.
|
273
|
+
#
|
274
|
+
# @since 3.0.0
|
275
|
+
def define_scope_method(name)
|
276
|
+
(class << self; self; end).class_eval <<-SCOPE
|
277
|
+
def #{name}(*args)
|
278
|
+
scoping = scopes[:#{name}]
|
279
|
+
scope, extension = scoping[:scope][*args], scoping[:extension]
|
280
|
+
criteria = with_default_scope.merge(scope)
|
281
|
+
criteria.extend(extension)
|
282
|
+
criteria
|
283
|
+
end
|
284
|
+
SCOPE
|
285
|
+
end
|
286
|
+
|
287
|
+
# When inheriting, we want to copy the scopes from the parent class and
|
288
|
+
# set the on the child to start, mimicking the behaviour of the old
|
289
|
+
# class_inheritable_accessor that was deprecated in Rails edge.
|
290
|
+
#
|
291
|
+
# @api private
|
292
|
+
#
|
293
|
+
# @example Inherit from this class.
|
294
|
+
# Person.inherited(Doctor)
|
295
|
+
#
|
296
|
+
# @param [ Class ] subclass The inheriting class.
|
297
|
+
#
|
298
|
+
# @since 2.0.0.rc.6
|
299
|
+
def inherited(subclass)
|
300
|
+
super
|
301
|
+
subclass.scopes = scopes.dup
|
302
|
+
end
|
303
|
+
|
304
|
+
# Strip the default scope from the provided value, if it is a criteria.
|
305
|
+
# This is used by named scopes - they should not have the default scoping
|
306
|
+
# applied to them.
|
307
|
+
#
|
308
|
+
# @api private
|
309
|
+
#
|
310
|
+
# @example Strip the default scope.
|
311
|
+
# Model.strip_default_scope
|
312
|
+
#
|
313
|
+
# @param [ Proc, Criteria ] value The value to strip from.
|
314
|
+
#
|
315
|
+
# @return [ Proc ] The stripped criteria, as a proc.
|
316
|
+
#
|
317
|
+
# @since 3.0.0
|
318
|
+
def strip_default_scope(value)
|
319
|
+
if value.is_a?(Criteria)
|
320
|
+
default = default_scoping.try(:call)
|
321
|
+
value.remove_scoping(default)
|
322
|
+
value.to_proc
|
323
|
+
else
|
324
|
+
value
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
2
|
+
module Mongoid
|
3
3
|
|
4
4
|
# This module provides the extra behaviour for including relations in JSON
|
5
5
|
# and XML serialization.
|
@@ -33,7 +33,7 @@ module Mongoid # :nodoc:
|
|
33
33
|
|
34
34
|
except |= ['_type'] unless Mongoid.include_type_for_serialization
|
35
35
|
|
36
|
-
field_names =
|
36
|
+
field_names = self.class.attribute_names
|
37
37
|
attribute_names = (as_document.keys + field_names).sort
|
38
38
|
if only.any?
|
39
39
|
attribute_names &= only
|
@@ -45,8 +45,9 @@ module Mongoid # :nodoc:
|
|
45
45
|
name.to_s if respond_to?(name)
|
46
46
|
end.compact
|
47
47
|
|
48
|
-
{}
|
49
|
-
|
48
|
+
attrs = {}
|
49
|
+
(attribute_names + method_names).each do |name|
|
50
|
+
without_autobuild do
|
50
51
|
if relations.has_key?(name)
|
51
52
|
value = send(name)
|
52
53
|
attrs[name] = value ? value.serializable_hash(options) : nil
|
@@ -56,29 +57,9 @@ module Mongoid # :nodoc:
|
|
56
57
|
attrs[name] = send(name)
|
57
58
|
end
|
58
59
|
end
|
59
|
-
serialize_relations(attrs, options) if options[:include]
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
class << self
|
64
|
-
|
65
|
-
# Serialize the provided object into a Mongo friendly value, using the
|
66
|
-
# field serialization method for the passed in type. If no type is
|
67
|
-
# given then we assume generic object serialization, which just returns
|
68
|
-
# the value itself.
|
69
|
-
#
|
70
|
-
# @example Mongoize the object.
|
71
|
-
# Mongoid::Serialization.mongoize(time, Time)
|
72
|
-
#
|
73
|
-
# @param [ Object ] object The object to convert.
|
74
|
-
# @param [ Class ] klass The type of the object.
|
75
|
-
#
|
76
|
-
# @return [ Object ] The converted object.
|
77
|
-
#
|
78
|
-
# @since 2.1.0
|
79
|
-
def mongoize(object, klass = Object)
|
80
|
-
Fields::Mappings.for(klass).instantiate(:mongoize).serialize(object)
|
81
60
|
end
|
61
|
+
serialize_relations(attrs, options) if options[:include]
|
62
|
+
attrs
|
82
63
|
end
|
83
64
|
|
84
65
|
private
|
@@ -139,7 +120,7 @@ module Mongoid # :nodoc:
|
|
139
120
|
if inclusions.is_a?(Hash)
|
140
121
|
inclusions[name]
|
141
122
|
else
|
142
|
-
{ :
|
123
|
+
{ except: options[:except], only: options[:only] }
|
143
124
|
end
|
144
125
|
end
|
145
126
|
end
|
@@ -0,0 +1,359 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/sessions/factory"
|
3
|
+
require "mongoid/sessions/validators"
|
4
|
+
|
5
|
+
module Mongoid
|
6
|
+
module Sessions
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
cattr_accessor :default_collection_name, :storage_options
|
11
|
+
self.default_collection_name = self.name.collectionize.to_sym
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get the collection for this model from the session. Will check for an
|
15
|
+
# overridden collection name from the store_in macro or the collection
|
16
|
+
# with a pluralized model name.
|
17
|
+
#
|
18
|
+
# @example Get the model's collection.
|
19
|
+
# Model.collection
|
20
|
+
#
|
21
|
+
# @return [ Moped::Collection ] The collection.
|
22
|
+
#
|
23
|
+
# @since 3.0.0
|
24
|
+
def collection
|
25
|
+
self.class.collection
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get the name of the collection this model persists to. This will be
|
29
|
+
# either the pluralized class name or the option defined in the store_in
|
30
|
+
# macro.
|
31
|
+
#
|
32
|
+
# @example Get the collection name.
|
33
|
+
# Model.collection_name
|
34
|
+
#
|
35
|
+
# @return [ String ] The name of the collection.
|
36
|
+
#
|
37
|
+
# @since 3.0.0
|
38
|
+
def collection_name
|
39
|
+
self.class.collection_name
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get the session for this model. This is determined in the following order:
|
43
|
+
#
|
44
|
+
# 1. Any custom configuration provided by the 'store_in' macro.
|
45
|
+
# 2. The 'default' session as provided in the mongoid.yml
|
46
|
+
#
|
47
|
+
# @example Get the session.
|
48
|
+
# model.mongo_session
|
49
|
+
#
|
50
|
+
# @return [ Moped::Session ] The default moped session.
|
51
|
+
#
|
52
|
+
# @since 3.0.0
|
53
|
+
def mongo_session
|
54
|
+
self.class.mongo_session
|
55
|
+
end
|
56
|
+
|
57
|
+
# Tell the next persistance operation to store in a specific collection,
|
58
|
+
# database or session.
|
59
|
+
#
|
60
|
+
# @example Save the current document to a different collection.
|
61
|
+
# model.with(collection: "secondary").save
|
62
|
+
#
|
63
|
+
# @example Save the current document to a different database.
|
64
|
+
# model.with(database: "secondary").save
|
65
|
+
#
|
66
|
+
# @example Save the current document to a different session.
|
67
|
+
# model.with(session: "replica_set").save
|
68
|
+
#
|
69
|
+
# @example Save with a combination of options.
|
70
|
+
# model.with(session: "sharded", database: "secondary").save
|
71
|
+
#
|
72
|
+
# @param [ Hash ] options The storage options.
|
73
|
+
#
|
74
|
+
# @option options [ String, Symbol ] :collection The collection name.
|
75
|
+
# @option options [ String, Symbol ] :database The database name.
|
76
|
+
# @option options [ String, Symbol ] :session The session name.
|
77
|
+
#
|
78
|
+
# @return [ Document ] The current document.
|
79
|
+
#
|
80
|
+
# @since 3.0.0
|
81
|
+
def with(options)
|
82
|
+
Threaded.set_persistence_options(self.class, options)
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
class << self
|
87
|
+
|
88
|
+
# Clear all sessions from the current thread.
|
89
|
+
#
|
90
|
+
# @example Clear all sessions.
|
91
|
+
# Mongoid::Sessions.clear
|
92
|
+
#
|
93
|
+
# @return [ Array ] The empty sessions.
|
94
|
+
#
|
95
|
+
# @since 3.0.0
|
96
|
+
def clear
|
97
|
+
Threaded.sessions.clear
|
98
|
+
end
|
99
|
+
|
100
|
+
# Get the default session.
|
101
|
+
#
|
102
|
+
# @example Get the default session.
|
103
|
+
# Mongoid::Sessions.default
|
104
|
+
#
|
105
|
+
# @return [ Moped::Session ] The default session.
|
106
|
+
#
|
107
|
+
# @since 3.0.0
|
108
|
+
def default
|
109
|
+
Threaded.sessions[:default] ||= Sessions::Factory.default
|
110
|
+
end
|
111
|
+
|
112
|
+
# Get a session with the provided name.
|
113
|
+
#
|
114
|
+
# @example Get a session with the name.
|
115
|
+
# Mongoid::Sessions.with_name(:replica)
|
116
|
+
#
|
117
|
+
# @param [ Symbol ] name The name of the session.
|
118
|
+
#
|
119
|
+
# @return [ Moped::Session ] The named session.
|
120
|
+
#
|
121
|
+
# @since 3.0.0
|
122
|
+
def with_name(name)
|
123
|
+
Threaded.sessions[name.to_sym] ||= Sessions::Factory.create(name)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
module ClassMethods
|
128
|
+
|
129
|
+
# Clear all persistence options from the current thread.
|
130
|
+
#
|
131
|
+
# @example Clear the persistence options.
|
132
|
+
# Mongoid::Sessions.clear_persistence_options
|
133
|
+
#
|
134
|
+
# @return [ true ] True.
|
135
|
+
#
|
136
|
+
# @since 3.0.0
|
137
|
+
def clear_persistence_options
|
138
|
+
Threaded.clear_persistence_options(self)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Get the collection for this model from the session. Will check for an
|
142
|
+
# overridden collection name from the store_in macro or the collection
|
143
|
+
# with a pluralized model name.
|
144
|
+
#
|
145
|
+
# @example Get the model's collection.
|
146
|
+
# Model.collection
|
147
|
+
#
|
148
|
+
# @return [ Moped::Collection ] The collection.
|
149
|
+
#
|
150
|
+
# @since 3.0.0
|
151
|
+
def collection
|
152
|
+
if opts = persistence_options
|
153
|
+
coll = mongo_session.with(opts)[opts[:collection] || collection_name]
|
154
|
+
clear_persistence_options
|
155
|
+
coll
|
156
|
+
else
|
157
|
+
mongo_session[collection_name]
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# Get the name of the collection this model persists to. This will be
|
162
|
+
# either the pluralized class name or the option defined in the store_in
|
163
|
+
# macro.
|
164
|
+
#
|
165
|
+
# @example Get the collection name.
|
166
|
+
# Model.collection_name
|
167
|
+
#
|
168
|
+
# @return [ Symbol ] The name of the collection.
|
169
|
+
#
|
170
|
+
# @since 3.0.0
|
171
|
+
def collection_name
|
172
|
+
@collection_name ||= __collection_name__
|
173
|
+
end
|
174
|
+
|
175
|
+
# Get the default database name for this model.
|
176
|
+
#
|
177
|
+
# @example Get the default database name.
|
178
|
+
# Model.database_name
|
179
|
+
#
|
180
|
+
# @return [ Symbol ] The name of the database.
|
181
|
+
#
|
182
|
+
# @since 3.0.0
|
183
|
+
def database_name
|
184
|
+
@database_name ||= __database_name__
|
185
|
+
end
|
186
|
+
|
187
|
+
# Get the session for this model. This is determined in the following order:
|
188
|
+
#
|
189
|
+
# 1. Any custom configuration provided by the 'store_in' macro.
|
190
|
+
# 2. The 'default' session as provided in the mongoid.yml
|
191
|
+
#
|
192
|
+
# @example Get the session.
|
193
|
+
# Model.mongo_session
|
194
|
+
#
|
195
|
+
# @return [ Moped::Session ] The default moped session.
|
196
|
+
#
|
197
|
+
# @since 3.0.0
|
198
|
+
def mongo_session
|
199
|
+
session = __session__
|
200
|
+
if persistence_options && name = persistence_options[:database]
|
201
|
+
session.use(name)
|
202
|
+
else
|
203
|
+
session.use(database_name)
|
204
|
+
end
|
205
|
+
session
|
206
|
+
end
|
207
|
+
|
208
|
+
# Get the persistence options from the current thread.
|
209
|
+
#
|
210
|
+
# @example Get the persistence options.
|
211
|
+
# Model.persistence_options
|
212
|
+
#
|
213
|
+
# @return [ Hash ] The persistence options.
|
214
|
+
#
|
215
|
+
# @since 3.0.0
|
216
|
+
def persistence_options
|
217
|
+
Threaded.persistence_options(self)
|
218
|
+
end
|
219
|
+
|
220
|
+
# Give this model specific custom default storage options.
|
221
|
+
#
|
222
|
+
# @example Store this model by default in "artists"
|
223
|
+
# class Band
|
224
|
+
# include Mongoid::Document
|
225
|
+
# store_in collection: "artists"
|
226
|
+
# end
|
227
|
+
#
|
228
|
+
# @example Store this model by default in the sharded db.
|
229
|
+
# class Band
|
230
|
+
# include Mongoid::Document
|
231
|
+
# store_in database: "echo_shard"
|
232
|
+
# end
|
233
|
+
#
|
234
|
+
# @example Store this model by default in a different session.
|
235
|
+
# class Band
|
236
|
+
# include Mongoid::Document
|
237
|
+
# store_in session: "secondary"
|
238
|
+
# end
|
239
|
+
#
|
240
|
+
# @example Store this model with a combination of options.
|
241
|
+
# class Band
|
242
|
+
# include Mongoid::Document
|
243
|
+
# store_in collection: "artists", database: "secondary"
|
244
|
+
# end
|
245
|
+
#
|
246
|
+
# @param [ Hash ] options The storage options.
|
247
|
+
#
|
248
|
+
# @option options [ String, Symbol ] :collection The collection name.
|
249
|
+
# @option options [ String, Symbol ] :database The database name.
|
250
|
+
# @option options [ String, Symbol ] :session The session name.
|
251
|
+
#
|
252
|
+
# @return [ Class ] The model class.
|
253
|
+
#
|
254
|
+
# @since 3.0.0
|
255
|
+
def store_in(options)
|
256
|
+
Validators::Storage.validate(self, options)
|
257
|
+
@collection_name, @database_name = nil, nil
|
258
|
+
self.storage_options = options
|
259
|
+
end
|
260
|
+
|
261
|
+
# Tell the next persistance operation to store in a specific collection,
|
262
|
+
# database or session.
|
263
|
+
#
|
264
|
+
# @example Create a document in a different collection.
|
265
|
+
# Model.with(collection: "secondary").create(name: "test")
|
266
|
+
#
|
267
|
+
# @example Create a document in a different database.
|
268
|
+
# Model.with(database: "secondary").create(name: "test")
|
269
|
+
#
|
270
|
+
# @example Create a document in a different session.
|
271
|
+
# Model.with(session: "secondary").create(name: "test")
|
272
|
+
#
|
273
|
+
# @example Create with a combination of options.
|
274
|
+
# Model.with(session: "sharded", database: "secondary").create
|
275
|
+
#
|
276
|
+
# @param [ Hash ] options The storage options.
|
277
|
+
#
|
278
|
+
# @option options [ String, Symbol ] :collection The collection name.
|
279
|
+
# @option options [ String, Symbol ] :database The database name.
|
280
|
+
# @option options [ String, Symbol ] :session The session name.
|
281
|
+
#
|
282
|
+
# @return [ Class ] The model class.
|
283
|
+
#
|
284
|
+
# @since 3.0.0
|
285
|
+
def with(options)
|
286
|
+
Threaded.set_persistence_options(self, options)
|
287
|
+
self
|
288
|
+
end
|
289
|
+
|
290
|
+
private
|
291
|
+
|
292
|
+
# Get the name of the collection this model persists to.
|
293
|
+
#
|
294
|
+
# @example Get the collection name.
|
295
|
+
# Model.__collection_name__
|
296
|
+
#
|
297
|
+
# @return [ Symbol ] The name of the collection.
|
298
|
+
#
|
299
|
+
# @since 3.0.0
|
300
|
+
def __collection_name__
|
301
|
+
if storage_options && name = storage_options[:collection]
|
302
|
+
name.to_sym
|
303
|
+
else
|
304
|
+
default_collection_name
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
# Get the database name for the model.
|
309
|
+
#
|
310
|
+
# @example Get the database name.
|
311
|
+
# Model.__database_name__
|
312
|
+
#
|
313
|
+
# @return [ Symbol ] The name of the database.
|
314
|
+
#
|
315
|
+
# @since 3.0.0
|
316
|
+
def __database_name__
|
317
|
+
if storage_options && name = storage_options[:database]
|
318
|
+
name.to_sym
|
319
|
+
else
|
320
|
+
Mongoid.sessions[__session_name__][:database]
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
# Get the session name for the model.
|
325
|
+
#
|
326
|
+
# @example Get the session name.
|
327
|
+
# Model.__session_name__
|
328
|
+
#
|
329
|
+
# @return [ Symbol ] The name of the session.
|
330
|
+
#
|
331
|
+
# @since 3.0.0
|
332
|
+
def __session_name__
|
333
|
+
if storage_options && name = storage_options[:session]
|
334
|
+
name.to_sym
|
335
|
+
else
|
336
|
+
:default
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
# Get the session for this class.
|
341
|
+
#
|
342
|
+
# @example Get the session.
|
343
|
+
# Model.__session__
|
344
|
+
#
|
345
|
+
# @return [ Moped::Session ] The moped session.
|
346
|
+
#
|
347
|
+
# @since 3.0.0
|
348
|
+
def __session__
|
349
|
+
if persistence_options && name = persistence_options[:session]
|
350
|
+
Sessions.with_name(name)
|
351
|
+
elsif storage_options && name = storage_options[:session]
|
352
|
+
Sessions.with_name(name)
|
353
|
+
else
|
354
|
+
Sessions.default
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|