mongoid-multi-db 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 +615 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +49 -0
- data/lib/config/locales/bg.yml +54 -0
- data/lib/config/locales/de.yml +54 -0
- data/lib/config/locales/en-GB.yml +55 -0
- data/lib/config/locales/en.yml +55 -0
- data/lib/config/locales/es.yml +52 -0
- data/lib/config/locales/fr.yml +55 -0
- data/lib/config/locales/hi.yml +46 -0
- data/lib/config/locales/hu.yml +57 -0
- data/lib/config/locales/id.yml +55 -0
- data/lib/config/locales/it.yml +52 -0
- data/lib/config/locales/ja.yml +50 -0
- data/lib/config/locales/kr.yml +47 -0
- data/lib/config/locales/nl.yml +52 -0
- data/lib/config/locales/pl.yml +52 -0
- data/lib/config/locales/pt-BR.yml +53 -0
- data/lib/config/locales/pt.yml +53 -0
- data/lib/config/locales/ro.yml +59 -0
- data/lib/config/locales/ru.yml +54 -0
- data/lib/config/locales/sv.yml +53 -0
- data/lib/config/locales/vi.yml +55 -0
- data/lib/config/locales/zh-CN.yml +46 -0
- data/lib/mongoid.rb +148 -0
- data/lib/mongoid/atomic.rb +230 -0
- data/lib/mongoid/atomic/modifiers.rb +243 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +43 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +40 -0
- data/lib/mongoid/attributes.rb +234 -0
- data/lib/mongoid/attributes/processing.rb +146 -0
- data/lib/mongoid/callbacks.rb +135 -0
- data/lib/mongoid/collection.rb +153 -0
- data/lib/mongoid/collection_proxy.rb +59 -0
- data/lib/mongoid/collections.rb +120 -0
- data/lib/mongoid/collections/master.rb +45 -0
- data/lib/mongoid/collections/operations.rb +44 -0
- data/lib/mongoid/collections/retry.rb +46 -0
- data/lib/mongoid/components.rb +96 -0
- data/lib/mongoid/config.rb +347 -0
- data/lib/mongoid/config/database.rb +186 -0
- data/lib/mongoid/config/replset_database.rb +82 -0
- data/lib/mongoid/connection_proxy.rb +30 -0
- data/lib/mongoid/contexts.rb +25 -0
- data/lib/mongoid/contexts/enumerable.rb +288 -0
- data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
- data/lib/mongoid/contexts/mongo.rb +409 -0
- data/lib/mongoid/copyable.rb +48 -0
- data/lib/mongoid/criteria.rb +418 -0
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/complex.rb +84 -0
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/exclusion.rb +108 -0
- data/lib/mongoid/criterion/inclusion.rb +305 -0
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +232 -0
- data/lib/mongoid/criterion/selector.rb +153 -0
- data/lib/mongoid/cursor.rb +86 -0
- data/lib/mongoid/database_proxy.rb +97 -0
- data/lib/mongoid/default_scope.rb +36 -0
- data/lib/mongoid/dirty.rb +110 -0
- data/lib/mongoid/document.rb +280 -0
- data/lib/mongoid/errors.rb +17 -0
- data/lib/mongoid/errors/callback.rb +26 -0
- data/lib/mongoid/errors/document_not_found.rb +28 -0
- data/lib/mongoid/errors/eager_load.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_database.rb +19 -0
- data/lib/mongoid/errors/invalid_field.rb +18 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_time.rb +25 -0
- data/lib/mongoid/errors/invalid_type.rb +25 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/errors/mongoid_error.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unsaved_document.rb +23 -0
- data/lib/mongoid/errors/unsupported_version.rb +20 -0
- data/lib/mongoid/errors/validations.rb +23 -0
- data/lib/mongoid/extensions.rb +82 -0
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +26 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
- data/lib/mongoid/extensions/hash/scoping.rb +25 -0
- data/lib/mongoid/extensions/integer/checks.rb +23 -0
- data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
- data/lib/mongoid/extensions/object/checks.rb +29 -0
- data/lib/mongoid/extensions/object/reflections.rb +48 -0
- data/lib/mongoid/extensions/object/substitutable.rb +15 -0
- data/lib/mongoid/extensions/object/yoda.rb +44 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
- data/lib/mongoid/extensions/proc/scoping.rb +25 -0
- data/lib/mongoid/extensions/string/checks.rb +36 -0
- data/lib/mongoid/extensions/string/conversions.rb +22 -0
- data/lib/mongoid/extensions/string/inflections.rb +118 -0
- data/lib/mongoid/extensions/symbol/checks.rb +23 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
- data/lib/mongoid/extensions/true_class/equality.rb +26 -0
- data/lib/mongoid/extras.rb +31 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +332 -0
- data/lib/mongoid/fields/mappings.rb +41 -0
- data/lib/mongoid/fields/serializable.rb +201 -0
- data/lib/mongoid/fields/serializable/array.rb +49 -0
- data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
- data/lib/mongoid/fields/serializable/bignum.rb +10 -0
- data/lib/mongoid/fields/serializable/binary.rb +11 -0
- data/lib/mongoid/fields/serializable/boolean.rb +43 -0
- data/lib/mongoid/fields/serializable/date.rb +51 -0
- data/lib/mongoid/fields/serializable/date_time.rb +28 -0
- data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
- data/lib/mongoid/fields/serializable/float.rb +32 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
- data/lib/mongoid/fields/serializable/hash.rb +11 -0
- data/lib/mongoid/fields/serializable/integer.rb +44 -0
- data/lib/mongoid/fields/serializable/localized.rb +41 -0
- data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +31 -0
- data/lib/mongoid/fields/serializable/range.rb +42 -0
- data/lib/mongoid/fields/serializable/set.rb +42 -0
- data/lib/mongoid/fields/serializable/string.rb +27 -0
- data/lib/mongoid/fields/serializable/symbol.rb +27 -0
- data/lib/mongoid/fields/serializable/time.rb +23 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
- data/lib/mongoid/finders.rb +152 -0
- data/lib/mongoid/hierarchy.rb +120 -0
- data/lib/mongoid/identity.rb +92 -0
- data/lib/mongoid/identity_map.rb +119 -0
- data/lib/mongoid/indexes.rb +54 -0
- data/lib/mongoid/inspection.rb +54 -0
- data/lib/mongoid/javascript.rb +20 -0
- data/lib/mongoid/javascript/functions.yml +63 -0
- data/lib/mongoid/json.rb +16 -0
- data/lib/mongoid/keys.rb +144 -0
- data/lib/mongoid/logger.rb +39 -0
- data/lib/mongoid/matchers.rb +32 -0
- data/lib/mongoid/matchers/all.rb +21 -0
- data/lib/mongoid/matchers/and.rb +30 -0
- data/lib/mongoid/matchers/default.rb +70 -0
- data/lib/mongoid/matchers/exists.rb +23 -0
- data/lib/mongoid/matchers/gt.rb +21 -0
- data/lib/mongoid/matchers/gte.rb +21 -0
- data/lib/mongoid/matchers/in.rb +21 -0
- data/lib/mongoid/matchers/lt.rb +21 -0
- data/lib/mongoid/matchers/lte.rb +21 -0
- data/lib/mongoid/matchers/ne.rb +21 -0
- data/lib/mongoid/matchers/nin.rb +21 -0
- data/lib/mongoid/matchers/or.rb +33 -0
- data/lib/mongoid/matchers/size.rb +21 -0
- data/lib/mongoid/matchers/strategies.rb +93 -0
- data/lib/mongoid/multi_database.rb +31 -0
- data/lib/mongoid/multi_parameter_attributes.rb +106 -0
- data/lib/mongoid/named_scope.rb +146 -0
- data/lib/mongoid/nested_attributes.rb +54 -0
- data/lib/mongoid/observer.rb +170 -0
- data/lib/mongoid/paranoia.rb +158 -0
- data/lib/mongoid/persistence.rb +264 -0
- data/lib/mongoid/persistence/atomic.rb +223 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +31 -0
- data/lib/mongoid/persistence/atomic/operation.rb +85 -0
- data/lib/mongoid/persistence/atomic/pop.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
- data/lib/mongoid/persistence/atomic/push.rb +31 -0
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/sets.rb +30 -0
- data/lib/mongoid/persistence/atomic/unset.rb +28 -0
- data/lib/mongoid/persistence/deletion.rb +32 -0
- data/lib/mongoid/persistence/insertion.rb +41 -0
- data/lib/mongoid/persistence/modification.rb +37 -0
- data/lib/mongoid/persistence/operations.rb +211 -0
- data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
- data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
- data/lib/mongoid/persistence/operations/insert.rb +34 -0
- data/lib/mongoid/persistence/operations/remove.rb +33 -0
- data/lib/mongoid/persistence/operations/update.rb +64 -0
- data/lib/mongoid/railtie.rb +126 -0
- data/lib/mongoid/railties/database.rake +182 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +144 -0
- data/lib/mongoid/relations/accessors.rb +138 -0
- data/lib/mongoid/relations/auto_save.rb +38 -0
- data/lib/mongoid/relations/binding.rb +26 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +83 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +26 -0
- data/lib/mongoid/relations/cascading/nullify.rb +18 -0
- data/lib/mongoid/relations/cascading/strategy.rb +26 -0
- data/lib/mongoid/relations/constraint.rb +42 -0
- data/lib/mongoid/relations/conversions.rb +35 -0
- data/lib/mongoid/relations/cyclic.rb +103 -0
- data/lib/mongoid/relations/embedded/atomic.rb +89 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/in.rb +220 -0
- data/lib/mongoid/relations/embedded/many.rb +560 -0
- data/lib/mongoid/relations/embedded/one.rb +206 -0
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +310 -0
- data/lib/mongoid/relations/many.rb +135 -0
- data/lib/mongoid/relations/metadata.rb +919 -0
- data/lib/mongoid/relations/nested_builder.rb +75 -0
- data/lib/mongoid/relations/one.rb +36 -0
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/polymorphic.rb +40 -0
- data/lib/mongoid/relations/proxy.rb +145 -0
- data/lib/mongoid/relations/referenced/batch.rb +72 -0
- data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
- data/lib/mongoid/relations/referenced/in.rb +262 -0
- data/lib/mongoid/relations/referenced/many.rb +623 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
- data/lib/mongoid/relations/referenced/one.rb +272 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +153 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +372 -0
- data/lib/mongoid/reloading.rb +91 -0
- data/lib/mongoid/safety.rb +105 -0
- data/lib/mongoid/scope.rb +31 -0
- data/lib/mongoid/serialization.rb +134 -0
- data/lib/mongoid/sharding.rb +61 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +530 -0
- data/lib/mongoid/threaded/lifecycle.rb +192 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +24 -0
- data/lib/mongoid/timestamps/timeless.rb +50 -0
- data/lib/mongoid/timestamps/updated.rb +26 -0
- data/lib/mongoid/validations.rb +140 -0
- data/lib/mongoid/validations/associated.rb +46 -0
- data/lib/mongoid/validations/uniqueness.rb +145 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +185 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +70 -0
- data/lib/rails/mongoid.rb +91 -0
- metadata +465 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
module Fields #:nodoc:
|
4
|
+
|
5
|
+
# This module maps classes used in field type definitions to the custom
|
6
|
+
# definable field in Mongoid.
|
7
|
+
module Mappings
|
8
|
+
extend self
|
9
|
+
|
10
|
+
MODULE = "Mongoid::Fields::Serializable"
|
11
|
+
|
12
|
+
# Get the custom field type for the provided class used in the field
|
13
|
+
# definition.
|
14
|
+
#
|
15
|
+
# @example Get the mapping for the class.
|
16
|
+
# Mappings.for(BSON::ObjectId)
|
17
|
+
#
|
18
|
+
# @param [ Class ] klass The class to get the field type for.
|
19
|
+
#
|
20
|
+
# @return [ Class ] The class of the custom field.
|
21
|
+
#
|
22
|
+
# @since 2.1.0
|
23
|
+
def for(klass, foreign_key = false)
|
24
|
+
return Serializable::Object unless klass
|
25
|
+
if foreign_key
|
26
|
+
return "#{MODULE}::ForeignKeys::#{klass.to_s.demodulize}".constantize
|
27
|
+
end
|
28
|
+
begin
|
29
|
+
modules = "#{ MODULE }::|BSON::|ActiveSupport::"
|
30
|
+
if match = klass.to_s.match(Regexp.new("^(#{ modules })?(\\w+)$"))
|
31
|
+
"#{MODULE}::#{ match[2] }".constantize
|
32
|
+
else
|
33
|
+
klass.to_s.constantize
|
34
|
+
end
|
35
|
+
rescue NameError
|
36
|
+
klass
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,201 @@
|
|
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 default_val.respond_to?(:call)
|
78
|
+
serialize(doc.instance_exec(&default_val))
|
79
|
+
else
|
80
|
+
serialize(default_val.duplicable? ? default_val.dup : default_val)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Is the field localized or not?
|
85
|
+
#
|
86
|
+
# @example Is the field localized?
|
87
|
+
# field.localized?
|
88
|
+
#
|
89
|
+
# @return [ true, false ] If the field is localized.
|
90
|
+
#
|
91
|
+
# @since 2.3.0
|
92
|
+
def localized?
|
93
|
+
!!@localize
|
94
|
+
end
|
95
|
+
|
96
|
+
# Get the metadata for the field if its a foreign key.
|
97
|
+
#
|
98
|
+
# @example Get the metadata.
|
99
|
+
# field.metadata
|
100
|
+
#
|
101
|
+
# @return [ Metadata ] The relation metadata.
|
102
|
+
#
|
103
|
+
# @since 2.2.0
|
104
|
+
def metadata
|
105
|
+
@metadata ||= options[:metadata]
|
106
|
+
end
|
107
|
+
|
108
|
+
# Is the field a BSON::ObjectId?
|
109
|
+
#
|
110
|
+
# @example Is the field a BSON::ObjectId?
|
111
|
+
# field.object_id_field?
|
112
|
+
#
|
113
|
+
# @return [ true, false ] If the field is a BSON::ObjectId.
|
114
|
+
#
|
115
|
+
# @since 2.2.0
|
116
|
+
def object_id_field?
|
117
|
+
@object_id_field ||= (type == BSON::ObjectId)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Serialize the object from the type defined in the model to a MongoDB
|
121
|
+
# compatible object to store.
|
122
|
+
#
|
123
|
+
# @example Serialize the field.
|
124
|
+
# field.serialize(object)
|
125
|
+
#
|
126
|
+
# @param [ Object ] object The object to cast.
|
127
|
+
#
|
128
|
+
# @return [ Object ] The converted object.
|
129
|
+
#
|
130
|
+
# @since 2.1.0
|
131
|
+
def serialize(object); object; end
|
132
|
+
|
133
|
+
# Get the type of this field - inferred from the class name.
|
134
|
+
#
|
135
|
+
# @example Get the type.
|
136
|
+
# field.type
|
137
|
+
#
|
138
|
+
# @return [ Class ] The name of the class.
|
139
|
+
#
|
140
|
+
# @since 2.1.0
|
141
|
+
def type
|
142
|
+
@type ||= options[:type] || Object
|
143
|
+
end
|
144
|
+
|
145
|
+
# Is this field included in versioned attributes?
|
146
|
+
#
|
147
|
+
# @example Is the field versioned?
|
148
|
+
# field.versioned?
|
149
|
+
#
|
150
|
+
# @return [ true, false ] If the field is included in versioning.
|
151
|
+
#
|
152
|
+
# @since 2.1.0
|
153
|
+
def versioned?
|
154
|
+
@versioned ||= (options[:versioned].nil? ? true : options[:versioned])
|
155
|
+
end
|
156
|
+
|
157
|
+
module ClassMethods #:nodoc:
|
158
|
+
|
159
|
+
# Create the new field with a name and optional additional options.
|
160
|
+
#
|
161
|
+
# @example Create the new field.
|
162
|
+
# Field.new(:name, :type => String)
|
163
|
+
#
|
164
|
+
# @param [ Hash ] options The field options.
|
165
|
+
#
|
166
|
+
# @option options [ Class ] :type The class of the field.
|
167
|
+
# @option options [ Object ] :default The default value for the field.
|
168
|
+
# @option options [ String ] :label The field's label.
|
169
|
+
#
|
170
|
+
# @since 2.1.0
|
171
|
+
def instantiate(name, options = {})
|
172
|
+
allocate.tap do |field|
|
173
|
+
field.name = name
|
174
|
+
field.options = options
|
175
|
+
field.label = options[:label]
|
176
|
+
field.localize = options[:localize]
|
177
|
+
field.default_val = options[:default]
|
178
|
+
unless field.default_val
|
179
|
+
field.default_val = {} if field.localized?
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
|
186
|
+
# If we define a method called deserialize then we need to cast on
|
187
|
+
# read.
|
188
|
+
#
|
189
|
+
# @example Hook into method added.
|
190
|
+
# method_added(:deserialize)
|
191
|
+
#
|
192
|
+
# @param [ Symbol ] method The method name.
|
193
|
+
#
|
194
|
+
# @since 2.3.4
|
195
|
+
def method_added(method)
|
196
|
+
self.cast_on_read = true if method == :deserialize
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Fields #:nodoc:
|
4
|
+
module Serializable #:nodoc:
|
5
|
+
|
6
|
+
# Defines the behaviour for array fields.
|
7
|
+
class Array
|
8
|
+
include Serializable
|
9
|
+
|
10
|
+
# Serialize the object from the type defined in the model to a MongoDB
|
11
|
+
# compatible object to store.
|
12
|
+
#
|
13
|
+
# @example Serialize the field.
|
14
|
+
# field.serialize(object)
|
15
|
+
#
|
16
|
+
# @param [ Object ] object The object to cast.
|
17
|
+
#
|
18
|
+
# @return [ Array ] The converted object.
|
19
|
+
#
|
20
|
+
# @since 2.1.0
|
21
|
+
def serialize(object)
|
22
|
+
raise_or_return(object)
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
# If the value is not an array or nil we will raise an error,
|
28
|
+
# otherwise return the value.
|
29
|
+
#
|
30
|
+
# @example Raise or return the value.
|
31
|
+
# field.raise_or_return([])
|
32
|
+
#
|
33
|
+
# @param [ Object ] value The value to check.a
|
34
|
+
#
|
35
|
+
# @raise [ InvalidType ] If not passed an array.
|
36
|
+
#
|
37
|
+
# @return [ Array ] The array.
|
38
|
+
#
|
39
|
+
# @since 2.1.0
|
40
|
+
def raise_or_return(value)
|
41
|
+
unless value.nil? || value.is_a?(::Array)
|
42
|
+
raise Mongoid::Errors::InvalidType.new(::Array, value)
|
43
|
+
end
|
44
|
+
value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Fields #:nodoc:
|
4
|
+
module Serializable #:nodoc:
|
5
|
+
|
6
|
+
# Defines the behaviour for big decimal fields.
|
7
|
+
class BigDecimal
|
8
|
+
include Serializable
|
9
|
+
|
10
|
+
# Deserialize this field from the type stored in MongoDB to the type
|
11
|
+
# defined on the model.
|
12
|
+
#
|
13
|
+
# @example Deserialize the field.
|
14
|
+
# field.deserialize(object)
|
15
|
+
#
|
16
|
+
# @param [ Object ] object The object to cast.
|
17
|
+
#
|
18
|
+
# @return [ BigDecimal ] The converted big decimal.
|
19
|
+
#
|
20
|
+
# @since 2.1.0
|
21
|
+
def deserialize(object)
|
22
|
+
object ? ::BigDecimal.new(object) : 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 ? object.to_s : object
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Fields #:nodoc:
|
4
|
+
module Serializable #:nodoc:
|
5
|
+
|
6
|
+
# Defines the behaviour for boolean fields.
|
7
|
+
class Boolean
|
8
|
+
include Serializable
|
9
|
+
|
10
|
+
MAPPINGS = {
|
11
|
+
true => true,
|
12
|
+
"true" => true,
|
13
|
+
"TRUE" => true,
|
14
|
+
"1" => true,
|
15
|
+
1 => true,
|
16
|
+
1.0 => true,
|
17
|
+
false => false,
|
18
|
+
"false" => false,
|
19
|
+
"FALSE" => false,
|
20
|
+
"0" => false,
|
21
|
+
0 => false,
|
22
|
+
0.0 => false
|
23
|
+
}
|
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 [ true, false ] The converted boolean.
|
34
|
+
#
|
35
|
+
# @since 2.1.0
|
36
|
+
def serialize(object)
|
37
|
+
object = MAPPINGS[object]
|
38
|
+
object.nil? ? nil : object
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Fields #:nodoc:
|
4
|
+
module Serializable #:nodoc:
|
5
|
+
|
6
|
+
# Defines the behaviour for date fields.
|
7
|
+
class Date
|
8
|
+
include Serializable
|
9
|
+
include Timekeeping
|
10
|
+
|
11
|
+
# Deserialize this field from the type stored in MongoDB to the type
|
12
|
+
# defined on the model.
|
13
|
+
#
|
14
|
+
# @example Deserialize the field.
|
15
|
+
# field.deserialize(object)
|
16
|
+
#
|
17
|
+
# @param [ Object ] object The object to cast.
|
18
|
+
#
|
19
|
+
# @return [ Date ] The converted date.
|
20
|
+
#
|
21
|
+
# @since 2.1.0
|
22
|
+
def deserialize(object)
|
23
|
+
return nil if object.blank?
|
24
|
+
if Mongoid::Config.use_utc?
|
25
|
+
object.to_date
|
26
|
+
else
|
27
|
+
::Date.new(object.year, object.month, object.day)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
# Converts the date to a time to persist.
|
34
|
+
#
|
35
|
+
# @example Convert the date to a time.
|
36
|
+
# Date.convert_to_time(date)
|
37
|
+
#
|
38
|
+
# @param [ Date ] value The date to convert.
|
39
|
+
#
|
40
|
+
# @return [ Time ] The date converted.
|
41
|
+
#
|
42
|
+
# @since 2.1.0
|
43
|
+
def convert_to_time(value)
|
44
|
+
value = ::Date.parse(value) if value.is_a?(::String)
|
45
|
+
value = ::Date.civil(*value) if value.is_a?(::Array)
|
46
|
+
::Time.utc(value.year, value.month, value.day)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|