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
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
-
5
- # Insert is a persistence command responsible for taking a document that
6
- # has not been saved to the database and saving it. This specific class
7
- # handles the case when the document is embedded in another.
8
- #
9
- # The underlying query resembles the following MongoDB query:
10
- #
11
- # collection.insert(
12
- # { "_id" : 1, "field" : "value" },
13
- # false
14
- # );
15
- class InsertEmbedded < Command
16
-
17
- # Insert the new document in the database. If the document's parent is a
18
- # new record, we will call save on the parent, otherwise we will $push
19
- # the document onto the parent.
20
- #
21
- # Example:
22
- #
23
- # <tt>Insert.persist</tt>
24
- #
25
- # Returns:
26
- #
27
- # The +Document+, whether the insert succeeded or not.
28
- def persist
29
- return document if validate && document.invalid?(:create)
30
- parent = document._parent
31
- if parent.new_record?
32
- parent.insert
33
- else
34
- update = { document._inserter => { document._position => document.as_document } }
35
- collection.update(parent._selector, update, options.merge(:multi => false))
36
- document.new_record = false
37
- document.move_changes
38
- end
39
- document
40
- end
41
- end
42
- end
43
- end
@@ -1,44 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
-
5
- # Remove is a persistence command responsible for deleting a document from
6
- # the database.
7
- #
8
- # The underlying query resembles the following MongoDB query:
9
- #
10
- # collection.remove(
11
- # { "_id" : 1 },
12
- # false
13
- # );
14
- class Remove < Command
15
-
16
- # Remove the document from the database: delegates to the MongoDB
17
- # collection remove method.
18
- #
19
- # Example:
20
- #
21
- # <tt>Remove.persist</tt>
22
- #
23
- # Returns:
24
- #
25
- # +true+ if success, +false+ if not.
26
- def persist
27
- remove
28
- end
29
-
30
- protected
31
- # Remove the document from the database.
32
- def remove
33
- if document.embedded?
34
- Persistence::RemoveEmbedded.new(
35
- document,
36
- options.merge(:validate => validate, :suppress => suppress)
37
- ).persist
38
- else
39
- collection.remove({ :_id => document.id }, options)
40
- end; true
41
- end
42
- end
43
- end
44
- end
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
-
5
- # Remove is a persistence command responsible for deleting a document from
6
- # the database.
7
- #
8
- # The underlying query resembles the following MongoDB query:
9
- #
10
- # collection.remove(
11
- # { "field" : value },
12
- # false
13
- # );
14
- class RemoveAll < Command
15
-
16
- # Remove the document from the database: delegates to the MongoDB
17
- # collection remove method.
18
- #
19
- # Example:
20
- #
21
- # <tt>Remove.persist</tt>
22
- #
23
- # Returns:
24
- #
25
- # +true+ if success, +false+ if not.
26
- def persist
27
- remove
28
- end
29
-
30
- protected
31
- # Remove the document from the database.
32
- def remove
33
- select = (klass.hereditary? ? selector.merge(:_type => klass.name) : selector)
34
- collection.find(select).count.tap do
35
- collection.remove(select, options)
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,48 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
-
5
- # Remove is a persistence command responsible for deleting a document from
6
- # the database.
7
- #
8
- # The underlying query resembles the following MongoDB query:
9
- #
10
- # collection.remove(
11
- # { "_id" : 1 },
12
- # false
13
- # );
14
- class RemoveEmbedded < Command
15
-
16
- # Remove the document from the database. If the parent is a new record,
17
- # it will get removed in Ruby only. If the parent is not a new record
18
- # then either an $unset or $set will occur, depending if it's an
19
- # embeds_one or embeds_many.
20
- #
21
- # Example:
22
- #
23
- # <tt>RemoveEmbedded.persist</tt>
24
- #
25
- # Returns:
26
- #
27
- # +true+ or +false+, depending on if the removal passed.
28
- def persist
29
- parent = document._parent
30
- parent.remove_child(document) unless suppress?
31
- unless parent.new_record?
32
- update = { document._remover => removal_selector }
33
- collection.update(parent._selector, update, options.merge(:multi => false))
34
- end; true
35
- end
36
-
37
- protected
38
- # Get the value to pass to the removal modifier.
39
- def setter
40
- document._index ? document.id : true
41
- end
42
-
43
- def removal_selector
44
- document._index ? { document._pull => { "_id" => document.id } } : { document._path => setter }
45
- end
46
- end
47
- end
48
- end
@@ -1,77 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Persistence #:nodoc:
4
-
5
- # Update is a persistence command responsible for taking a document that
6
- # has already been saved to the database and saving it, depending on
7
- # whether or not the document has been modified.
8
- #
9
- # Before persisting the command will check via dirty attributes if the
10
- # document has changed, if not, it will simply return true. If it has it
11
- # will go through the validation steps, run callbacks, and set the changed
12
- # fields atomically on the document. The underlying query resembles the
13
- # following MongoDB query:
14
- #
15
- # collection.update(
16
- # { "_id" : 1,
17
- # { "$set" : { "field" : "value" },
18
- # false,
19
- # false
20
- # );
21
- #
22
- # For embedded documents it will use the positional locator:
23
- #
24
- # collection.update(
25
- # { "_id" : 1, "addresses._id" : 2 },
26
- # { "$set" : { "addresses.$.field" : "value" },
27
- # false,
28
- # false
29
- # );
30
- #
31
- class Update < Command
32
-
33
- # Persist the document that is to be updated to the database. This will
34
- # only write changed fields via MongoDB's $set modifier operation.
35
- #
36
- # Example:
37
- #
38
- # <tt>Update.persist</tt>
39
- #
40
- # Returns:
41
- #
42
- # +true+ or +false+, depending on validation.
43
- def persist
44
- return false if validate && document.invalid?(:update)
45
- document.run_callbacks(:save) do
46
- document.run_callbacks(:update) do
47
- if update
48
- document.move_changes
49
- document._children.each do |child|
50
- child.move_changes
51
- child.new_record = false if child.new_record?
52
- end
53
- true
54
- else
55
- return false
56
- end
57
- end
58
- end
59
- end
60
-
61
- protected
62
- # Update the document in the database atomically.
63
- def update
64
- updates = document._updates
65
- unless updates.empty?
66
- other_pushes = updates.delete(:other)
67
- collection.update(document._selector, updates, options.merge(:multi => false))
68
- collection.update(
69
- document._selector,
70
- { "$pushAll" => other_pushes },
71
- options.merge(:multi => false)
72
- ) if other_pushes
73
- end; true
74
- end
75
- end
76
- end
77
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
-
4
- # Contains behaviour for determining if Mongoid is in safe mode.
5
- module Safe
6
-
7
- # Determine based on configuration if we are persisting in safe mode or
8
- # not.
9
- #
10
- # The query option will always override the global configuration.
11
- #
12
- # @example Are we in safe mode?
13
- # document.safe_mode?(:safe => true)
14
- #
15
- # @param [ Hash ] options Persistence options.
16
- #
17
- # @return [ true, false ] True if in safe mode, false if not.
18
- def safe_mode?(options)
19
- safe = options[:safe]
20
- safe.nil? ? Mongoid.persist_in_safe_mode : safe
21
- end
22
- end
23
- end
@@ -1,58 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Validations #:nodoc:
4
-
5
- # Validates whether or not an association is valid or not. Will correctly
6
- # handle has one and has many associations. Will *not* load associations if
7
- # they aren't already in memory.
8
- #
9
- # @example Set up the association validations.
10
- #
11
- # class Person
12
- # include Mongoid::Document
13
- # references_many :posts, :validate => true
14
- # end
15
- class ReferencedValidator < ActiveModel::EachValidator
16
-
17
- # Validate the document for the initialized attributes. Will not load
18
- # any association that's not currently loaded.
19
- #
20
- # @param [ Document ] document The document to validate.
21
- def validate(document)
22
- attributes.each do |attribute|
23
- value = document.instance_variable_get("@#{attribute}".to_sym)
24
- validate_each(document, attribute, value)
25
- end
26
- end
27
-
28
- # Validates that the already loaded associations provided are either all
29
- # nil or unchanged or all valid. If neither is true then the appropriate
30
- # errors will be added to the parent document.
31
- #
32
- # @example Validate the loaded association.
33
- # validator.validate_each(document, :name, name)
34
- #
35
- # @param [ Document ] document The document to validate.
36
- # @param [ Symbol ] attribute The relation to validate.
37
- # @param [ Object ] value The value of the relation.
38
- def validate_each(document, attribute, value)
39
- document.validated = true
40
- valid =
41
- if !value || !value.target
42
- true
43
- else
44
- Array.wrap(value).collect do |doc|
45
- if doc.nil? || (!doc.changed? && !doc.new_record?)
46
- true
47
- else
48
- doc.validated? ? true : doc.valid?
49
- end
50
- end.all?
51
- end
52
- document.validated = false
53
- return if valid
54
- document.errors.add(attribute, :invalid, options.merge(:value => value))
55
- end
56
- end
57
- end
58
- end