mongoid 2.0.2 → 2.1.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/README.rdoc +3 -1
- data/Rakefile +3 -2
- data/lib/config/locales/bg.yml +6 -0
- data/lib/config/locales/de.yml +6 -0
- data/lib/config/locales/en-GB.yml +48 -0
- data/lib/config/locales/en.yml +6 -3
- data/lib/config/locales/es.yml +6 -0
- data/lib/config/locales/fr.yml +6 -0
- data/lib/config/locales/hi.yml +39 -0
- data/lib/config/locales/hu.yml +13 -7
- data/lib/config/locales/id.yml +3 -0
- data/lib/config/locales/it.yml +7 -1
- data/lib/config/locales/ja.yml +4 -1
- data/lib/config/locales/kr.yml +9 -34
- data/lib/config/locales/nl.yml +6 -0
- data/lib/config/locales/pl.yml +6 -0
- data/lib/config/locales/pt-BR.yml +6 -0
- data/lib/config/locales/pt.yml +6 -0
- data/lib/config/locales/ro.yml +6 -0
- data/lib/config/locales/ru.yml +6 -0
- data/lib/config/locales/sv.yml +6 -0
- data/lib/config/locales/vi.yml +3 -0
- data/lib/config/locales/zh-CN.yml +6 -0
- data/lib/mongoid.rb +51 -45
- data/lib/mongoid/atomic.rb +145 -0
- data/lib/mongoid/atomic/modifiers.rb +109 -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 +12 -23
- data/lib/mongoid/attributes/processing.rb +5 -5
- data/lib/mongoid/callbacks.rb +2 -0
- data/lib/mongoid/collection.rb +12 -59
- data/lib/mongoid/collections.rb +23 -20
- data/lib/mongoid/collections/master.rb +6 -4
- data/lib/mongoid/collections/operations.rb +1 -0
- data/lib/mongoid/collections/retry.rb +7 -0
- data/lib/mongoid/components.rb +2 -2
- data/lib/mongoid/config.rb +42 -55
- data/lib/mongoid/config/database.rb +6 -2
- data/lib/mongoid/config/replset_database.rb +7 -3
- data/lib/mongoid/contexts.rb +9 -3
- data/lib/mongoid/contexts/enumerable.rb +7 -3
- data/lib/mongoid/contexts/mongo.rb +139 -101
- data/lib/mongoid/criteria.rb +86 -69
- data/lib/mongoid/criterion/complex.rb +32 -5
- data/lib/mongoid/criterion/inclusion.rb +4 -2
- data/lib/mongoid/criterion/optional.rb +111 -86
- data/lib/mongoid/criterion/selector.rb +8 -4
- data/lib/mongoid/cursor.rb +27 -27
- data/lib/mongoid/dirty.rb +54 -214
- data/lib/mongoid/document.rb +37 -39
- data/lib/mongoid/errors/document_not_found.rb +3 -4
- data/lib/mongoid/errors/invalid_collection.rb +2 -3
- data/lib/mongoid/errors/invalid_database.rb +2 -3
- data/lib/mongoid/errors/invalid_field.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +19 -7
- data/lib/mongoid/errors/invalid_type.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +5 -6
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
- data/lib/mongoid/errors/unsupported_version.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -3
- data/lib/mongoid/extensions.rb +8 -62
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +14 -1
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
- data/lib/mongoid/extensions/hash/scoping.rb +14 -1
- data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
- data/lib/mongoid/extensions/object/reflections.rb +33 -2
- data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
- data/lib/mongoid/extensions/proc/scoping.rb +14 -1
- data/lib/mongoid/extensions/string/conversions.rb +4 -16
- data/lib/mongoid/extensions/string/inflections.rb +35 -14
- data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
- data/lib/mongoid/extensions/true_class/equality.rb +14 -1
- data/lib/mongoid/extras.rb +11 -30
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +121 -29
- data/lib/mongoid/fields/mappings.rb +36 -0
- data/lib/mongoid/fields/serializable.rb +131 -0
- data/lib/mongoid/fields/serializable/array.rb +64 -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 +44 -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 +33 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
- data/lib/mongoid/fields/serializable/hash.rb +25 -0
- data/lib/mongoid/fields/serializable/integer.rb +33 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +32 -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 +28 -0
- data/lib/mongoid/fields/serializable/symbol.rb +28 -0
- data/lib/mongoid/fields/serializable/time.rb +12 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
- data/lib/mongoid/finders.rb +61 -37
- data/lib/mongoid/hierarchy.rb +43 -8
- data/lib/mongoid/identity_map.rb +106 -0
- data/lib/mongoid/indexes.rb +17 -1
- data/lib/mongoid/javascript.rb +2 -3
- data/lib/mongoid/keys.rb +10 -21
- data/lib/mongoid/logger.rb +22 -1
- data/lib/mongoid/matchers/all.rb +10 -0
- data/lib/mongoid/matchers/default.rb +1 -1
- data/lib/mongoid/matchers/exists.rb +10 -0
- data/lib/mongoid/matchers/gt.rb +10 -0
- data/lib/mongoid/matchers/gte.rb +10 -0
- data/lib/mongoid/matchers/in.rb +10 -0
- data/lib/mongoid/matchers/lt.rb +10 -0
- data/lib/mongoid/matchers/lte.rb +10 -0
- data/lib/mongoid/matchers/ne.rb +10 -0
- data/lib/mongoid/matchers/nin.rb +10 -0
- data/lib/mongoid/matchers/or.rb +7 -4
- data/lib/mongoid/matchers/size.rb +10 -0
- data/lib/mongoid/multi_database.rb +26 -6
- data/lib/mongoid/multi_parameter_attributes.rb +40 -17
- data/lib/mongoid/named_scope.rb +1 -2
- data/lib/mongoid/nested_attributes.rb +4 -1
- data/lib/mongoid/observer.rb +108 -5
- data/lib/mongoid/paranoia.rb +26 -26
- data/lib/mongoid/persistence.rb +15 -21
- data/lib/mongoid/persistence/atomic.rb +135 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +9 -6
- data/lib/mongoid/persistence/atomic/operation.rb +48 -7
- 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 +10 -9
- data/lib/mongoid/persistence/atomic/push.rb +8 -5
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/set.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 +214 -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 +53 -0
- data/lib/mongoid/railtie.rb +21 -33
- data/lib/mongoid/railties/database.rake +12 -12
- data/lib/mongoid/relations.rb +9 -5
- data/lib/mongoid/relations/accessors.rb +15 -36
- data/lib/mongoid/relations/auto_save.rb +2 -2
- data/lib/mongoid/relations/binding.rb +28 -1
- data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
- data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
- data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
- data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
- data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
- data/lib/mongoid/relations/builder.rb +4 -2
- data/lib/mongoid/relations/builders.rb +21 -2
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
- data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
- data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
- data/lib/mongoid/relations/embedded/atomic.rb +2 -2
- data/lib/mongoid/relations/embedded/in.rb +72 -41
- data/lib/mongoid/relations/embedded/many.rb +116 -120
- data/lib/mongoid/relations/embedded/one.rb +59 -41
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +28 -24
- data/lib/mongoid/relations/many.rb +10 -103
- data/lib/mongoid/relations/metadata.rb +335 -38
- data/lib/mongoid/relations/one.rb +7 -32
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/proxy.rb +29 -28
- data/lib/mongoid/relations/referenced/batch.rb +2 -3
- data/lib/mongoid/relations/referenced/in.rb +66 -53
- data/lib/mongoid/relations/referenced/many.rb +216 -143
- data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
- data/lib/mongoid/relations/referenced/one.rb +76 -58
- data/lib/mongoid/relations/synchronization.rb +113 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +329 -0
- data/lib/mongoid/safety.rb +24 -156
- data/lib/mongoid/serialization.rb +21 -0
- data/lib/mongoid/state.rb +34 -0
- data/lib/mongoid/threaded.rb +175 -0
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/validations.rb +3 -7
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +61 -7
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
- data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
- data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
- data/lib/rails/mongoid.rb +17 -17
- metadata +136 -102
- data/lib/mongoid/atomicity.rb +0 -111
- data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
- data/lib/mongoid/collections/slaves.rb +0 -61
- data/lib/mongoid/extensions/array/conversions.rb +0 -23
- data/lib/mongoid/extensions/array/parentization.rb +0 -13
- data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
- data/lib/mongoid/extensions/binary/conversions.rb +0 -17
- data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
- data/lib/mongoid/extensions/date/conversions.rb +0 -25
- data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
- data/lib/mongoid/extensions/float/conversions.rb +0 -20
- data/lib/mongoid/extensions/hash/conversions.rb +0 -19
- data/lib/mongoid/extensions/integer/conversions.rb +0 -20
- data/lib/mongoid/extensions/object/conversions.rb +0 -25
- data/lib/mongoid/extensions/range/conversions.rb +0 -25
- data/lib/mongoid/extensions/set/conversions.rb +0 -20
- data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
- data/lib/mongoid/extensions/time_conversions.rb +0 -38
- data/lib/mongoid/field.rb +0 -162
- data/lib/mongoid/paths.rb +0 -61
- data/lib/mongoid/persistence/command.rb +0 -71
- data/lib/mongoid/persistence/insert.rb +0 -53
- data/lib/mongoid/persistence/insert_embedded.rb +0 -43
- data/lib/mongoid/persistence/remove.rb +0 -44
- data/lib/mongoid/persistence/remove_all.rb +0 -40
- data/lib/mongoid/persistence/remove_embedded.rb +0 -48
- data/lib/mongoid/persistence/update.rb +0 -77
- data/lib/mongoid/safe.rb +0 -23
- data/lib/mongoid/validations/referenced.rb +0 -58
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
"#{MODULE}::#{klass.to_s.demodulize}".constantize
|
|
30
|
+
rescue NameError
|
|
31
|
+
klass
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
|
|
27
|
+
# Set readers for the instance variables.
|
|
28
|
+
attr_reader :default_value, :label, :name, :options
|
|
29
|
+
|
|
30
|
+
# When reading the field do we need to cast the value? This holds true when
|
|
31
|
+
# times are stored or for big decimals which are stored as strings.
|
|
32
|
+
#
|
|
33
|
+
# @example Typecast on a read?
|
|
34
|
+
# field.cast_on_read?
|
|
35
|
+
#
|
|
36
|
+
# @return [ true, false ] If the field should be cast.
|
|
37
|
+
#
|
|
38
|
+
# @since 2.1.0
|
|
39
|
+
def cast_on_read?
|
|
40
|
+
return @cast_on_read if defined?(@cast_on_read)
|
|
41
|
+
@cast_on_read =
|
|
42
|
+
self.class.public_instance_methods(false).map do |m|
|
|
43
|
+
m.to_sym
|
|
44
|
+
end.include?(:deserialize)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Get the default value for the field.
|
|
48
|
+
#
|
|
49
|
+
# @example Get the default.
|
|
50
|
+
# field.default
|
|
51
|
+
#
|
|
52
|
+
# @return [ Object ] The default value.
|
|
53
|
+
#
|
|
54
|
+
# @since 2.1.0
|
|
55
|
+
def default
|
|
56
|
+
if default_value.respond_to?(:call)
|
|
57
|
+
serialize(default_value.call)
|
|
58
|
+
else
|
|
59
|
+
serialize(default_value)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Deserialize this field from the type stored in MongoDB to the type
|
|
64
|
+
# defined on the model
|
|
65
|
+
#
|
|
66
|
+
# @example Deserialize the field.
|
|
67
|
+
# field.deserialize(object)
|
|
68
|
+
#
|
|
69
|
+
# @param [ Object ] object The object to cast.
|
|
70
|
+
#
|
|
71
|
+
# @return [ Object ] The converted object.
|
|
72
|
+
#
|
|
73
|
+
# @since 2.1.0
|
|
74
|
+
def deserialize(object); object; end
|
|
75
|
+
|
|
76
|
+
# Create the new field with a name and optional additional options.
|
|
77
|
+
#
|
|
78
|
+
# @example Create the new field.
|
|
79
|
+
# Field.new(:name, :type => String)
|
|
80
|
+
#
|
|
81
|
+
# @param [ Hash ] options The field options.
|
|
82
|
+
#
|
|
83
|
+
# @option options [ Class ] :type The class of the field.
|
|
84
|
+
# @option options [ Object ] :default The default value for the field.
|
|
85
|
+
# @option options [ String ] :label The field's label.
|
|
86
|
+
#
|
|
87
|
+
# @since 2.1.0
|
|
88
|
+
def initialize(name, options = {})
|
|
89
|
+
@name, @options = name, options
|
|
90
|
+
@default_value, @label = options[:default], options[:label]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Serialize the object from the type defined in the model to a MongoDB
|
|
94
|
+
# compatible object to store.
|
|
95
|
+
#
|
|
96
|
+
# @example Serialize the field.
|
|
97
|
+
# field.serialize(object)
|
|
98
|
+
#
|
|
99
|
+
# @param [ Object ] object The object to cast.
|
|
100
|
+
#
|
|
101
|
+
# @return [ Object ] The converted object.
|
|
102
|
+
#
|
|
103
|
+
# @since 2.1.0
|
|
104
|
+
def serialize(object); object; end
|
|
105
|
+
|
|
106
|
+
# Get the type of this field - inferred from the class name.
|
|
107
|
+
#
|
|
108
|
+
# @example Get the type.
|
|
109
|
+
# field.type
|
|
110
|
+
#
|
|
111
|
+
# @return [ Class ] The name of the class.
|
|
112
|
+
#
|
|
113
|
+
# @since 2.1.0
|
|
114
|
+
def type
|
|
115
|
+
@type ||= options[:type] || Object
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Is this field included in versioned attributes?
|
|
119
|
+
#
|
|
120
|
+
# @example Is the field versioned?
|
|
121
|
+
# field.versioned?
|
|
122
|
+
#
|
|
123
|
+
# @return [ true, false ] If the field is included in versioning.
|
|
124
|
+
#
|
|
125
|
+
# @since 2.1.0
|
|
126
|
+
def versioned?
|
|
127
|
+
@versioned ||= (options[:versioned].nil? ? true : options[:versioned])
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
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
|
+
# Get the default value for the field. If the default is a proc call
|
|
11
|
+
# it, otherwise clone the array.
|
|
12
|
+
#
|
|
13
|
+
# @example Get the default.
|
|
14
|
+
# field.default
|
|
15
|
+
#
|
|
16
|
+
# @return [ Object ] The default value.
|
|
17
|
+
#
|
|
18
|
+
# @since 2.1.0
|
|
19
|
+
def default
|
|
20
|
+
return nil unless default_value
|
|
21
|
+
default_value.respond_to?(:call) ? default_value.call : default_value.dup
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Serialize the object from the type defined in the model to a MongoDB
|
|
25
|
+
# compatible object to store.
|
|
26
|
+
#
|
|
27
|
+
# @example Serialize the field.
|
|
28
|
+
# field.serialize(object)
|
|
29
|
+
#
|
|
30
|
+
# @param [ Object ] object The object to cast.
|
|
31
|
+
#
|
|
32
|
+
# @return [ Array ] The converted object.
|
|
33
|
+
#
|
|
34
|
+
# @since 2.1.0
|
|
35
|
+
def serialize(object)
|
|
36
|
+
raise_or_return(object)
|
|
37
|
+
end
|
|
38
|
+
alias :set :serialize
|
|
39
|
+
|
|
40
|
+
protected
|
|
41
|
+
|
|
42
|
+
# If the value is not an array or nil we will raise an error,
|
|
43
|
+
# otherwise return the value.
|
|
44
|
+
#
|
|
45
|
+
# @example Raise or return the value.
|
|
46
|
+
# field.raise_or_return([])
|
|
47
|
+
#
|
|
48
|
+
# @param [ Object ] value The value to check.a
|
|
49
|
+
#
|
|
50
|
+
# @raise [ InvalidType ] If not passed an array.
|
|
51
|
+
#
|
|
52
|
+
# @return [ Array ] The array.
|
|
53
|
+
#
|
|
54
|
+
# @since 2.1.0
|
|
55
|
+
def raise_or_return(value)
|
|
56
|
+
unless value.nil? || value.is_a?(::Array)
|
|
57
|
+
raise Mongoid::Errors::InvalidType.new(::Array, value)
|
|
58
|
+
end
|
|
59
|
+
value
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
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,44 @@
|
|
|
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
|
+
alias :set :serialize
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Fields #:nodoc:
|
|
4
|
+
module Serializable #:nodoc:
|
|
5
|
+
|
|
6
|
+
# Defines the behaviour for date time fields.
|
|
7
|
+
class DateTime
|
|
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 [ DateTime ] The converted date time.
|
|
20
|
+
#
|
|
21
|
+
# @since 2.1.0
|
|
22
|
+
def deserialize(object)
|
|
23
|
+
object.try(:to_datetime)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Fields #:nodoc:
|
|
4
|
+
module Serializable #:nodoc:
|
|
5
|
+
|
|
6
|
+
# Defines the behaviour for float fields.
|
|
7
|
+
class Float
|
|
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 [ Float ] The converted float.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.1.0
|
|
21
|
+
def serialize(object)
|
|
22
|
+
return nil if object.blank?
|
|
23
|
+
begin
|
|
24
|
+
Float(object)
|
|
25
|
+
rescue ArgumentError => e
|
|
26
|
+
object
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
alias :set :serialize
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|