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
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
module Internal #:nodoc:
|
|
5
|
-
|
|
6
|
-
# Defines the behaviour for string fields.
|
|
7
|
-
class String
|
|
8
|
-
include Serializable
|
|
9
|
-
|
|
10
|
-
# Special case to serialize the object.
|
|
11
|
-
#
|
|
12
|
-
# @example Convert to a selection.
|
|
13
|
-
# field.selection(object)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Object ] The object to convert.
|
|
16
|
-
#
|
|
17
|
-
# @return [ Object ] The converted object.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.4.0
|
|
20
|
-
def selection(object)
|
|
21
|
-
return object if object.is_a?(::Hash)
|
|
22
|
-
serialize(object)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Serialize the object from the type defined in the model to a MongoDB
|
|
26
|
-
# compatible object to store.
|
|
27
|
-
#
|
|
28
|
-
# @example Serialize the field.
|
|
29
|
-
# field.serialize(object)
|
|
30
|
-
#
|
|
31
|
-
# @param [ Object ] object The object to cast.
|
|
32
|
-
#
|
|
33
|
-
# @return [ String ] The converted string.
|
|
34
|
-
#
|
|
35
|
-
# @since 2.1.0
|
|
36
|
-
def serialize(object)
|
|
37
|
-
object.try(:to_s)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
module Internal #:nodoc:
|
|
5
|
-
|
|
6
|
-
# Defines the behaviour for symbol fields.
|
|
7
|
-
class Symbol
|
|
8
|
-
include Serializable
|
|
9
|
-
|
|
10
|
-
# Special case to serialize the object.
|
|
11
|
-
#
|
|
12
|
-
# @example Convert to a selection.
|
|
13
|
-
# field.selection(object)
|
|
14
|
-
#
|
|
15
|
-
# @param [ Object ] The object to convert.
|
|
16
|
-
#
|
|
17
|
-
# @return [ Object ] The converted object.
|
|
18
|
-
#
|
|
19
|
-
# @since 2.4.0
|
|
20
|
-
def selection(object)
|
|
21
|
-
return object if object.is_a?(::Hash)
|
|
22
|
-
serialize(object)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Serialize the object from the type defined in the model to a MongoDB
|
|
26
|
-
# compatible object to store.
|
|
27
|
-
#
|
|
28
|
-
# @example Serialize the field.
|
|
29
|
-
# field.serialize(object)
|
|
30
|
-
#
|
|
31
|
-
# @param [ Object ] object The object to cast.
|
|
32
|
-
#
|
|
33
|
-
# @return [ Symbol ] The converted symbol.
|
|
34
|
-
#
|
|
35
|
-
# @since 2.1.0
|
|
36
|
-
def serialize(object)
|
|
37
|
-
object.blank? ? nil : object.to_sym
|
|
38
|
-
end
|
|
39
|
-
alias :deserialize :serialize
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
module Internal #:nodoc:
|
|
5
|
-
# Defines the behaviour for date fields.
|
|
6
|
-
class Time
|
|
7
|
-
include Serializable
|
|
8
|
-
include Timekeeping
|
|
9
|
-
|
|
10
|
-
# When reading the field do we need to cast the value? This holds true when
|
|
11
|
-
# times are stored or for big decimals which are stored as strings.
|
|
12
|
-
#
|
|
13
|
-
# @example Typecast on a read?
|
|
14
|
-
# field.cast_on_read?
|
|
15
|
-
#
|
|
16
|
-
# @return [ true ] Date fields cast on read.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.1.0
|
|
19
|
-
def cast_on_read?; true; end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
module Internal #:nodoc:
|
|
5
|
-
# Defines the behaviour for time with zone fields.
|
|
6
|
-
class TimeWithZone
|
|
7
|
-
include Serializable
|
|
8
|
-
include Timekeeping
|
|
9
|
-
|
|
10
|
-
# When reading the field do we need to cast the value? This holds true when
|
|
11
|
-
# times are stored or for big decimals which are stored as strings.
|
|
12
|
-
#
|
|
13
|
-
# @example Typecast on a read?
|
|
14
|
-
# field.cast_on_read?
|
|
15
|
-
#
|
|
16
|
-
# @return [ true ] Date fields cast on read.
|
|
17
|
-
#
|
|
18
|
-
# @since 2.1.0
|
|
19
|
-
def cast_on_read?; true; end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
module Internal #:nodoc:
|
|
5
|
-
|
|
6
|
-
# This module contains shared behaviour for date conversions.
|
|
7
|
-
module Timekeeping
|
|
8
|
-
|
|
9
|
-
# When reading the field do we need to cast the value? This holds true when
|
|
10
|
-
# times are stored or for big decimals which are stored as strings.
|
|
11
|
-
#
|
|
12
|
-
# @example Typecast on a read?
|
|
13
|
-
# field.cast_on_read?
|
|
14
|
-
#
|
|
15
|
-
# @return [ true ] Date fields cast on read.
|
|
16
|
-
#
|
|
17
|
-
# @since 2.1.0
|
|
18
|
-
def cast_on_read?; true; end
|
|
19
|
-
|
|
20
|
-
# Deserialize this field from the type stored in MongoDB to the type
|
|
21
|
-
# defined on the model.
|
|
22
|
-
#
|
|
23
|
-
# @example Deserialize the field.
|
|
24
|
-
# field.deserialize(object)
|
|
25
|
-
#
|
|
26
|
-
# @param [ Object ] object The object to cast.
|
|
27
|
-
#
|
|
28
|
-
# @return [ Time ] The converted time.
|
|
29
|
-
#
|
|
30
|
-
# @since 2.1.0
|
|
31
|
-
def deserialize(object)
|
|
32
|
-
return nil if object.blank?
|
|
33
|
-
object = object.getlocal unless Mongoid::Config.use_utc?
|
|
34
|
-
if Mongoid::Config.use_activesupport_time_zone?
|
|
35
|
-
time_zone = Mongoid::Config.use_utc? ? "UTC" : ::Time.zone
|
|
36
|
-
object = object.in_time_zone(time_zone)
|
|
37
|
-
end
|
|
38
|
-
object
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# Special case to serialize the object.
|
|
42
|
-
#
|
|
43
|
-
# @example Convert to a selection.
|
|
44
|
-
# field.selection(object)
|
|
45
|
-
#
|
|
46
|
-
# @param [ Object ] The object to convert.
|
|
47
|
-
#
|
|
48
|
-
# @return [ Object ] The converted object.
|
|
49
|
-
#
|
|
50
|
-
# @since 2.4.0
|
|
51
|
-
def selection(object)
|
|
52
|
-
return object if object.is_a?(::Hash)
|
|
53
|
-
serialize(object)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Serialize the object from the type defined in the model to a MongoDB
|
|
57
|
-
# compatible object to store.
|
|
58
|
-
#
|
|
59
|
-
# @example Serialize the field.
|
|
60
|
-
# field.serialize(object)
|
|
61
|
-
#
|
|
62
|
-
# @param [ Object ] object The object to cast.
|
|
63
|
-
#
|
|
64
|
-
# @return [ Time ] The converted UTC time.
|
|
65
|
-
#
|
|
66
|
-
# @since 2.1.0
|
|
67
|
-
def serialize(object)
|
|
68
|
-
return nil if object.blank?
|
|
69
|
-
begin
|
|
70
|
-
time = convert_to_time(object)
|
|
71
|
-
strip_milliseconds(time).utc
|
|
72
|
-
rescue ArgumentError
|
|
73
|
-
raise Errors::InvalidTime.new(object)
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# Convert the provided object to a UTC time to store in the database.
|
|
78
|
-
#
|
|
79
|
-
# @example Set the time.
|
|
80
|
-
# Time.convert_to_time(Date.today)
|
|
81
|
-
#
|
|
82
|
-
# @param [ String, Date, DateTime, Array ] value The object to cast.
|
|
83
|
-
#
|
|
84
|
-
# @return [ Time ] The object as a UTC time.
|
|
85
|
-
#
|
|
86
|
-
# @since 1.0.0
|
|
87
|
-
def convert_to_time(value)
|
|
88
|
-
time = Mongoid::Config.use_activesupport_time_zone? ? ::Time.zone : ::Time
|
|
89
|
-
case value
|
|
90
|
-
when ::String
|
|
91
|
-
time.parse(value)
|
|
92
|
-
when ::DateTime
|
|
93
|
-
return value if value.utc? && Mongoid.use_utc?
|
|
94
|
-
time.local(value.year, value.month, value.day, value.hour, value.min, value.sec)
|
|
95
|
-
when ::Date
|
|
96
|
-
time.local(value.year, value.month, value.day)
|
|
97
|
-
when ::Array
|
|
98
|
-
time.local(*value)
|
|
99
|
-
else
|
|
100
|
-
value
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# Strip the milliseconds off the time.
|
|
105
|
-
#
|
|
106
|
-
# @todo Durran: Why is this here? Still need time refactoring.
|
|
107
|
-
#
|
|
108
|
-
# @example Strip.
|
|
109
|
-
# Time.strip_millseconds(Time.now)
|
|
110
|
-
#
|
|
111
|
-
# @param [ Time ] time The time to strip.
|
|
112
|
-
#
|
|
113
|
-
# @return [ Time ] The time without millis.
|
|
114
|
-
#
|
|
115
|
-
# @since 2.1.0
|
|
116
|
-
def strip_milliseconds(time)
|
|
117
|
-
::Time.at(time.to_i)
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
|
|
5
|
-
module Internal #:nodoc:
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
# This module maps classes used in field type definitions to the custom
|
|
9
|
-
# definable field in Mongoid.
|
|
10
|
-
module Mappings
|
|
11
|
-
extend self
|
|
12
|
-
|
|
13
|
-
# Get the custom field type for the provided class used in the field
|
|
14
|
-
# definition.
|
|
15
|
-
#
|
|
16
|
-
# @example Get the mapping for the class.
|
|
17
|
-
# Mappings.for(BSON::ObjectId)
|
|
18
|
-
#
|
|
19
|
-
# @param [ Class ] klass The class to get the field type for.
|
|
20
|
-
#
|
|
21
|
-
# @return [ Class ] The class of the custom field.
|
|
22
|
-
#
|
|
23
|
-
# @since 2.1.0
|
|
24
|
-
def for(klass, foreign_key = false)
|
|
25
|
-
if klass.nil?
|
|
26
|
-
Internal::Object
|
|
27
|
-
elsif foreign_key
|
|
28
|
-
Internal::ForeignKeys.const_get(klass.to_s)
|
|
29
|
-
else
|
|
30
|
-
modules = "BSON::|ActiveSupport::"
|
|
31
|
-
match = klass.to_s.match(Regexp.new("^(#{ modules })?(\\w+)$"))
|
|
32
|
-
if match and Internal.const_defined?(match[2])
|
|
33
|
-
Internal.const_get(match[2])
|
|
34
|
-
else
|
|
35
|
-
klass
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
module Fields #:nodoc:
|
|
4
|
-
|
|
5
|
-
# Defines the behaviour for defined fields in the document.
|
|
6
|
-
#
|
|
7
|
-
# For people who want to have custom field types in their
|
|
8
|
-
# applications and want control over the serialization process
|
|
9
|
-
# to and from the domain model and MongoDB you will need to include
|
|
10
|
-
# this module in your custom type class. You will also need to define
|
|
11
|
-
# either a #serialize and #deserialize instance method, where previously
|
|
12
|
-
# these were a .set and .get class method respectively.
|
|
13
|
-
#
|
|
14
|
-
# class MyCustomType
|
|
15
|
-
# include Mongoid::Fields::Serializable
|
|
16
|
-
#
|
|
17
|
-
# def deserialize(object)
|
|
18
|
-
# # Do something to convert it from Mongo to my type.
|
|
19
|
-
# end
|
|
20
|
-
#
|
|
21
|
-
# def serialize(object)
|
|
22
|
-
# # Do something to convert from my type to MongoDB friendly.
|
|
23
|
-
# end
|
|
24
|
-
# end
|
|
25
|
-
module Serializable
|
|
26
|
-
extend ActiveSupport::Concern
|
|
27
|
-
|
|
28
|
-
included do
|
|
29
|
-
# @todo: Durran: Pull out in 3.0.0
|
|
30
|
-
unless method_defined?(:default)
|
|
31
|
-
alias :default :default_val
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
class_attribute :cast_on_read
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Set readers for the instance variables.
|
|
38
|
-
attr_accessor :default_val, :label, :localize, :name, :options
|
|
39
|
-
|
|
40
|
-
# Get the constraint from the metadata once.
|
|
41
|
-
#
|
|
42
|
-
# @example Get the constraint.
|
|
43
|
-
# field.constraint
|
|
44
|
-
#
|
|
45
|
-
# @return [ Constraint ] The relation's contraint.
|
|
46
|
-
#
|
|
47
|
-
# @since 2.1.0
|
|
48
|
-
def constraint
|
|
49
|
-
@constraint ||= metadata.constraint
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Deserialize this field from the type stored in MongoDB to the type
|
|
53
|
-
# defined on the model
|
|
54
|
-
#
|
|
55
|
-
# @example Deserialize the field.
|
|
56
|
-
# field.deserialize(object)
|
|
57
|
-
#
|
|
58
|
-
# @param [ Object ] object The object to cast.
|
|
59
|
-
#
|
|
60
|
-
# @return [ Object ] The converted object.
|
|
61
|
-
#
|
|
62
|
-
# @since 2.1.0
|
|
63
|
-
def deserialize(object); object; end
|
|
64
|
-
|
|
65
|
-
# Evaluate the default value and return it. Will handle the
|
|
66
|
-
# serialization, proc calls, and duplication if necessary.
|
|
67
|
-
#
|
|
68
|
-
# @example Evaluate the default value.
|
|
69
|
-
# field.eval_default(document)
|
|
70
|
-
#
|
|
71
|
-
# @param [ Document ] doc The document the field belongs to.
|
|
72
|
-
#
|
|
73
|
-
# @return [ Object ] The serialized default value.
|
|
74
|
-
#
|
|
75
|
-
# @since 2.1.8
|
|
76
|
-
def eval_default(doc)
|
|
77
|
-
if fields = Threaded.selection
|
|
78
|
-
evaluated_default(doc) if included?(fields)
|
|
79
|
-
else
|
|
80
|
-
evaluated_default(doc)
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Is this field a foreign key?
|
|
85
|
-
#
|
|
86
|
-
# @example Is the field a foreign key?
|
|
87
|
-
# field.foreign_key?
|
|
88
|
-
#
|
|
89
|
-
# @return [ true, false ] If the field is a foreign key.
|
|
90
|
-
#
|
|
91
|
-
# @since 2.4.0
|
|
92
|
-
def foreign_key?
|
|
93
|
-
!!options[:identity]
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# Is the field localized or not?
|
|
97
|
-
#
|
|
98
|
-
# @example Is the field localized?
|
|
99
|
-
# field.localized?
|
|
100
|
-
#
|
|
101
|
-
# @return [ true, false ] If the field is localized.
|
|
102
|
-
#
|
|
103
|
-
# @since 2.3.0
|
|
104
|
-
def localized?
|
|
105
|
-
!!@localize
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# Get the metadata for the field if its a foreign key.
|
|
109
|
-
#
|
|
110
|
-
# @example Get the metadata.
|
|
111
|
-
# field.metadata
|
|
112
|
-
#
|
|
113
|
-
# @return [ Metadata ] The relation metadata.
|
|
114
|
-
#
|
|
115
|
-
# @since 2.2.0
|
|
116
|
-
def metadata
|
|
117
|
-
@metadata ||= options[:metadata]
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Is the field a BSON::ObjectId?
|
|
121
|
-
#
|
|
122
|
-
# @example Is the field a BSON::ObjectId?
|
|
123
|
-
# field.object_id_field?
|
|
124
|
-
#
|
|
125
|
-
# @return [ true, false ] If the field is a BSON::ObjectId.
|
|
126
|
-
#
|
|
127
|
-
# @since 2.2.0
|
|
128
|
-
def object_id_field?
|
|
129
|
-
@object_id_field ||= (type == BSON::ObjectId)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# Can the field vary in size, similar to arrays.
|
|
133
|
-
#
|
|
134
|
-
# @example Is the field varying in size?
|
|
135
|
-
# field.resizable?
|
|
136
|
-
#
|
|
137
|
-
# @return [ false ] false by default.
|
|
138
|
-
#
|
|
139
|
-
# @since 2.4.0
|
|
140
|
-
def resizable?; false; end
|
|
141
|
-
|
|
142
|
-
# Serialize the object from the type defined in the model to a MongoDB
|
|
143
|
-
# compatible object to store.
|
|
144
|
-
#
|
|
145
|
-
# @example Serialize the field.
|
|
146
|
-
# field.serialize(object)
|
|
147
|
-
#
|
|
148
|
-
# @param [ Object ] object The object to cast.
|
|
149
|
-
#
|
|
150
|
-
# @return [ Object ] The converted object.
|
|
151
|
-
#
|
|
152
|
-
# @since 2.1.0
|
|
153
|
-
def serialize(object); object; end
|
|
154
|
-
|
|
155
|
-
# Convert the provided object to a Mongoid criteria friendly value.
|
|
156
|
-
#
|
|
157
|
-
# @example Convert the field.
|
|
158
|
-
# field.selection(object)
|
|
159
|
-
#
|
|
160
|
-
# @param [ Object ] The object to convert.
|
|
161
|
-
#
|
|
162
|
-
# @return [ Object ] The converted object.
|
|
163
|
-
#
|
|
164
|
-
# @since 2.4.0
|
|
165
|
-
def selection(object); object; end
|
|
166
|
-
|
|
167
|
-
# Get the type of this field - inferred from the class name.
|
|
168
|
-
#
|
|
169
|
-
# @example Get the type.
|
|
170
|
-
# field.type
|
|
171
|
-
#
|
|
172
|
-
# @return [ Class ] The name of the class.
|
|
173
|
-
#
|
|
174
|
-
# @since 2.1.0
|
|
175
|
-
def type
|
|
176
|
-
@type ||= options[:type] || Object
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
# Is this field included in versioned attributes?
|
|
180
|
-
#
|
|
181
|
-
# @example Is the field versioned?
|
|
182
|
-
# field.versioned?
|
|
183
|
-
#
|
|
184
|
-
# @return [ true, false ] If the field is included in versioning.
|
|
185
|
-
#
|
|
186
|
-
# @since 2.1.0
|
|
187
|
-
def versioned?
|
|
188
|
-
@versioned ||= (options[:versioned].nil? ? true : options[:versioned])
|
|
189
|
-
end
|
|
190
|
-
|
|
191
|
-
private
|
|
192
|
-
|
|
193
|
-
# Is the field included in the fields that were returned from the
|
|
194
|
-
# database? We can apply the default if:
|
|
195
|
-
# 1. The field is included in an only limitation (field: 1)
|
|
196
|
-
# 2. The field is not excluded in a without limitation (field: 0)
|
|
197
|
-
#
|
|
198
|
-
# @example Is the field included?
|
|
199
|
-
# field.included?(fields)
|
|
200
|
-
#
|
|
201
|
-
# @param [ Hash ] fields The field limitations.
|
|
202
|
-
#
|
|
203
|
-
# @return [ true, false ] If the field was included.
|
|
204
|
-
#
|
|
205
|
-
# @since 2.4.4
|
|
206
|
-
def included?(fields)
|
|
207
|
-
(fields.values.first == 1 && fields[name.to_sym] == 1) ||
|
|
208
|
-
(fields.values.first == 0 && !fields.has_key?(name.to_sym))
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
# Get the evaluated default.
|
|
212
|
-
#
|
|
213
|
-
# @example Get the evaluated default.
|
|
214
|
-
# field.evaluated_default.
|
|
215
|
-
#
|
|
216
|
-
# @param [ Document ] doc The doc being applied to.
|
|
217
|
-
#
|
|
218
|
-
# @return [ Object ] The default value.
|
|
219
|
-
#
|
|
220
|
-
# @since 2.4.4
|
|
221
|
-
def evaluated_default(doc)
|
|
222
|
-
if default_val.respond_to?(:call)
|
|
223
|
-
serialize(doc.instance_exec(&default_val))
|
|
224
|
-
else
|
|
225
|
-
serialize(default_val.duplicable? ? default_val.dup : default_val)
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
module ClassMethods #:nodoc:
|
|
230
|
-
|
|
231
|
-
# Create the new field with a name and optional additional options.
|
|
232
|
-
#
|
|
233
|
-
# @example Create the new field.
|
|
234
|
-
# Field.new(:name, :type => String)
|
|
235
|
-
#
|
|
236
|
-
# @param [ Hash ] options The field options.
|
|
237
|
-
#
|
|
238
|
-
# @option options [ Class ] :type The class of the field.
|
|
239
|
-
# @option options [ Object ] :default The default value for the field.
|
|
240
|
-
# @option options [ String ] :label The field's label.
|
|
241
|
-
#
|
|
242
|
-
# @since 2.1.0
|
|
243
|
-
def instantiate(name, options = {})
|
|
244
|
-
allocate.tap do |field|
|
|
245
|
-
field.name = name
|
|
246
|
-
field.options = options
|
|
247
|
-
field.label = options[:label]
|
|
248
|
-
field.localize = options[:localize]
|
|
249
|
-
field.default_val = options[:default]
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
private
|
|
254
|
-
|
|
255
|
-
# If we define a method called deserialize then we need to cast on
|
|
256
|
-
# read.
|
|
257
|
-
#
|
|
258
|
-
# @example Hook into method added.
|
|
259
|
-
# method_added(:deserialize)
|
|
260
|
-
#
|
|
261
|
-
# @param [ Symbol ] method The method name.
|
|
262
|
-
#
|
|
263
|
-
# @since 2.3.4
|
|
264
|
-
def method_added(method)
|
|
265
|
-
self.cast_on_read = true if method == :deserialize
|
|
266
|
-
end
|
|
267
|
-
end
|
|
268
|
-
end
|
|
269
|
-
end
|
|
270
|
-
end
|
data/lib/mongoid/identity.rb
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module Mongoid #:nodoc:
|
|
3
|
-
class Identity #:nodoc:
|
|
4
|
-
|
|
5
|
-
attr_reader :document
|
|
6
|
-
|
|
7
|
-
# Create the identity for the document. The id will be set in either in
|
|
8
|
-
# the form of a Mongo object id or a composite key set up by defining
|
|
9
|
-
# a key on the document. The _type will be set to the document's class
|
|
10
|
-
# name.
|
|
11
|
-
#
|
|
12
|
-
# @example Create the id and set the type.
|
|
13
|
-
# identity.create
|
|
14
|
-
def create
|
|
15
|
-
identify.tap { type }
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Create the new identity generator - this will be expanded in the future
|
|
19
|
-
# to support pk generators.
|
|
20
|
-
#
|
|
21
|
-
# @example
|
|
22
|
-
# Identity.new(document)
|
|
23
|
-
#
|
|
24
|
-
# @param [ Document ] document The document to generate an id for.
|
|
25
|
-
#
|
|
26
|
-
# @return [ Identity ] The new identity object.
|
|
27
|
-
def initialize(document)
|
|
28
|
-
@document = document
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
# Return the proper id for the document. Will be an object id or its string
|
|
34
|
-
# representation depending on the configuration.
|
|
35
|
-
#
|
|
36
|
-
# @example Generate the id.
|
|
37
|
-
# identity.generate_id
|
|
38
|
-
#
|
|
39
|
-
# @return [ Object ] The bson object id or its string equivalent.
|
|
40
|
-
def generate_id
|
|
41
|
-
id = BSON::ObjectId.new
|
|
42
|
-
document.using_object_ids? ? id : id.to_s
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Sets the id on the document. Will either set a newly generated id or
|
|
46
|
-
# build the composite key.
|
|
47
|
-
#
|
|
48
|
-
# @example Set the id.
|
|
49
|
-
# identity.identify
|
|
50
|
-
def identify
|
|
51
|
-
document.id = compose.join(" ").identify if document.primary_key
|
|
52
|
-
document.id = generate_id if document.id.blank?
|
|
53
|
-
document.id
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# Set the _type field on the document if the document is hereditary or in a
|
|
57
|
-
# polymorphic relation.
|
|
58
|
-
#
|
|
59
|
-
# @example Set the type.
|
|
60
|
-
# identity.type
|
|
61
|
-
def type
|
|
62
|
-
document._type = document.class.name if typed?
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Generates the array of keys to build the id.
|
|
66
|
-
#
|
|
67
|
-
# @example Build the array for the keys.
|
|
68
|
-
# identity.compose.
|
|
69
|
-
#
|
|
70
|
-
# @return [ Array<Object> ] The array of keys.
|
|
71
|
-
def compose
|
|
72
|
-
kf = document.key_formatter
|
|
73
|
-
document.primary_key.collect do |key|
|
|
74
|
-
val = document.attributes[key.to_s]
|
|
75
|
-
val && kf ? kf.call(val) : val
|
|
76
|
-
end.compact
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Determines if the document stores the type information. This is if it is
|
|
80
|
-
# in a hierarchy, has subclasses, or is in a polymorphic relation.
|
|
81
|
-
#
|
|
82
|
-
# @example Check if the document is typed.
|
|
83
|
-
# identity.typed?
|
|
84
|
-
#
|
|
85
|
-
# @return [ true, false ] True if typed, false if not.
|
|
86
|
-
def typed?
|
|
87
|
-
document.hereditary? ||
|
|
88
|
-
document.class.descendants.any? ||
|
|
89
|
-
document.polymorphic?
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|