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,214 @@
1
+ # encoding: utf-8
2
+ require "mongoid/persistence/operations/insert"
3
+ require "mongoid/persistence/operations/remove"
4
+ require "mongoid/persistence/operations/update"
5
+ require "mongoid/persistence/operations/embedded/insert"
6
+ require "mongoid/persistence/operations/embedded/remove"
7
+
8
+ module Mongoid #:nodoc:
9
+ module Persistence #:nodoc:
10
+
11
+ # Persistence operations include this module to get basic functionality
12
+ # on initialization.
13
+ module Operations
14
+
15
+ attr_reader :conflicts, :document
16
+
17
+ # Get the collection we should be persisting to.
18
+ #
19
+ # @example Get the collection.
20
+ # operation.collection
21
+ #
22
+ # @return [ Collection ] The collection to persist to.
23
+ #
24
+ # @since 2.1.0
25
+ def collection
26
+ @collection ||= document._root.collection
27
+ end
28
+
29
+ # Get the atomic delete operations for embedded documents.
30
+ #
31
+ # @example Get the atomic deletes.
32
+ # operation.deletes
33
+ #
34
+ # @return [ Hash ] The atomic delete selector.
35
+ #
36
+ # @since 2.1.0
37
+ def deletes
38
+ { document.atomic_delete_modifier =>
39
+ { document.atomic_path =>
40
+ document._index ? { "_id" => document.id } : true } }
41
+ end
42
+
43
+ # Instantiate the new persistence operation.
44
+ #
45
+ # @example Create the operation.
46
+ # Operation.new(document, { :safe => true }, { "field" => "value" })
47
+ #
48
+ # @param [ Document ] document The document to persist.
49
+ # @param [ Hash ] options The persistence options.
50
+ #
51
+ # @since 2.1.0
52
+ def initialize(document, options = {})
53
+ @document, @options = document, options
54
+ end
55
+
56
+ # Get the atomic insert for embedded documents, either a push or set.
57
+ #
58
+ # @example Get the inserts.
59
+ # operation.inserts
60
+ #
61
+ # @return [ Hash ] The insert ops.
62
+ #
63
+ # @since 2.1.0
64
+ def inserts
65
+ { document.atomic_insert_modifier =>
66
+ { document.atomic_position => document.as_document } }
67
+ end
68
+
69
+ # Should the parent document (in the case of embedded persistence) be
70
+ # notified of the child deletion. This is used when calling delete from
71
+ # the associations themselves.
72
+ #
73
+ # @example Should the parent be notified?
74
+ # operation.notifying_parent?
75
+ #
76
+ # @return [ true, false ] If the parent should be notified.
77
+ #
78
+ # @since 2.1.0
79
+ def notifying_parent?
80
+ @notifying_parent ||= !@options.delete(:suppress)
81
+ end
82
+
83
+ # Get all the options that will be sent to the database. Right now this
84
+ # is only safe mode opts.
85
+ #
86
+ # @example Get the options hash.
87
+ # operation.options
88
+ #
89
+ # @return [ Hash ] The options for the database.
90
+ #
91
+ # @since 2.1.0
92
+ def options
93
+ Safety.merge_safety_options(@options)
94
+ end
95
+
96
+ # Get the parent of the provided document.
97
+ #
98
+ # @example Get the parent.
99
+ # operation.parent
100
+ #
101
+ # @return [ Document ] The parent document.
102
+ #
103
+ # @since 2.1.0
104
+ def parent
105
+ document._parent
106
+ end
107
+
108
+ # Get the atomic selector for the document.
109
+ #
110
+ # @example Get the selector.
111
+ # operation.selector.
112
+ #
113
+ # @return [ Hash ] The mongodb selector.
114
+ #
115
+ # @since 2.1.0
116
+ def selector
117
+ @selector ||= document.atomic_selector
118
+ end
119
+
120
+ # Get the atomic updates for the document without the conflicting
121
+ # modifications.
122
+ #
123
+ # @example Get the atomic updates.
124
+ # operation.updates
125
+ #
126
+ # @return [ Hash ] The updates sans conflicting mods.
127
+ #
128
+ # @since 2.1.0
129
+ def updates
130
+ @updates ||= init_updates
131
+ end
132
+
133
+ # Should we be running validations on this persistence operation?
134
+ # Defaults to true.
135
+ #
136
+ # @example Run validations?
137
+ # operation.validating?
138
+ #
139
+ # @return [ true, false ] If we run validations.
140
+ #
141
+ # @since 2.1.0
142
+ def validating?
143
+ @validating ||= @options[:validate].nil? ? true : @options[:validate]
144
+ end
145
+
146
+ private
147
+
148
+ # Initialize the atomic updates and conflicting modifications.
149
+ #
150
+ # @example Initialize the updates.
151
+ # operation.init_updates
152
+ #
153
+ # @return [ Hash ] The atomic updates.
154
+ #
155
+ # @since 2.1.0
156
+ def init_updates
157
+ document.atomic_updates.tap do |updates|
158
+ conflicts = updates.delete(:other)
159
+ if conflicts
160
+ @conflicts = { "$pushAll" => conflicts }
161
+ end
162
+ end
163
+ end
164
+
165
+ class << self
166
+
167
+ # Get the appropriate removal operation based on the document.
168
+ #
169
+ # @example Get the deletion operation.
170
+ # Operations.remove(doc, options)
171
+ #
172
+ # @param [ Document ] doc The document to persist.
173
+ # @param [ Hash ] options The persistence options.
174
+ #
175
+ # @return [ Operations ] The operation.
176
+ #
177
+ # @since 2.1.0
178
+ def remove(doc, options = {})
179
+ (doc.embedded? ? Embedded::Remove : Remove).new(doc, options)
180
+ end
181
+
182
+ # Get the appropriate insertion operation based on the document.
183
+ #
184
+ # @example Get the insertion operation.
185
+ # Operations.insert(doc, options)
186
+ #
187
+ # @param [ Document ] doc The document to persist.
188
+ # @param [ Hash ] options The persistence options.
189
+ #
190
+ # @return [ Operations ] The operation.
191
+ #
192
+ # @since 2.1.0
193
+ def insert(doc, options = {})
194
+ (doc.embedded? ? Embedded::Insert : Insert).new(doc, options)
195
+ end
196
+
197
+ # Get the appropriate update operation based on the document.
198
+ #
199
+ # @example Get the update operation.
200
+ # Operations.update(doc, options)
201
+ #
202
+ # @param [ Document ] doc The document to persist.
203
+ # @param [ Hash ] options The persistence options.
204
+ #
205
+ # @return [ Operations ] The operation.
206
+ #
207
+ # @since 2.1.0
208
+ def update(doc, options = {})
209
+ Update.new(doc, options)
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Insert is a persistence command responsible for taking a document that
8
+ # has not been saved to the database and saving it. This specific class
9
+ # handles the case when the document is embedded in another.
10
+ #
11
+ # The underlying query resembles the following MongoDB query:
12
+ #
13
+ # collection.update(
14
+ # { "_id" : 1 },
15
+ # { "$push" : { "field" : "value" } },
16
+ # false
17
+ # );
18
+ class Insert
19
+ include Insertion, Operations
20
+
21
+ # Insert the new document in the database. If the document's parent is a
22
+ # new record, we will call save on the parent, otherwise we will $push
23
+ # the document onto the parent.
24
+ #
25
+ # @example Insert an embedded document.
26
+ # Insert.persist
27
+ #
28
+ # @return [ Document ] The document to be inserted.
29
+ def persist
30
+ prepare do
31
+ if parent.new?
32
+ parent.insert
33
+ else
34
+ collection.update(parent.atomic_selector, inserts, options)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Remove is a persistence command responsible for deleting a document from
8
+ # the database.
9
+ #
10
+ # The underlying query resembles the following MongoDB query:
11
+ #
12
+ # collection.remove(
13
+ # { "_id" : 1 },
14
+ # false
15
+ # );
16
+ class Remove
17
+ include Deletion, Operations
18
+
19
+ # Remove the document from the database. If the parent is a new record,
20
+ # it will get removed in Ruby only. If the parent is not a new record
21
+ # then either an $unset or $set will occur, depending if it's an
22
+ # embeds_one or embeds_many.
23
+ #
24
+ # @example Remove an embedded document.
25
+ # RemoveEmbedded.persist
26
+ #
27
+ # @return [ true ] Always true.
28
+ def persist
29
+ prepare do |doc|
30
+ parent.remove_child(doc) if notifying_parent?
31
+ if parent.persisted?
32
+ collection.update(parent.atomic_selector, deletes, options)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+
6
+ # Insert is a persistence command responsible for taking a document that
7
+ # has not been saved to the database and saving it.
8
+ #
9
+ # The underlying query resembles the following MongoDB query:
10
+ #
11
+ # collection.insert(
12
+ # { "_id" : 1, "field" : "value" },
13
+ # false
14
+ # );
15
+ class Insert
16
+ include Insertion, Operations
17
+
18
+ # Insert the new document in the database. This delegates to the standard
19
+ # MongoDB collection's insert command.
20
+ #
21
+ # @example Insert the document.
22
+ # Insert.persist
23
+ #
24
+ # @return [ Document ] The document to be inserted.
25
+ def persist
26
+ prepare do |doc|
27
+ collection.insert(doc.as_document, options)
28
+ IdentityMap.set(doc)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+
6
+ # Remove is a persistence command responsible for deleting a document from
7
+ # the database.
8
+ #
9
+ # The underlying query resembles the following MongoDB query:
10
+ #
11
+ # collection.remove(
12
+ # { "_id" : 1 },
13
+ # false
14
+ # );
15
+ class Remove
16
+ include Deletion, Operations
17
+
18
+ # Remove the document from the database: delegates to the MongoDB
19
+ # collection remove method.
20
+ #
21
+ # @example Remove the document.
22
+ # Remove.persist
23
+ #
24
+ # @return [ true ] Always true.
25
+ def persist
26
+ prepare do |doc|
27
+ collection.remove({ :_id => doc.id }, options)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+
6
+ # Update is a persistence command responsible for taking a document that
7
+ # has already been saved to the database and saving it, depending on
8
+ # whether or not the document has been modified.
9
+ #
10
+ # Before persisting the command will check via dirty attributes if the
11
+ # document has changed, if not, it will simply return true. If it has it
12
+ # will go through the validation steps, run callbacks, and set the changed
13
+ # fields atomically on the document. The underlying query resembles the
14
+ # following MongoDB query:
15
+ #
16
+ # collection.update(
17
+ # { "_id" : 1,
18
+ # { "$set" : { "field" : "value" },
19
+ # false,
20
+ # false
21
+ # );
22
+ #
23
+ # For embedded documents it will use the positional locator:
24
+ #
25
+ # collection.update(
26
+ # { "_id" : 1, "addresses._id" : 2 },
27
+ # { "$set" : { "addresses.$.field" : "value" },
28
+ # false,
29
+ # false
30
+ # );
31
+ #
32
+ class Update
33
+ include Modification, Operations
34
+
35
+ # Persist the document that is to be updated to the database. This will
36
+ # only write changed fields via MongoDB's $set modifier operation.
37
+ #
38
+ # @example Update the document.
39
+ # Update.persist
40
+ #
41
+ # @return [ true, false ] If the save passed.
42
+ def persist
43
+ prepare do
44
+ unless updates.empty?
45
+ collection.update(selector, updates, options)
46
+ collection.update(selector, conflicts, options) if conflicts
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -60,8 +60,7 @@ module Rails #:nodoc:
60
60
  initializer "setup database" do
61
61
  config_file = Rails.root.join("config", "mongoid.yml")
62
62
  if config_file.file?
63
- settings = YAML.load(ERB.new(config_file.read).result)[Rails.env]
64
- ::Mongoid.from_hash(settings) if settings.present?
63
+ ::Mongoid.load!(config_file)
65
64
  end
66
65
  end
67
66
 
@@ -76,17 +75,6 @@ module Rails #:nodoc:
76
75
  end
77
76
  end
78
77
 
79
- # Due to all models not getting loaded and messing up inheritance queries
80
- # and indexing, we need to preload the models in order to address this.
81
- #
82
- # This will happen every request in development, once in ther other
83
- # environments.
84
- initializer "preload all application models" do |app|
85
- config.to_prepare do
86
- ::Rails::Mongoid.load_models(app) unless $rails_rake_task
87
- end
88
- end
89
-
90
78
  # Set the proper error types for Rails. DocumentNotFound errors should be
91
79
  # 404s and not 500s, validation errors are 422s.
92
80
  initializer "load http errors" do |app|
@@ -98,27 +86,27 @@ module Rails #:nodoc:
98
86
  end
99
87
  end
100
88
 
101
- # When workers are forked in passenger and unicorn, we need to reconnect
102
- # to the database to all the workers do not share the same connection.
103
- initializer "reconnect to master if application is preloaded" do
104
- config.after_initialize do
105
-
106
- # Unicorn clears the START_CTX when a worker is forked, so if we have
107
- # data in START_CTX then we know we're being preloaded. Unicorn does
108
- # not provide application-level hooks for executing code after the
109
- # process has forked, so we reconnect lazily.
110
- if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
111
- ::Mongoid.reconnect!(false)
112
- end
89
+ # Due to all models not getting loaded and messing up inheritance queries
90
+ # and indexing, we need to preload the models in order to address this.
91
+ #
92
+ # This will happen every request in development, once in ther other
93
+ # environments.
94
+ initializer "preload all application models" do |app|
95
+ config.to_prepare do
96
+ ::Rails::Mongoid.load_models(app) unless $rails_rake_task
97
+ end
98
+ end
113
99
 
114
- # Passenger provides the :starting_worker_process event for executing
115
- # code after it has forked, so we use that and reconnect immediately.
116
- if defined?(PhusionPassenger)
117
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
118
- if forked
119
- ::Mongoid.reconnect!
120
- end
121
- end
100
+ # This initializer warns the user that preloading models is set to false,
101
+ # and queries will be inconsistent in dev mode if models are using
102
+ # inheritance.
103
+ initializer "warn of preload models configuration" do |app|
104
+ config.after_initialize do
105
+ if !::Mongoid.preload_models && !Rails.configuration.cache_classes
106
+ puts "\nMongoid preload_models is set to false. If you are using"
107
+ puts "inheritance in your application model please set this to true or "
108
+ puts "you will experience querying inconsistencies in dev mode. Note that"
109
+ puts "this will severely decrease performance in dev mode only.\n\n"
122
110
  end
123
111
  end
124
112
  end