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.
Files changed (240) hide show
  1. data/README.rdoc +3 -1
  2. data/Rakefile +3 -2
  3. data/lib/config/locales/bg.yml +6 -0
  4. data/lib/config/locales/de.yml +6 -0
  5. data/lib/config/locales/en-GB.yml +48 -0
  6. data/lib/config/locales/en.yml +6 -3
  7. data/lib/config/locales/es.yml +6 -0
  8. data/lib/config/locales/fr.yml +6 -0
  9. data/lib/config/locales/hi.yml +39 -0
  10. data/lib/config/locales/hu.yml +13 -7
  11. data/lib/config/locales/id.yml +3 -0
  12. data/lib/config/locales/it.yml +7 -1
  13. data/lib/config/locales/ja.yml +4 -1
  14. data/lib/config/locales/kr.yml +9 -34
  15. data/lib/config/locales/nl.yml +6 -0
  16. data/lib/config/locales/pl.yml +6 -0
  17. data/lib/config/locales/pt-BR.yml +6 -0
  18. data/lib/config/locales/pt.yml +6 -0
  19. data/lib/config/locales/ro.yml +6 -0
  20. data/lib/config/locales/ru.yml +6 -0
  21. data/lib/config/locales/sv.yml +6 -0
  22. data/lib/config/locales/vi.yml +3 -0
  23. data/lib/config/locales/zh-CN.yml +6 -0
  24. data/lib/mongoid.rb +51 -45
  25. data/lib/mongoid/atomic.rb +145 -0
  26. data/lib/mongoid/atomic/modifiers.rb +109 -0
  27. data/lib/mongoid/atomic/paths.rb +3 -0
  28. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  29. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  30. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  31. data/lib/mongoid/atomic/paths/root.rb +40 -0
  32. data/lib/mongoid/attributes.rb +12 -23
  33. data/lib/mongoid/attributes/processing.rb +5 -5
  34. data/lib/mongoid/callbacks.rb +2 -0
  35. data/lib/mongoid/collection.rb +12 -59
  36. data/lib/mongoid/collections.rb +23 -20
  37. data/lib/mongoid/collections/master.rb +6 -4
  38. data/lib/mongoid/collections/operations.rb +1 -0
  39. data/lib/mongoid/collections/retry.rb +7 -0
  40. data/lib/mongoid/components.rb +2 -2
  41. data/lib/mongoid/config.rb +42 -55
  42. data/lib/mongoid/config/database.rb +6 -2
  43. data/lib/mongoid/config/replset_database.rb +7 -3
  44. data/lib/mongoid/contexts.rb +9 -3
  45. data/lib/mongoid/contexts/enumerable.rb +7 -3
  46. data/lib/mongoid/contexts/mongo.rb +139 -101
  47. data/lib/mongoid/criteria.rb +86 -69
  48. data/lib/mongoid/criterion/complex.rb +32 -5
  49. data/lib/mongoid/criterion/inclusion.rb +4 -2
  50. data/lib/mongoid/criterion/optional.rb +111 -86
  51. data/lib/mongoid/criterion/selector.rb +8 -4
  52. data/lib/mongoid/cursor.rb +27 -27
  53. data/lib/mongoid/dirty.rb +54 -214
  54. data/lib/mongoid/document.rb +37 -39
  55. data/lib/mongoid/errors/document_not_found.rb +3 -4
  56. data/lib/mongoid/errors/invalid_collection.rb +2 -3
  57. data/lib/mongoid/errors/invalid_database.rb +2 -3
  58. data/lib/mongoid/errors/invalid_field.rb +2 -3
  59. data/lib/mongoid/errors/invalid_options.rb +19 -7
  60. data/lib/mongoid/errors/invalid_type.rb +2 -3
  61. data/lib/mongoid/errors/mongoid_error.rb +5 -6
  62. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
  63. data/lib/mongoid/errors/unsupported_version.rb +2 -3
  64. data/lib/mongoid/errors/validations.rb +2 -3
  65. data/lib/mongoid/extensions.rb +8 -62
  66. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  67. data/lib/mongoid/extensions/false_class/equality.rb +14 -1
  68. data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
  69. data/lib/mongoid/extensions/hash/scoping.rb +14 -1
  70. data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
  71. data/lib/mongoid/extensions/object/reflections.rb +33 -2
  72. data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
  73. data/lib/mongoid/extensions/proc/scoping.rb +14 -1
  74. data/lib/mongoid/extensions/string/conversions.rb +4 -16
  75. data/lib/mongoid/extensions/string/inflections.rb +35 -14
  76. data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
  77. data/lib/mongoid/extensions/true_class/equality.rb +14 -1
  78. data/lib/mongoid/extras.rb +11 -30
  79. data/lib/mongoid/factory.rb +1 -1
  80. data/lib/mongoid/fields.rb +121 -29
  81. data/lib/mongoid/fields/mappings.rb +36 -0
  82. data/lib/mongoid/fields/serializable.rb +131 -0
  83. data/lib/mongoid/fields/serializable/array.rb +64 -0
  84. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  85. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  86. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  87. data/lib/mongoid/fields/serializable/boolean.rb +44 -0
  88. data/lib/mongoid/fields/serializable/date.rb +51 -0
  89. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  90. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  91. data/lib/mongoid/fields/serializable/float.rb +33 -0
  92. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
  93. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
  94. data/lib/mongoid/fields/serializable/hash.rb +25 -0
  95. data/lib/mongoid/fields/serializable/integer.rb +33 -0
  96. data/lib/mongoid/fields/serializable/object.rb +11 -0
  97. data/lib/mongoid/fields/serializable/object_id.rb +32 -0
  98. data/lib/mongoid/fields/serializable/range.rb +42 -0
  99. data/lib/mongoid/fields/serializable/set.rb +42 -0
  100. data/lib/mongoid/fields/serializable/string.rb +28 -0
  101. data/lib/mongoid/fields/serializable/symbol.rb +28 -0
  102. data/lib/mongoid/fields/serializable/time.rb +12 -0
  103. data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
  104. data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
  105. data/lib/mongoid/finders.rb +61 -37
  106. data/lib/mongoid/hierarchy.rb +43 -8
  107. data/lib/mongoid/identity_map.rb +106 -0
  108. data/lib/mongoid/indexes.rb +17 -1
  109. data/lib/mongoid/javascript.rb +2 -3
  110. data/lib/mongoid/keys.rb +10 -21
  111. data/lib/mongoid/logger.rb +22 -1
  112. data/lib/mongoid/matchers/all.rb +10 -0
  113. data/lib/mongoid/matchers/default.rb +1 -1
  114. data/lib/mongoid/matchers/exists.rb +10 -0
  115. data/lib/mongoid/matchers/gt.rb +10 -0
  116. data/lib/mongoid/matchers/gte.rb +10 -0
  117. data/lib/mongoid/matchers/in.rb +10 -0
  118. data/lib/mongoid/matchers/lt.rb +10 -0
  119. data/lib/mongoid/matchers/lte.rb +10 -0
  120. data/lib/mongoid/matchers/ne.rb +10 -0
  121. data/lib/mongoid/matchers/nin.rb +10 -0
  122. data/lib/mongoid/matchers/or.rb +7 -4
  123. data/lib/mongoid/matchers/size.rb +10 -0
  124. data/lib/mongoid/multi_database.rb +26 -6
  125. data/lib/mongoid/multi_parameter_attributes.rb +40 -17
  126. data/lib/mongoid/named_scope.rb +1 -2
  127. data/lib/mongoid/nested_attributes.rb +4 -1
  128. data/lib/mongoid/observer.rb +108 -5
  129. data/lib/mongoid/paranoia.rb +26 -26
  130. data/lib/mongoid/persistence.rb +15 -21
  131. data/lib/mongoid/persistence/atomic.rb +135 -0
  132. data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
  133. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  134. data/lib/mongoid/persistence/atomic/inc.rb +9 -6
  135. data/lib/mongoid/persistence/atomic/operation.rb +48 -7
  136. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  137. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  138. data/lib/mongoid/persistence/atomic/pull_all.rb +10 -9
  139. data/lib/mongoid/persistence/atomic/push.rb +8 -5
  140. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  141. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  142. data/lib/mongoid/persistence/atomic/set.rb +30 -0
  143. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  144. data/lib/mongoid/persistence/deletion.rb +32 -0
  145. data/lib/mongoid/persistence/insertion.rb +41 -0
  146. data/lib/mongoid/persistence/modification.rb +37 -0
  147. data/lib/mongoid/persistence/operations.rb +214 -0
  148. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  149. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  150. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  151. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  152. data/lib/mongoid/persistence/operations/update.rb +53 -0
  153. data/lib/mongoid/railtie.rb +21 -33
  154. data/lib/mongoid/railties/database.rake +12 -12
  155. data/lib/mongoid/relations.rb +9 -5
  156. data/lib/mongoid/relations/accessors.rb +15 -36
  157. data/lib/mongoid/relations/auto_save.rb +2 -2
  158. data/lib/mongoid/relations/binding.rb +28 -1
  159. data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
  160. data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
  161. data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
  162. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
  163. data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
  164. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
  165. data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
  166. data/lib/mongoid/relations/builder.rb +4 -2
  167. data/lib/mongoid/relations/builders.rb +21 -2
  168. data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
  169. data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
  170. data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
  171. data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
  172. data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
  173. data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
  174. data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
  175. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
  176. data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
  177. data/lib/mongoid/relations/embedded/atomic.rb +2 -2
  178. data/lib/mongoid/relations/embedded/in.rb +72 -41
  179. data/lib/mongoid/relations/embedded/many.rb +116 -120
  180. data/lib/mongoid/relations/embedded/one.rb +59 -41
  181. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  182. data/lib/mongoid/relations/macros.rb +28 -24
  183. data/lib/mongoid/relations/many.rb +10 -103
  184. data/lib/mongoid/relations/metadata.rb +335 -38
  185. data/lib/mongoid/relations/one.rb +7 -32
  186. data/lib/mongoid/relations/options.rb +47 -0
  187. data/lib/mongoid/relations/proxy.rb +29 -28
  188. data/lib/mongoid/relations/referenced/batch.rb +2 -3
  189. data/lib/mongoid/relations/referenced/in.rb +66 -53
  190. data/lib/mongoid/relations/referenced/many.rb +216 -143
  191. data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
  192. data/lib/mongoid/relations/referenced/one.rb +76 -58
  193. data/lib/mongoid/relations/synchronization.rb +113 -0
  194. data/lib/mongoid/relations/targets.rb +2 -0
  195. data/lib/mongoid/relations/targets/enumerable.rb +329 -0
  196. data/lib/mongoid/safety.rb +24 -156
  197. data/lib/mongoid/serialization.rb +21 -0
  198. data/lib/mongoid/state.rb +34 -0
  199. data/lib/mongoid/threaded.rb +175 -0
  200. data/lib/mongoid/timestamps/updated.rb +1 -1
  201. data/lib/mongoid/validations.rb +3 -7
  202. data/lib/mongoid/version.rb +1 -1
  203. data/lib/mongoid/versioning.rb +61 -7
  204. data/lib/rack/mongoid.rb +2 -0
  205. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  206. data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
  207. data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
  208. data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
  209. data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
  210. data/lib/rails/mongoid.rb +17 -17
  211. metadata +136 -102
  212. data/lib/mongoid/atomicity.rb +0 -111
  213. data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
  214. data/lib/mongoid/collections/slaves.rb +0 -61
  215. data/lib/mongoid/extensions/array/conversions.rb +0 -23
  216. data/lib/mongoid/extensions/array/parentization.rb +0 -13
  217. data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
  218. data/lib/mongoid/extensions/binary/conversions.rb +0 -17
  219. data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
  220. data/lib/mongoid/extensions/date/conversions.rb +0 -25
  221. data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
  222. data/lib/mongoid/extensions/float/conversions.rb +0 -20
  223. data/lib/mongoid/extensions/hash/conversions.rb +0 -19
  224. data/lib/mongoid/extensions/integer/conversions.rb +0 -20
  225. data/lib/mongoid/extensions/object/conversions.rb +0 -25
  226. data/lib/mongoid/extensions/range/conversions.rb +0 -25
  227. data/lib/mongoid/extensions/set/conversions.rb +0 -20
  228. data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
  229. data/lib/mongoid/extensions/time_conversions.rb +0 -38
  230. data/lib/mongoid/field.rb +0 -162
  231. data/lib/mongoid/paths.rb +0 -61
  232. data/lib/mongoid/persistence/command.rb +0 -71
  233. data/lib/mongoid/persistence/insert.rb +0 -53
  234. data/lib/mongoid/persistence/insert_embedded.rb +0 -43
  235. data/lib/mongoid/persistence/remove.rb +0 -44
  236. data/lib/mongoid/persistence/remove_all.rb +0 -40
  237. data/lib/mongoid/persistence/remove_embedded.rb +0 -48
  238. data/lib/mongoid/persistence/update.rb +0 -77
  239. data/lib/mongoid/safe.rb +0 -23
  240. data/lib/mongoid/validations/referenced.rb +0 -58
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ module ForeignKeys #:nodoc:
6
+
7
+ # Defines the behaviour for array fields.
8
+ class Array
9
+ include Serializable
10
+
11
+ # Get the default value for the field. If the default is a proc call
12
+ # it, otherwise clone the array.
13
+ #
14
+ # @example Get the default.
15
+ # field.default
16
+ #
17
+ # @return [ Object ] The default value cloned.
18
+ #
19
+ # @since 2.1.0
20
+ def default
21
+ 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
+ object.blank? ? [] : constraint.convert(object)
37
+ end
38
+
39
+ protected
40
+
41
+ # Get the constraint from the metadata once.
42
+ #
43
+ # @example Get the constraint.
44
+ # field.constraint
45
+ #
46
+ # @return [ Constraint ] The relation's contraint.
47
+ #
48
+ # @since 2.1.0
49
+ def constraint
50
+ @constraint ||= options[:metadata].constraint
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ module ForeignKeys #:nodoc:
6
+
7
+ # Defines the behaviour for integer foreign key fields.
8
+ class Object
9
+ include Serializable
10
+
11
+ # Serialize the object from the type defined in the model to a MongoDB
12
+ # compatible object to store.
13
+ #
14
+ # @example Serialize the field.
15
+ # field.serialize(object)
16
+ #
17
+ # @param [ Object ] object The object to cast.
18
+ #
19
+ # @return [ Array ] The converted object.
20
+ #
21
+ # @since 2.1.0
22
+ def serialize(object)
23
+ object.blank? ? nil : constraint.convert(object)
24
+ end
25
+
26
+ protected
27
+
28
+ # Get the constraint from the metadata once.
29
+ #
30
+ # @example Get the constraint.
31
+ # field.constraint
32
+ #
33
+ # @return [ Constraint ] The relation's contraint.
34
+ #
35
+ # @since 2.1.0
36
+ def constraint
37
+ @constraint ||= options[:metadata].constraint
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for hash fields.
6
+ class Hash
7
+ include Serializable
8
+
9
+ # Get the default value for the field. If the default is a proc call
10
+ # it, otherwise clone the array.
11
+ #
12
+ # @example Get the default.
13
+ # field.default
14
+ #
15
+ # @return [ Object ] The default value.
16
+ #
17
+ # @since 2.1.0
18
+ def default
19
+ return nil unless default_value
20
+ default_value.respond_to?(:call) ? default_value.call : default_value.dup
21
+ end
22
+ end
23
+ end
24
+ end
25
+ 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 integer fields.
7
+ class Integer
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 [ Integer ] The converted integer.
19
+ #
20
+ # @since 2.1.0
21
+ def serialize(object)
22
+ return nil if object.blank?
23
+ begin
24
+ object.to_s =~ /\./ ? Float(object) : Integer(object)
25
+ rescue
26
+ object
27
+ end
28
+ end
29
+ alias :set :serialize
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for object fields.
6
+ class Object
7
+ include Serializable
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+
6
+ # Defines the behaviour for BSON::ObjectId fields.
7
+ class ObjectId
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 [ BSON::ObjectId ] The converted object id.
19
+ #
20
+ # @since 2.1.0
21
+ def serialize(object)
22
+ if object.is_a?(::String)
23
+ BSON::ObjectId.from_string(object) unless object.blank?
24
+ else
25
+ object
26
+ end
27
+ end
28
+ alias :set :serialize
29
+ end
30
+ end
31
+ end
32
+ 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 range fields.
7
+ class Range
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 [ Range ] The converted range.
19
+ #
20
+ # @since 2.1.0
21
+ def deserialize(object)
22
+ object.nil? ? nil : ::Range.new(object["min"], object["max"])
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 [ Hash ] The converted hash.
34
+ #
35
+ # @since 2.1.0
36
+ def serialize(object)
37
+ object.nil? ? nil : { "min" => object.min, "max" => object.max }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ 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 set fields.
7
+ class Set
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 [ Set ] The converted set.
19
+ #
20
+ # @since 2.1.0
21
+ def deserialize(object)
22
+ ::Set.new(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 [ Array ] The converted array.
34
+ #
35
+ # @since 2.1.0
36
+ def serialize(object)
37
+ object.to_a
38
+ end
39
+ end
40
+ end
41
+ end
42
+ 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 string fields.
7
+ class String
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 [ String ] The converted string.
19
+ #
20
+ # @since 2.1.0
21
+ def serialize(object)
22
+ object.try(:to_s)
23
+ end
24
+ alias :set :serialize
25
+ end
26
+ end
27
+ end
28
+ 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 symbol fields.
7
+ class Symbol
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 [ Symbol ] The converted symbol.
19
+ #
20
+ # @since 2.1.0
21
+ def serialize(object)
22
+ object.blank? ? nil : object.to_sym
23
+ end
24
+ alias :set :serialize
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for date fields.
6
+ class Time
7
+ include Serializable
8
+ include Timekeeping
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #:nodoc:
5
+ # Defines the behaviour for time with zone fields.
6
+ class TimeWithZone
7
+ include Serializable
8
+ include Timekeeping
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,102 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Fields #:nodoc:
4
+ module Serializable #: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
+ # Serialize the object from the type defined in the model to a MongoDB
42
+ # compatible object to store.
43
+ #
44
+ # @example Serialize the field.
45
+ # field.serialize(object)
46
+ #
47
+ # @param [ Object ] object The object to cast.
48
+ #
49
+ # @return [ Time ] The converted UTC time.
50
+ #
51
+ # @since 2.1.0
52
+ def serialize(object)
53
+ return nil if object.blank?
54
+ time = convert_to_time(object)
55
+ strip_milliseconds(time).utc
56
+ end
57
+
58
+ # Convert the provided object to a UTC time to store in the database.
59
+ #
60
+ # @example Set the time.
61
+ # Time.convert_to_time(Date.today)
62
+ #
63
+ # @param [ String, Date, DateTime, Array ] value The object to cast.
64
+ #
65
+ # @return [ Time ] The object as a UTC time.
66
+ #
67
+ # @since 1.0.0
68
+ def convert_to_time(value)
69
+ time = Mongoid::Config.use_activesupport_time_zone? ? ::Time.zone : ::Time
70
+ case value
71
+ when ::String
72
+ time.parse(value)
73
+ when ::DateTime
74
+ time.local(value.year, value.month, value.day, value.hour, value.min, value.sec)
75
+ when ::Date
76
+ time.local(value.year, value.month, value.day)
77
+ when ::Array
78
+ time.local(*value)
79
+ else
80
+ value
81
+ end
82
+ end
83
+
84
+ # Strip the milliseconds off the time.
85
+ #
86
+ # @todo Durran: Why is this here? Still need time refactoring.
87
+ #
88
+ # @example Strip.
89
+ # Time.strip_millseconds(Time.now)
90
+ #
91
+ # @param [ Time ] time The time to strip.
92
+ #
93
+ # @return [ Time ] The time without millis.
94
+ #
95
+ # @since 2.1.0
96
+ def strip_milliseconds(time)
97
+ ::Time.at(time.to_i)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end