mongoid 2.4.10 → 3.0.0
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 +949 -10
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +3 -17
- data/lib/config/locales/en.yml +455 -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 +70 -16
- 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 +106 -43
- data/lib/mongoid/components.rb +12 -23
- data/lib/mongoid/config/environment.rb +7 -4
- 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 +104 -225
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -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 +68 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +406 -0
- data/lib/mongoid/contextual/mongo.rb +662 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +7 -25
- data/lib/mongoid/criteria.rb +515 -245
- 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 +71 -52
- 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_metadata.rb +21 -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 +23 -1
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions/array.rb +164 -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 +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +123 -0
- data/lib/mongoid/extensions/integer.rb +66 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +238 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +181 -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 +38 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +150 -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 +142 -208
- data/lib/mongoid/finders.rb +45 -50
- data/lib/mongoid/hierarchy.rb +44 -15
- data/lib/mongoid/identity_map.rb +49 -21
- 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/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 +9 -11
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +10 -44
- 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/upsert.rb +28 -0
- data/lib/mongoid/persistence/operations.rb +22 -19
- data/lib/mongoid/persistence/upsertion.rb +30 -0
- data/lib/mongoid/persistence.rb +94 -39
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +120 -20
- 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 +4 -4
- 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 +5 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
- 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 +10 -7
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +6 -7
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +347 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +100 -161
- 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 +277 -47
- data/lib/mongoid/relations/nested_builder.rb +4 -6
- 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 +62 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +162 -130
- data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
- 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 +22 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +312 -0
- data/lib/mongoid/serialization.rb +94 -42
- data/lib/mongoid/sessions/factory.rb +108 -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 +383 -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 +219 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +4 -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 +11 -12
- 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 +37 -37
- 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 +65 -17
- 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 +73 -26
- metadata +103 -148
- 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/retry.rb +0 -59
- 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/javascript/functions.yml +0 -63
- data/lib/mongoid/javascript.rb +0 -20
- 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: ->{ Moped::BSON::ObjectId.new },
|
|
28
|
+
pre_processed: true,
|
|
29
|
+
type: Moped::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,35 @@ 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
|
+
# Returns an array of names for the attributes available on this object.
|
|
115
98
|
#
|
|
116
|
-
#
|
|
117
|
-
#
|
|
99
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
|
100
|
+
# method to automatically wrap params in JSON requests.
|
|
118
101
|
#
|
|
119
|
-
# @
|
|
102
|
+
# @example Get the field names
|
|
103
|
+
# docment.attribute_names
|
|
120
104
|
#
|
|
121
|
-
# @
|
|
122
|
-
|
|
123
|
-
|
|
105
|
+
# @return [ Array<String> ] The field names
|
|
106
|
+
#
|
|
107
|
+
# @since 3.0.0
|
|
108
|
+
def attribute_names
|
|
109
|
+
self.class.attribute_names
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Is the document using object ids?
|
|
113
|
+
#
|
|
114
|
+
# @note Refactored from using delegate for class load performance.
|
|
115
|
+
#
|
|
116
|
+
# @example Is the document using object ids?
|
|
117
|
+
# model.using_object_ids?
|
|
118
|
+
#
|
|
119
|
+
# @return [ true, false ] Using object ids.
|
|
120
|
+
def using_object_ids?
|
|
121
|
+
self.class.using_object_ids?
|
|
124
122
|
end
|
|
125
123
|
|
|
126
124
|
class << self
|
|
@@ -160,18 +158,21 @@ module Mongoid #:nodoc
|
|
|
160
158
|
end
|
|
161
159
|
end
|
|
162
160
|
|
|
163
|
-
module ClassMethods
|
|
161
|
+
module ClassMethods
|
|
164
162
|
|
|
165
|
-
#
|
|
163
|
+
# Returns an array of names for the attributes available on this object.
|
|
166
164
|
#
|
|
167
|
-
#
|
|
168
|
-
#
|
|
165
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
|
166
|
+
# method to automatically wrap params in JSON requests.
|
|
169
167
|
#
|
|
170
|
-
# @
|
|
168
|
+
# @example Get the field names
|
|
169
|
+
# Model.attribute_names
|
|
171
170
|
#
|
|
172
|
-
# @
|
|
173
|
-
|
|
174
|
-
|
|
171
|
+
# @return [ Array<String> ] The field names
|
|
172
|
+
#
|
|
173
|
+
# @since 3.0.0
|
|
174
|
+
def attribute_names
|
|
175
|
+
fields.keys
|
|
175
176
|
end
|
|
176
177
|
|
|
177
178
|
# Defines all the fields that are accessible on the Document
|
|
@@ -191,45 +192,12 @@ module Mongoid #:nodoc
|
|
|
191
192
|
# @return [ Field ] The generated field
|
|
192
193
|
def field(name, options = {})
|
|
193
194
|
named = name.to_s
|
|
194
|
-
|
|
195
|
-
add_field(named, options)
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
end
|
|
195
|
+
Validators::Macro.validate(self, name, options)
|
|
196
|
+
added = add_field(named, options)
|
|
197
|
+
descendants.each do |subclass|
|
|
198
|
+
subclass.add_field(named, options)
|
|
199
199
|
end
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
# When inheriting, we want to copy the fields from the parent class and
|
|
203
|
-
# set the on the child to start, mimicking the behaviour of the old
|
|
204
|
-
# class_inheritable_accessor that was deprecated in Rails edge.
|
|
205
|
-
#
|
|
206
|
-
# @example Inherit from this class.
|
|
207
|
-
# Person.inherited(Doctor)
|
|
208
|
-
#
|
|
209
|
-
# @param [ Class ] subclass The inheriting class.
|
|
210
|
-
#
|
|
211
|
-
# @since 2.0.0.rc.6
|
|
212
|
-
def inherited(subclass)
|
|
213
|
-
super
|
|
214
|
-
subclass.fields, subclass.non_proc_defaults, subclass.proc_defaults =
|
|
215
|
-
fields.dup, non_proc_defaults.dup, proc_defaults.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
|
+
added
|
|
233
201
|
end
|
|
234
202
|
|
|
235
203
|
# Replace a field with a new type.
|
|
@@ -244,8 +212,21 @@ module Mongoid #:nodoc
|
|
|
244
212
|
#
|
|
245
213
|
# @since 2.1.0
|
|
246
214
|
def replace_field(name, type)
|
|
247
|
-
|
|
248
|
-
add_field(name, fields[name].options.merge(:
|
|
215
|
+
remove_defaults(name)
|
|
216
|
+
add_field(name, fields[name].options.merge(type: type))
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Convenience method for determining if we are using +Moped::BSON::ObjectIds+ as
|
|
220
|
+
# our id.
|
|
221
|
+
#
|
|
222
|
+
# @example Does this class use object ids?
|
|
223
|
+
# person.using_object_ids?
|
|
224
|
+
#
|
|
225
|
+
# @return [ true, false ] If the class uses Moped::BSON::ObjectIds for the id.
|
|
226
|
+
#
|
|
227
|
+
# @since 1.0.0
|
|
228
|
+
def using_object_ids?
|
|
229
|
+
fields["_id"].object_id_field?
|
|
249
230
|
end
|
|
250
231
|
|
|
251
232
|
protected
|
|
@@ -261,11 +242,12 @@ module Mongoid #:nodoc
|
|
|
261
242
|
# @since 2.4.0
|
|
262
243
|
def add_defaults(field)
|
|
263
244
|
default, name = field.default_val, field.name.to_s
|
|
245
|
+
remove_defaults(name)
|
|
264
246
|
unless default.nil?
|
|
265
|
-
if field.
|
|
266
|
-
|
|
247
|
+
if field.pre_processed?
|
|
248
|
+
pre_processed_defaults.push(name)
|
|
267
249
|
else
|
|
268
|
-
|
|
250
|
+
post_processed_defaults.push(name)
|
|
269
251
|
end
|
|
270
252
|
end
|
|
271
253
|
end
|
|
@@ -280,16 +262,15 @@ module Mongoid #:nodoc
|
|
|
280
262
|
def add_field(name, options = {})
|
|
281
263
|
aliased = options[:as]
|
|
282
264
|
aliased_fields[aliased.to_s] = name if aliased
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
end
|
|
265
|
+
field = field_for(name, options)
|
|
266
|
+
fields[name] = field
|
|
267
|
+
add_defaults(field)
|
|
268
|
+
create_accessors(name, name, options)
|
|
269
|
+
create_accessors(name, aliased, options) if aliased
|
|
270
|
+
process_options(field)
|
|
271
|
+
create_dirty_methods(name, name)
|
|
272
|
+
create_dirty_methods(name, aliased) if aliased
|
|
273
|
+
field
|
|
293
274
|
end
|
|
294
275
|
|
|
295
276
|
# Run through all custom options stored in Mongoid::Fields.options and
|
|
@@ -315,22 +296,6 @@ module Mongoid #:nodoc
|
|
|
315
296
|
end
|
|
316
297
|
end
|
|
317
298
|
|
|
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
299
|
# Create the field accessors.
|
|
335
300
|
#
|
|
336
301
|
# @example Generate the accessors.
|
|
@@ -348,12 +313,12 @@ module Mongoid #:nodoc
|
|
|
348
313
|
field = fields[name]
|
|
349
314
|
|
|
350
315
|
create_field_getter(name, meth, field)
|
|
351
|
-
create_field_setter(name, meth)
|
|
316
|
+
create_field_setter(name, meth, field)
|
|
352
317
|
create_field_check(name, meth)
|
|
353
318
|
|
|
354
319
|
if options[:localize]
|
|
355
320
|
create_translations_getter(name, meth)
|
|
356
|
-
create_translations_setter(name, meth)
|
|
321
|
+
create_translations_setter(name, meth, field)
|
|
357
322
|
end
|
|
358
323
|
end
|
|
359
324
|
|
|
@@ -369,38 +334,10 @@ module Mongoid #:nodoc
|
|
|
369
334
|
# @since 2.4.0
|
|
370
335
|
def create_field_getter(name, meth, field)
|
|
371
336
|
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
|
|
337
|
+
re_define_method(meth) do
|
|
338
|
+
value = fields[name].demongoize(read_attribute(name))
|
|
339
|
+
attribute_will_change!(name) if value.resizable?
|
|
340
|
+
value
|
|
404
341
|
end
|
|
405
342
|
end
|
|
406
343
|
end
|
|
@@ -412,20 +349,16 @@ module Mongoid #:nodoc
|
|
|
412
349
|
#
|
|
413
350
|
# @param [ String ] name The name of the attribute.
|
|
414
351
|
# @param [ String ] meth The name of the method.
|
|
352
|
+
# @param [ Field ] field The field.
|
|
415
353
|
#
|
|
416
354
|
# @since 2.4.0
|
|
417
|
-
def create_field_setter(name, meth)
|
|
355
|
+
def create_field_setter(name, meth, field)
|
|
418
356
|
generated_methods.module_eval do
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
357
|
+
re_define_method("#{meth}=") do |value|
|
|
358
|
+
write_attribute(name, value)
|
|
359
|
+
if field.foreign_key?
|
|
360
|
+
remove_ivar(field.metadata.name)
|
|
422
361
|
end
|
|
423
|
-
else
|
|
424
|
-
class_eval <<-EOM
|
|
425
|
-
def #{meth}=(value)
|
|
426
|
-
write_attribute(#{name.inspect}, value)
|
|
427
|
-
end
|
|
428
|
-
EOM
|
|
429
362
|
end
|
|
430
363
|
end
|
|
431
364
|
end
|
|
@@ -441,18 +374,9 @@ module Mongoid #:nodoc
|
|
|
441
374
|
# @since 2.4.0
|
|
442
375
|
def create_field_check(name, meth)
|
|
443
376
|
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
|
|
377
|
+
re_define_method("#{meth}?") do
|
|
378
|
+
attr = read_attribute(name)
|
|
379
|
+
attr == true || attr.present?
|
|
456
380
|
end
|
|
457
381
|
end
|
|
458
382
|
end
|
|
@@ -468,16 +392,8 @@ module Mongoid #:nodoc
|
|
|
468
392
|
# @since 2.4.0
|
|
469
393
|
def create_translations_getter(name, meth)
|
|
470
394
|
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
|
|
395
|
+
re_define_method("#{meth}_translations") do
|
|
396
|
+
attributes[name] ||= {}
|
|
481
397
|
end
|
|
482
398
|
end
|
|
483
399
|
end
|
|
@@ -489,22 +405,19 @@ module Mongoid #:nodoc
|
|
|
489
405
|
#
|
|
490
406
|
# @param [ String ] name The name of the attribute.
|
|
491
407
|
# @param [ String ] meth The name of the method.
|
|
408
|
+
# @param [ Field ] field The field.
|
|
492
409
|
#
|
|
493
410
|
# @since 2.4.0
|
|
494
|
-
def create_translations_setter(name, meth)
|
|
411
|
+
def create_translations_setter(name, meth, field)
|
|
495
412
|
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
|
|
413
|
+
re_define_method("#{meth}_translations=") do |value|
|
|
414
|
+
attribute_will_change!(name)
|
|
415
|
+
if value
|
|
416
|
+
value.update_values do |value|
|
|
417
|
+
field.type.mongoize(value)
|
|
506
418
|
end
|
|
507
|
-
|
|
419
|
+
end
|
|
420
|
+
attributes[name] = value
|
|
508
421
|
end
|
|
509
422
|
end
|
|
510
423
|
end
|
|
@@ -519,9 +432,30 @@ module Mongoid #:nodoc
|
|
|
519
432
|
# @since 2.0.0
|
|
520
433
|
def generated_methods
|
|
521
434
|
@generated_methods ||= begin
|
|
522
|
-
Module.new
|
|
435
|
+
mod = Module.new
|
|
436
|
+
include(mod)
|
|
437
|
+
mod
|
|
523
438
|
end
|
|
524
439
|
end
|
|
440
|
+
|
|
441
|
+
# Remove the default keys for the provided name.
|
|
442
|
+
#
|
|
443
|
+
# @example Remove the default keys.
|
|
444
|
+
# Model.remove_defaults(name)
|
|
445
|
+
#
|
|
446
|
+
# @param [ String ] name The field name.
|
|
447
|
+
#
|
|
448
|
+
# @since 2.4.0
|
|
449
|
+
def remove_defaults(name)
|
|
450
|
+
pre_processed_defaults.delete_one(name)
|
|
451
|
+
post_processed_defaults.delete_one(name)
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
def field_for(name, options)
|
|
455
|
+
return Fields::Localized.new(name, options) if options[:localize]
|
|
456
|
+
return Fields::ForeignKey.new(name, options) if options[:identity]
|
|
457
|
+
Fields::Standard.new(name, options)
|
|
458
|
+
end
|
|
525
459
|
end
|
|
526
460
|
end
|
|
527
461
|
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,20 +51,14 @@ 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
|
-
# Person.find(BSON::ObjectId)
|
|
55
|
+
# Person.find(Moped::BSON::ObjectId)
|
|
79
56
|
#
|
|
80
57
|
# @param [ Array ] args An assortment of finder options.
|
|
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,28 +87,46 @@ 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.
|
|
116
|
-
# Person.first
|
|
117
|
-
#
|
|
118
|
-
# @param [ Array ] args The conditions with options.
|
|
115
|
+
# Person.first
|
|
119
116
|
#
|
|
120
117
|
# @return [ Document ] The first matching document.
|
|
121
|
-
def first
|
|
122
|
-
|
|
118
|
+
def first
|
|
119
|
+
with_default_scope.first
|
|
123
120
|
end
|
|
124
121
|
|
|
125
122
|
# Find the last +Document+ given the conditions.
|
|
126
123
|
#
|
|
127
124
|
# @example Find the last document.
|
|
128
|
-
# Person.last
|
|
129
|
-
#
|
|
130
|
-
# @param [ Array ] args The conditions with options.
|
|
125
|
+
# Person.last
|
|
131
126
|
#
|
|
132
127
|
# @return [ Document ] The last matching document.
|
|
133
|
-
def last
|
|
134
|
-
|
|
128
|
+
def last
|
|
129
|
+
with_default_scope.last
|
|
135
130
|
end
|
|
136
131
|
|
|
137
132
|
protected
|
|
@@ -146,7 +141,7 @@ module Mongoid #:nodoc:
|
|
|
146
141
|
#
|
|
147
142
|
# @return [ Document ] The first or new document.
|
|
148
143
|
def find_or(method, attrs = {}, &block)
|
|
149
|
-
|
|
144
|
+
where(attrs).first || send(method, attrs, &block)
|
|
150
145
|
end
|
|
151
146
|
end
|
|
152
147
|
end
|