mongoid 2.4.10 → 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 +843 -9
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -17
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- 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/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/atomic.rb +16 -9
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/callbacks.rb +100 -42
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +10 -22
- data/lib/mongoid/config/environment.rb +4 -3
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config.rb +87 -233
- 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/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +436 -248
- 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 +68 -49
- 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/errors.rb +22 -1
- 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/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- 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/macro.rb +83 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +129 -194
- 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/validators/options.rb +80 -0
- data/lib/mongoid/indexes.rb +66 -15
- 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/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/matchers.rb +1 -1
- 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/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/atomic.rb +2 -2
- 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/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/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence.rb +64 -27
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- 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/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/builders.rb +19 -16
- 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/cascading.rb +6 -4
- 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 -160
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -60
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +231 -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 +116 -128
- 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/relations/touchable.rb +32 -0
- data/lib/mongoid/relations.rb +6 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +13 -30
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded/lifecycle.rb +21 -21
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/threaded.rb +167 -59
- 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/timestamps.rb +1 -1
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +34 -4
- data/lib/mongoid/validations/uniqueness.rb +8 -10
- data/lib/mongoid/validations.rb +28 -20
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/mongoid.rb +24 -39
- 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 +92 -154
- 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/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/contexts.rb +0 -25
- 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 -108
- 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 -76
- 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/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/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
data/lib/mongoid/fields.rb
CHANGED
|
@@ -1,34 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require "mongoid/fields/
|
|
3
|
-
require "mongoid/fields/
|
|
4
|
-
require "mongoid/fields/
|
|
5
|
-
require "mongoid/fields/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
require "mongoid/fields/internal/boolean"
|
|
9
|
-
require "mongoid/fields/internal/date"
|
|
10
|
-
require "mongoid/fields/internal/date_time"
|
|
11
|
-
require "mongoid/fields/internal/false_class"
|
|
12
|
-
require "mongoid/fields/internal/float"
|
|
13
|
-
require "mongoid/fields/internal/hash"
|
|
14
|
-
require "mongoid/fields/internal/integer"
|
|
15
|
-
require "mongoid/fields/internal/bignum"
|
|
16
|
-
require "mongoid/fields/internal/fixnum"
|
|
17
|
-
require "mongoid/fields/internal/localized"
|
|
18
|
-
require "mongoid/fields/internal/nil_class"
|
|
19
|
-
require "mongoid/fields/internal/object"
|
|
20
|
-
require "mongoid/fields/internal/object_id"
|
|
21
|
-
require "mongoid/fields/internal/range"
|
|
22
|
-
require "mongoid/fields/internal/set"
|
|
23
|
-
require "mongoid/fields/internal/string"
|
|
24
|
-
require "mongoid/fields/internal/symbol"
|
|
25
|
-
require "mongoid/fields/internal/time"
|
|
26
|
-
require "mongoid/fields/internal/time_with_zone"
|
|
27
|
-
require "mongoid/fields/internal/true_class"
|
|
28
|
-
require "mongoid/fields/internal/foreign_keys/array"
|
|
29
|
-
require "mongoid/fields/internal/foreign_keys/object"
|
|
30
|
-
|
|
31
|
-
module Mongoid #:nodoc
|
|
2
|
+
require "mongoid/fields/standard"
|
|
3
|
+
require "mongoid/fields/foreign_key"
|
|
4
|
+
require "mongoid/fields/localized"
|
|
5
|
+
require "mongoid/fields/validators"
|
|
6
|
+
|
|
7
|
+
module Mongoid
|
|
32
8
|
|
|
33
9
|
# This module defines behaviour for fields.
|
|
34
10
|
module Fields
|
|
@@ -37,31 +13,38 @@ module Mongoid #:nodoc
|
|
|
37
13
|
included do
|
|
38
14
|
class_attribute :aliased_fields
|
|
39
15
|
class_attribute :fields
|
|
40
|
-
class_attribute :
|
|
41
|
-
class_attribute :
|
|
16
|
+
class_attribute :pre_processed_defaults
|
|
17
|
+
class_attribute :post_processed_defaults
|
|
42
18
|
|
|
43
|
-
self.aliased_fields = {}
|
|
19
|
+
self.aliased_fields = { "id" => "_id" }
|
|
44
20
|
self.fields = {}
|
|
45
|
-
self.
|
|
46
|
-
self.
|
|
21
|
+
self.pre_processed_defaults = []
|
|
22
|
+
self.post_processed_defaults = []
|
|
47
23
|
|
|
48
|
-
field(:_type, :type
|
|
49
|
-
field(
|
|
24
|
+
field(:_type, default: ->{ self.class.name if hereditary? }, type: String)
|
|
25
|
+
field(
|
|
26
|
+
:_id,
|
|
27
|
+
default: ->{ BSON::ObjectId.new },
|
|
28
|
+
pre_processed: true,
|
|
29
|
+
type: BSON::ObjectId
|
|
30
|
+
)
|
|
50
31
|
|
|
51
32
|
alias :id :_id
|
|
52
33
|
alias :id= :_id=
|
|
34
|
+
|
|
35
|
+
attr_protected(:id, :_id, :_type) if Mongoid.protect_sensitive_fields?
|
|
53
36
|
end
|
|
54
37
|
|
|
55
38
|
# Apply all default values to the document which are not procs.
|
|
56
39
|
#
|
|
57
40
|
# @example Apply all the non-proc defaults.
|
|
58
|
-
# model.
|
|
41
|
+
# model.apply_pre_processed_defaults
|
|
59
42
|
#
|
|
60
43
|
# @return [ Array<String ] The names of the non-proc defaults.
|
|
61
44
|
#
|
|
62
45
|
# @since 2.4.0
|
|
63
|
-
def
|
|
64
|
-
|
|
46
|
+
def apply_pre_processed_defaults
|
|
47
|
+
pre_processed_defaults.each do |name|
|
|
65
48
|
apply_default(name)
|
|
66
49
|
end
|
|
67
50
|
end
|
|
@@ -69,13 +52,13 @@ module Mongoid #:nodoc
|
|
|
69
52
|
# Apply all default values to the document which are procs.
|
|
70
53
|
#
|
|
71
54
|
# @example Apply all the proc defaults.
|
|
72
|
-
# model.
|
|
55
|
+
# model.apply_post_processed_defaults
|
|
73
56
|
#
|
|
74
57
|
# @return [ Array<String ] The names of the proc defaults.
|
|
75
58
|
#
|
|
76
59
|
# @since 2.4.0
|
|
77
|
-
def
|
|
78
|
-
|
|
60
|
+
def apply_post_processed_defaults
|
|
61
|
+
post_processed_defaults.each do |name|
|
|
79
62
|
apply_default(name)
|
|
80
63
|
end
|
|
81
64
|
end
|
|
@@ -107,20 +90,20 @@ module Mongoid #:nodoc
|
|
|
107
90
|
#
|
|
108
91
|
# @since 2.4.0
|
|
109
92
|
def apply_defaults
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
apply_pre_processed_defaults
|
|
94
|
+
apply_post_processed_defaults
|
|
112
95
|
end
|
|
113
96
|
|
|
114
|
-
#
|
|
97
|
+
# Is the document using object ids?
|
|
115
98
|
#
|
|
116
|
-
# @
|
|
117
|
-
# model.defaults
|
|
99
|
+
# @note Refactored from using delegate for class load performance.
|
|
118
100
|
#
|
|
119
|
-
# @
|
|
101
|
+
# @example Is the document using object ids?
|
|
102
|
+
# model.using_object_ids?
|
|
120
103
|
#
|
|
121
|
-
# @
|
|
122
|
-
def
|
|
123
|
-
self.class.
|
|
104
|
+
# @return [ true, false ] Using object ids.
|
|
105
|
+
def using_object_ids?
|
|
106
|
+
self.class.using_object_ids?
|
|
124
107
|
end
|
|
125
108
|
|
|
126
109
|
class << self
|
|
@@ -160,18 +143,21 @@ module Mongoid #:nodoc
|
|
|
160
143
|
end
|
|
161
144
|
end
|
|
162
145
|
|
|
163
|
-
module ClassMethods
|
|
146
|
+
module ClassMethods
|
|
164
147
|
|
|
165
|
-
#
|
|
148
|
+
# Returns an array of names for the attributes available on this object.
|
|
166
149
|
#
|
|
167
|
-
#
|
|
168
|
-
#
|
|
150
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
|
151
|
+
# meathod to automatically wrap params in JSON requests.
|
|
169
152
|
#
|
|
170
|
-
# @
|
|
153
|
+
# @example Get the field names
|
|
154
|
+
# Model.attribute_names
|
|
171
155
|
#
|
|
172
|
-
# @
|
|
173
|
-
|
|
174
|
-
|
|
156
|
+
# @return [ Array<String> ] The field names
|
|
157
|
+
#
|
|
158
|
+
# @since 3.0.0
|
|
159
|
+
def attribute_names
|
|
160
|
+
fields.keys
|
|
175
161
|
end
|
|
176
162
|
|
|
177
163
|
# Defines all the fields that are accessible on the Document
|
|
@@ -191,12 +177,12 @@ module Mongoid #:nodoc
|
|
|
191
177
|
# @return [ Field ] The generated field
|
|
192
178
|
def field(name, options = {})
|
|
193
179
|
named = name.to_s
|
|
194
|
-
|
|
195
|
-
add_field(named, options)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
end
|
|
180
|
+
Validators::Macro.validate(self, name, options)
|
|
181
|
+
added = add_field(named, options)
|
|
182
|
+
descendants.each do |subclass|
|
|
183
|
+
subclass.add_field(named, options)
|
|
199
184
|
end
|
|
185
|
+
added
|
|
200
186
|
end
|
|
201
187
|
|
|
202
188
|
# When inheriting, we want to copy the fields from the parent class and
|
|
@@ -211,25 +197,8 @@ module Mongoid #:nodoc
|
|
|
211
197
|
# @since 2.0.0.rc.6
|
|
212
198
|
def inherited(subclass)
|
|
213
199
|
super
|
|
214
|
-
subclass.fields, subclass.
|
|
215
|
-
fields.dup,
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
# Is the field with the provided name a BSON::ObjectId?
|
|
219
|
-
#
|
|
220
|
-
# @example Is the field a BSON::ObjectId?
|
|
221
|
-
# Person.object_id_field?(:name)
|
|
222
|
-
#
|
|
223
|
-
# @param [ String, Symbol ] name The name of the field.
|
|
224
|
-
#
|
|
225
|
-
# @return [ true, false ] If the field is a BSON::ObjectId.
|
|
226
|
-
#
|
|
227
|
-
# @since 2.2.0
|
|
228
|
-
def object_id_field?(name)
|
|
229
|
-
field_name = name.to_s
|
|
230
|
-
field_name = "_id" if field_name == "id"
|
|
231
|
-
field = fields[field_name]
|
|
232
|
-
field ? field.object_id_field? : false
|
|
200
|
+
subclass.fields, subclass.pre_processed_defaults, subclass.post_processed_defaults =
|
|
201
|
+
fields.dup, pre_processed_defaults.dup, post_processed_defaults.dup
|
|
233
202
|
end
|
|
234
203
|
|
|
235
204
|
# Replace a field with a new type.
|
|
@@ -244,8 +213,21 @@ module Mongoid #:nodoc
|
|
|
244
213
|
#
|
|
245
214
|
# @since 2.1.0
|
|
246
215
|
def replace_field(name, type)
|
|
247
|
-
|
|
248
|
-
add_field(name, fields[name].options.merge(:
|
|
216
|
+
remove_defaults(name)
|
|
217
|
+
add_field(name, fields[name].options.merge(type: type))
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Convenience method for determining if we are using +BSON::ObjectIds+ as
|
|
221
|
+
# our id.
|
|
222
|
+
#
|
|
223
|
+
# @example Does this class use object ids?
|
|
224
|
+
# person.using_object_ids?
|
|
225
|
+
#
|
|
226
|
+
# @return [ true, false ] If the class uses BSON::ObjectIds for the id.
|
|
227
|
+
#
|
|
228
|
+
# @since 1.0.0
|
|
229
|
+
def using_object_ids?
|
|
230
|
+
fields["_id"].object_id_field?
|
|
249
231
|
end
|
|
250
232
|
|
|
251
233
|
protected
|
|
@@ -261,11 +243,12 @@ module Mongoid #:nodoc
|
|
|
261
243
|
# @since 2.4.0
|
|
262
244
|
def add_defaults(field)
|
|
263
245
|
default, name = field.default_val, field.name.to_s
|
|
246
|
+
remove_defaults(name)
|
|
264
247
|
unless default.nil?
|
|
265
|
-
if field.
|
|
266
|
-
|
|
248
|
+
if field.pre_processed?
|
|
249
|
+
pre_processed_defaults.push(name)
|
|
267
250
|
else
|
|
268
|
-
|
|
251
|
+
post_processed_defaults.push(name)
|
|
269
252
|
end
|
|
270
253
|
end
|
|
271
254
|
end
|
|
@@ -280,16 +263,15 @@ module Mongoid #:nodoc
|
|
|
280
263
|
def add_field(name, options = {})
|
|
281
264
|
aliased = options[:as]
|
|
282
265
|
aliased_fields[aliased.to_s] = name if aliased
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
end
|
|
266
|
+
field = field_for(name, options)
|
|
267
|
+
fields[name] = field
|
|
268
|
+
add_defaults(field)
|
|
269
|
+
create_accessors(name, name, options)
|
|
270
|
+
create_accessors(name, aliased, options) if aliased
|
|
271
|
+
process_options(field)
|
|
272
|
+
create_dirty_methods(name, name)
|
|
273
|
+
create_dirty_methods(name, aliased) if aliased
|
|
274
|
+
field
|
|
293
275
|
end
|
|
294
276
|
|
|
295
277
|
# Run through all custom options stored in Mongoid::Fields.options and
|
|
@@ -315,22 +297,6 @@ module Mongoid #:nodoc
|
|
|
315
297
|
end
|
|
316
298
|
end
|
|
317
299
|
|
|
318
|
-
# Determine if the field name is allowed, if not raise an error.
|
|
319
|
-
#
|
|
320
|
-
# @example Check the field name.
|
|
321
|
-
# Model.check_field_name!(:collection)
|
|
322
|
-
#
|
|
323
|
-
# @param [ Symbol ] name The field name.
|
|
324
|
-
#
|
|
325
|
-
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
|
326
|
-
#
|
|
327
|
-
# @since 2.1.8
|
|
328
|
-
def check_field_name!(name)
|
|
329
|
-
if Mongoid.destructive_fields.include?(name)
|
|
330
|
-
raise Errors::InvalidField.new(name)
|
|
331
|
-
end
|
|
332
|
-
end
|
|
333
|
-
|
|
334
300
|
# Create the field accessors.
|
|
335
301
|
#
|
|
336
302
|
# @example Generate the accessors.
|
|
@@ -348,12 +314,12 @@ module Mongoid #:nodoc
|
|
|
348
314
|
field = fields[name]
|
|
349
315
|
|
|
350
316
|
create_field_getter(name, meth, field)
|
|
351
|
-
create_field_setter(name, meth)
|
|
317
|
+
create_field_setter(name, meth, field)
|
|
352
318
|
create_field_check(name, meth)
|
|
353
319
|
|
|
354
320
|
if options[:localize]
|
|
355
321
|
create_translations_getter(name, meth)
|
|
356
|
-
create_translations_setter(name, meth)
|
|
322
|
+
create_translations_setter(name, meth, field)
|
|
357
323
|
end
|
|
358
324
|
end
|
|
359
325
|
|
|
@@ -369,38 +335,10 @@ module Mongoid #:nodoc
|
|
|
369
335
|
# @since 2.4.0
|
|
370
336
|
def create_field_getter(name, meth, field)
|
|
371
337
|
generated_methods.module_eval do
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
end
|
|
377
|
-
else
|
|
378
|
-
define_method(meth) do
|
|
379
|
-
read_attribute(name).tap do |value|
|
|
380
|
-
if value.is_a?(Array) || value.is_a?(Hash)
|
|
381
|
-
attribute_will_change!(name)
|
|
382
|
-
end
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
end
|
|
386
|
-
else
|
|
387
|
-
if field.cast_on_read?
|
|
388
|
-
class_eval <<-EOM
|
|
389
|
-
def #{meth}
|
|
390
|
-
fields[#{name.inspect}].deserialize(read_attribute(#{name.inspect}))
|
|
391
|
-
end
|
|
392
|
-
EOM
|
|
393
|
-
else
|
|
394
|
-
class_eval <<-EOM
|
|
395
|
-
def #{meth}
|
|
396
|
-
read_attribute(#{name.inspect}).tap do |value|
|
|
397
|
-
if value.is_a?(Array) || value.is_a?(Hash)
|
|
398
|
-
attribute_will_change!(#{name.inspect})
|
|
399
|
-
end
|
|
400
|
-
end
|
|
401
|
-
end
|
|
402
|
-
EOM
|
|
403
|
-
end
|
|
338
|
+
re_define_method(meth) do
|
|
339
|
+
value = fields[name].demongoize(read_attribute(name))
|
|
340
|
+
attribute_will_change!(name) if value.resizable?
|
|
341
|
+
value
|
|
404
342
|
end
|
|
405
343
|
end
|
|
406
344
|
end
|
|
@@ -412,20 +350,16 @@ module Mongoid #:nodoc
|
|
|
412
350
|
#
|
|
413
351
|
# @param [ String ] name The name of the attribute.
|
|
414
352
|
# @param [ String ] meth The name of the method.
|
|
353
|
+
# @param [ Field ] field The field.
|
|
415
354
|
#
|
|
416
355
|
# @since 2.4.0
|
|
417
|
-
def create_field_setter(name, meth)
|
|
356
|
+
def create_field_setter(name, meth, field)
|
|
418
357
|
generated_methods.module_eval do
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
358
|
+
re_define_method("#{meth}=") do |value|
|
|
359
|
+
write_attribute(name, value)
|
|
360
|
+
if field.foreign_key?
|
|
361
|
+
remove_ivar(field.metadata.name)
|
|
422
362
|
end
|
|
423
|
-
else
|
|
424
|
-
class_eval <<-EOM
|
|
425
|
-
def #{meth}=(value)
|
|
426
|
-
write_attribute(#{name.inspect}, value)
|
|
427
|
-
end
|
|
428
|
-
EOM
|
|
429
363
|
end
|
|
430
364
|
end
|
|
431
365
|
end
|
|
@@ -441,18 +375,9 @@ module Mongoid #:nodoc
|
|
|
441
375
|
# @since 2.4.0
|
|
442
376
|
def create_field_check(name, meth)
|
|
443
377
|
generated_methods.module_eval do
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
attr == true || attr.present?
|
|
448
|
-
end
|
|
449
|
-
else
|
|
450
|
-
class_eval <<-EOM
|
|
451
|
-
def #{meth}?
|
|
452
|
-
attr = read_attribute(#{name.inspect})
|
|
453
|
-
attr == true || attr.present?
|
|
454
|
-
end
|
|
455
|
-
EOM
|
|
378
|
+
re_define_method("#{meth}?") do
|
|
379
|
+
attr = read_attribute(name)
|
|
380
|
+
attr == true || attr.present?
|
|
456
381
|
end
|
|
457
382
|
end
|
|
458
383
|
end
|
|
@@ -468,16 +393,8 @@ module Mongoid #:nodoc
|
|
|
468
393
|
# @since 2.4.0
|
|
469
394
|
def create_translations_getter(name, meth)
|
|
470
395
|
generated_methods.module_eval do
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
attributes[name]
|
|
474
|
-
end
|
|
475
|
-
else
|
|
476
|
-
class_eval <<-EOM
|
|
477
|
-
def #{meth}_translations
|
|
478
|
-
attributes[#{name.inspect}]
|
|
479
|
-
end
|
|
480
|
-
EOM
|
|
396
|
+
re_define_method("#{meth}_translations") do
|
|
397
|
+
attributes[name] ||= {}
|
|
481
398
|
end
|
|
482
399
|
end
|
|
483
400
|
end
|
|
@@ -489,22 +406,19 @@ module Mongoid #:nodoc
|
|
|
489
406
|
#
|
|
490
407
|
# @param [ String ] name The name of the attribute.
|
|
491
408
|
# @param [ String ] meth The name of the method.
|
|
409
|
+
# @param [ Field ] field The field.
|
|
492
410
|
#
|
|
493
411
|
# @since 2.4.0
|
|
494
|
-
def create_translations_setter(name, meth)
|
|
412
|
+
def create_translations_setter(name, meth, field)
|
|
495
413
|
generated_methods.module_eval do
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
else
|
|
502
|
-
class_eval <<-EOM
|
|
503
|
-
def #{meth}_translations=(value)
|
|
504
|
-
attribute_will_change!(#{name.inspect})
|
|
505
|
-
attributes[#{name.inspect}] = value
|
|
414
|
+
re_define_method("#{meth}_translations=") do |value|
|
|
415
|
+
attribute_will_change!(name)
|
|
416
|
+
if value
|
|
417
|
+
value.update_values do |value|
|
|
418
|
+
field.type.mongoize(value)
|
|
506
419
|
end
|
|
507
|
-
|
|
420
|
+
end
|
|
421
|
+
attributes[name] = value
|
|
508
422
|
end
|
|
509
423
|
end
|
|
510
424
|
end
|
|
@@ -519,9 +433,30 @@ module Mongoid #:nodoc
|
|
|
519
433
|
# @since 2.0.0
|
|
520
434
|
def generated_methods
|
|
521
435
|
@generated_methods ||= begin
|
|
522
|
-
Module.new
|
|
436
|
+
mod = Module.new
|
|
437
|
+
include(mod)
|
|
438
|
+
mod
|
|
523
439
|
end
|
|
524
440
|
end
|
|
441
|
+
|
|
442
|
+
# Remove the default keys for the provided name.
|
|
443
|
+
#
|
|
444
|
+
# @example Remove the default keys.
|
|
445
|
+
# Model.remove_defaults(name)
|
|
446
|
+
#
|
|
447
|
+
# @param [ String ] name The field name.
|
|
448
|
+
#
|
|
449
|
+
# @since 2.4.0
|
|
450
|
+
def remove_defaults(name)
|
|
451
|
+
pre_processed_defaults.delete_one(name)
|
|
452
|
+
post_processed_defaults.delete_one(name)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
def field_for(name, options)
|
|
456
|
+
return Fields::Localized.new(name, options) if options[:localize]
|
|
457
|
+
return Fields::ForeignKey.new(name, options) if options[:identity]
|
|
458
|
+
Fields::Standard.new(name, options)
|
|
459
|
+
end
|
|
525
460
|
end
|
|
526
461
|
end
|
|
527
462
|
end
|
data/lib/mongoid/finders.rb
CHANGED
|
@@ -1,42 +1,25 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
2
|
+
module Mongoid
|
|
3
3
|
|
|
4
4
|
# This module defines the finder methods that hang off the document at the
|
|
5
5
|
# class level.
|
|
6
6
|
module Finders
|
|
7
|
+
extend Origin::Forwardable
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
:avg, :desc, :descending, :excludes,
|
|
12
|
-
:includes, :limit, :max, :min, :not_in, :only,
|
|
13
|
-
:order_by, :search, :skip, :sum, :without, :where,
|
|
14
|
-
:update, :update_all, :near ]
|
|
15
|
-
delegate *(critera_methods.dup << { :to => :criteria })
|
|
9
|
+
select_with :with_default_scope
|
|
10
|
+
delegate :aggregates, :avg, :each, :extras, :find_and_modify, :includes,
|
|
11
|
+
:map_reduce, :max, :min, :sum, :update, :update_all, to: :with_default_scope
|
|
16
12
|
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
# @example Find all matching documents given conditions.
|
|
20
|
-
# Person.all(:conditions => { :attribute => "value" })
|
|
21
|
-
#
|
|
22
|
-
# @param [ Array ] args The conditions with options.
|
|
23
|
-
#
|
|
24
|
-
# @return [ Criteria ] The matching documents.
|
|
25
|
-
def all(*args)
|
|
26
|
-
find(:all, *args)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# Returns a count of matching records in the database based on the
|
|
30
|
-
# provided arguments.
|
|
13
|
+
# Returns a count of records in the database.
|
|
14
|
+
# If you want to specify conditions use where.
|
|
31
15
|
#
|
|
32
16
|
# @example Get the count of matching documents.
|
|
33
|
-
# Person.count
|
|
34
|
-
#
|
|
35
|
-
# @param [ Array ] args The conditions.
|
|
17
|
+
# Person.count
|
|
18
|
+
# Person.where(title: "Sir").count
|
|
36
19
|
#
|
|
37
20
|
# @return [ Integer ] The number of matching documents.
|
|
38
|
-
def count
|
|
39
|
-
|
|
21
|
+
def count
|
|
22
|
+
with_default_scope.count
|
|
40
23
|
end
|
|
41
24
|
|
|
42
25
|
# Returns true if count is zero
|
|
@@ -53,11 +36,11 @@ module Mongoid #:nodoc:
|
|
|
53
36
|
# provided arguments.
|
|
54
37
|
#
|
|
55
38
|
# @example Do any documents exist for the conditions?
|
|
56
|
-
# Person.exists?
|
|
39
|
+
# Person.exists?
|
|
57
40
|
#
|
|
58
41
|
# @param [ Array ] args The conditions.
|
|
59
|
-
def exists?
|
|
60
|
-
|
|
42
|
+
def exists?
|
|
43
|
+
with_default_scope.exists?
|
|
61
44
|
end
|
|
62
45
|
|
|
63
46
|
# Find a +Document+ in several different ways.
|
|
@@ -68,12 +51,6 @@ module Mongoid #:nodoc:
|
|
|
68
51
|
# it will attempt to find either a single +Document+ or multiples based
|
|
69
52
|
# on the conditions provided and the first parameter.
|
|
70
53
|
#
|
|
71
|
-
# @example Find the first matching document.
|
|
72
|
-
# Person.find(:first, :conditions => { :attribute => "value" })
|
|
73
|
-
#
|
|
74
|
-
# @example Find all matching documents.
|
|
75
|
-
# Person.find(:all, :conditions => { :attribute => "value" })
|
|
76
|
-
#
|
|
77
54
|
# @example Find a single document by an id.
|
|
78
55
|
# Person.find(BSON::ObjectId)
|
|
79
56
|
#
|
|
@@ -81,7 +58,7 @@ module Mongoid #:nodoc:
|
|
|
81
58
|
#
|
|
82
59
|
# @return [ Document, nil, Criteria ] A document or matching documents.
|
|
83
60
|
def find(*args)
|
|
84
|
-
|
|
61
|
+
with_default_scope.find(*args)
|
|
85
62
|
end
|
|
86
63
|
|
|
87
64
|
# Find the first +Document+ given the conditions, or creates a new document
|
|
@@ -110,6 +87,28 @@ module Mongoid #:nodoc:
|
|
|
110
87
|
find_or(:new, attrs, &block)
|
|
111
88
|
end
|
|
112
89
|
|
|
90
|
+
# Find the first +Document+ given the conditions, or raises
|
|
91
|
+
# Mongoid::Errors::DocumentNotFound
|
|
92
|
+
#
|
|
93
|
+
# @example Find the document by attribute other than id
|
|
94
|
+
# Person.find_by(:username => "superuser")
|
|
95
|
+
#
|
|
96
|
+
# @param [ Hash ] attrs The attributes to check.
|
|
97
|
+
#
|
|
98
|
+
# @raise [ Errors::DocumentNotFound ] If no document found.
|
|
99
|
+
#
|
|
100
|
+
# @return [ Document ] A matching document.
|
|
101
|
+
#
|
|
102
|
+
# @since 3.0.0
|
|
103
|
+
def find_by(attrs = {})
|
|
104
|
+
result = where(attrs).first
|
|
105
|
+
if result.nil? && Mongoid.raise_not_found_error
|
|
106
|
+
raise(Errors::DocumentNotFound.new(self, attrs))
|
|
107
|
+
end
|
|
108
|
+
yield(result) if result && block_given?
|
|
109
|
+
result
|
|
110
|
+
end
|
|
111
|
+
|
|
113
112
|
# Find the first +Document+ given the conditions.
|
|
114
113
|
#
|
|
115
114
|
# @example Find the first document.
|
|
@@ -118,8 +117,8 @@ module Mongoid #:nodoc:
|
|
|
118
117
|
# @param [ Array ] args The conditions with options.
|
|
119
118
|
#
|
|
120
119
|
# @return [ Document ] The first matching document.
|
|
121
|
-
def first
|
|
122
|
-
|
|
120
|
+
def first
|
|
121
|
+
with_default_scope.first
|
|
123
122
|
end
|
|
124
123
|
|
|
125
124
|
# Find the last +Document+ given the conditions.
|
|
@@ -130,8 +129,8 @@ module Mongoid #:nodoc:
|
|
|
130
129
|
# @param [ Array ] args The conditions with options.
|
|
131
130
|
#
|
|
132
131
|
# @return [ Document ] The last matching document.
|
|
133
|
-
def last
|
|
134
|
-
|
|
132
|
+
def last
|
|
133
|
+
with_default_scope.last
|
|
135
134
|
end
|
|
136
135
|
|
|
137
136
|
protected
|
|
@@ -146,7 +145,7 @@ module Mongoid #:nodoc:
|
|
|
146
145
|
#
|
|
147
146
|
# @return [ Document ] The first or new document.
|
|
148
147
|
def find_or(method, attrs = {}, &block)
|
|
149
|
-
|
|
148
|
+
where(attrs).first || send(method, attrs, &block)
|
|
150
149
|
end
|
|
151
150
|
end
|
|
152
151
|
end
|
data/lib/mongoid/hierarchy.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Hierarchy
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Hierarchy
|
|
4
4
|
extend ActiveSupport::Concern
|
|
5
5
|
|
|
6
6
|
included do
|
|
@@ -19,18 +19,29 @@ module Mongoid #:nodoc
|
|
|
19
19
|
#
|
|
20
20
|
# @return [ Array<Document> ] All child documents in the hierarchy.
|
|
21
21
|
def _children
|
|
22
|
-
@_children ||=
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
@_children ||= collect_children
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Collect all the children of this document.
|
|
26
|
+
#
|
|
27
|
+
# @example Collect all the children.
|
|
28
|
+
# document.collect_children
|
|
29
|
+
#
|
|
30
|
+
# @return [ Array<Document> ] The children.
|
|
31
|
+
#
|
|
32
|
+
# @since 2.4.0
|
|
33
|
+
def collect_children
|
|
34
|
+
children = []
|
|
35
|
+
embedded_relations.each_pair do |name, metadata|
|
|
36
|
+
without_autobuild do
|
|
37
|
+
child = send(name)
|
|
38
|
+
Array.wrap(child).each do |doc|
|
|
39
|
+
children.push(doc)
|
|
40
|
+
children.concat(doc._children) unless metadata.versioned?
|
|
41
|
+
end if child
|
|
33
42
|
end
|
|
43
|
+
end
|
|
44
|
+
children
|
|
34
45
|
end
|
|
35
46
|
|
|
36
47
|
# Determines if the document is a subclass of another document.
|
|
@@ -106,7 +117,7 @@ module Mongoid #:nodoc
|
|
|
106
117
|
object || self
|
|
107
118
|
end
|
|
108
119
|
|
|
109
|
-
module ClassMethods
|
|
120
|
+
module ClassMethods
|
|
110
121
|
|
|
111
122
|
# Determines if the document is a subclass of another document.
|
|
112
123
|
#
|