mongoid 2.8.1 → 3.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -3,88 +3,830 @@
3
3
  For instructions on upgrading to newer versions, visit
4
4
  [mongoid.org](http://mongoid.org/docs/upgrading.html).
5
5
 
6
- ## 2.8.1
6
+ ## 3.0.0 (branch: master)
7
7
 
8
- * Mongoid now requires Ruby driver ~> 1.9.
8
+ ### New Features
9
9
 
10
- ## 2.7.1
10
+ * \#1989 Criteria `count`, `size` and `length` now behave as Active Record
11
+ with regards to database access.
11
12
 
12
- ### Resolved Issues
13
+ `Criteria#count` will always hit the database to get the count.
13
14
 
14
- * \#2934 Fixed thread local persistence options not getting cleared out
15
- on create.
15
+ `Criteria#length` and `Criteria#size` will hit the database once if the
16
+ criteria has not been loaded, and subsequent calls will return the
17
+ cached value.
16
18
 
17
- ## 2.7.0
19
+ If the criteria has been iterated over or loaded, `length` and `size`
20
+ will never hit the db.
18
21
 
19
- ### New Features
22
+ * \#1976 Eager loading no longer produces queries when the base query returns
23
+ zero results.
20
24
 
21
- * \#2932 The minumum mongo and bson dependencies have been bumped to
22
- 1.8 and higher.
25
+ * `Model.find_by` now accepts a block and will yield to the found document if
26
+ it is not nil.
23
27
 
24
- ## 2.6.0
28
+ Band.find_by(name: "Depeche Mode") do |band|
29
+ band.likes = 100
30
+ end
25
31
 
26
- ### New Features
32
+ * \#1958/\#1798 Documents and `belongs_to` relations now support touch.
27
33
 
28
- * \#2709 Backported the `touch` functionality from Mongoid 3.
34
+ class Band
35
+ include Mongoid::Document
36
+ include Mongoid::Timestamps::Updated
37
+ belongs_to :label, touch: true
38
+ end
29
39
 
30
- ## 2.5.2
40
+ Update the document's updated_at timestamp to the current time. This
41
+ will also update any touchable relation's timestamp as well.
31
42
 
32
- ### Resolved Issues
43
+ Band.first.touch
33
44
 
34
- * \#2502 Fixed cache key to properly handle when the document does not
35
- include `Mongoid::Timestamps::Updated`. (Arthur Nogueira Neves)
45
+ Update a specific time field along with the udpated_at.
36
46
 
37
- ## 2.5.1
47
+ Band.first.touch(:founded)
38
48
 
39
- ### Resolved Issues
49
+ This fires no validations or callbacks.
40
50
 
41
- * \#2492 Backport cascading callbacks performance and memory fixes from
42
- 3.0.0-stable.
51
+ * Mongoid now supports MongoDB's $findAndModify command.
43
52
 
44
- * \#2464 Backport the nested attributes fix for keeping many relations in
45
- memory when updating attributes. (Chris Thompson)
53
+ Band.find_and_modify("$inc" => { likes: 1 })
46
54
 
47
- ## 2.5.0
55
+ Band.desc(:name).only(:name).find_and_modify(
56
+ { "$inc" => { likes: 1 }}, new: true
57
+ )
48
58
 
49
- ### New Features
59
+ * \#1906 Mongoid will retrieve documents from the identity map when
60
+ providing multiple ids to find. (Hans Hasselberg)
50
61
 
51
- * This is a release to support the 1.7.0 and higher Mongo and BSON gems and
52
- resolves issues that kept the 2.4.x series locked below 1.6.2
62
+ * \#1903 Mongoid raises an error if provided a javascript expression
63
+ to a where clause on an embedded collection. (Sebastien Azimi)
53
64
 
54
- ## 2.4.13
65
+ * Aggregations now adhere to both a Mongoid API and their enumerable
66
+ counterparts where applicable.
55
67
 
56
- ### Resolved Issues
68
+ Band.min(:likes)
69
+ Band.min do |a, b|
70
+ a.likes <=> b.likes
71
+ end
57
72
 
58
- * \#2240 Ensure `Criteria#safely` and `Criteria#unsafely` raise errors since
59
- the calls must happen before the criteria is created.
73
+ Band.max(:likes)
74
+ Band.max do |a, b|
75
+ a.likes <=> b.likes
76
+ end
60
77
 
61
- * \#2167 Return nil when trying to set array fields with empty strings to
62
- protect from blank form fields.
78
+ Note that when providing a field name and no block, a single numeric
79
+ value will be returned, but when providing a block, a document will
80
+ be returned which has the min/max value. This is since Ruby's
81
+ Enumerable API dictates when providing a block, the matching element
82
+ is returned.
63
83
 
64
- ## 2.4.12
84
+ When providing a block, all documents will be loaded into memory.
85
+ When providing a symbol, the execution is handled via map/reduce on
86
+ the server.
65
87
 
66
- ### Resolved Issues
88
+ * A kitchen sink aggregation method is now provided, to get everything in
89
+ in a single call for a field.
90
+
91
+ Band.aggregates(:likes)
92
+ # =>
93
+ # {
94
+ # "count" => 2.0,
95
+ # "max" => 1000.0,
96
+ # "min" => 500.0,
97
+ # "sum" => 1500.0,
98
+ # "avg" => 750.0
99
+ # }
100
+
101
+ * A DSL off the criteria API is now provided for map/reduce operations
102
+ as a convenience.
103
+
104
+ Band.where(name: "Tool").map_reduce(map, reduce).out(inline: 1)
105
+ Band.map_reduce(map, reduce).out(replace: "coll-name")
106
+ Band.map_reduce(map, reduce).out(inline: 1).finalize(finalize)
107
+
108
+ * Mongoid now uses Origin for its Criteria API. See the Origin repo
109
+ and API docs for the documentation.
110
+
111
+ * \#1861 Mongoid now raises an `AmbiguousRelationship` error when it
112
+ cannot determine the inverse of a relation and there are multiple
113
+ potential candidates. (Hans Hasselberg)
114
+
115
+ * You can now perform an explain directly from criteria.
116
+
117
+ Band.where(name: "Depeche Mode").explain
118
+
119
+ * \#1856 Push on one to many relations can now be chained.
120
+
121
+ band.albums.push(undertow).push(aenima)
122
+
123
+ * \#1842 MultiParameterAttributes now supported aliased fields.
124
+ (Anton Orel)
125
+
126
+ * \#1833 If an embedded document is attempted to be saved with no
127
+ parent defined, Mongoid now will raise a `Mongoid::Errors::NoParent`
128
+ exception.
129
+
130
+ * Added an ORM-agnostic way to get the field names
131
+
132
+ class Band
133
+ include Mongoid::Document
134
+ field :name, type: String
135
+ end
136
+
137
+ Band.attribute_names
138
+
139
+ * \#1831 `find_or_create_by` on relations now takes mass assignment
140
+ and type options. (Tatsuya Ono)
141
+
142
+ class Band
143
+ include Mongoid::Document
144
+ embeds_many :albums
145
+ end
146
+
147
+ band.albums.find_or_create_by({ name: "101" }, LP)
148
+
149
+ * \#1818 Add capability to choose the key where your `embeds_many` relation
150
+ is stores. (Cyril Mougel)
151
+
152
+ class User
153
+ include Mongoid::Document
154
+ field :name, type: String
155
+ embeds_many :prefs, class_name: "Preference", store_as: 'my_preferences'
156
+ end
157
+
158
+ user.prefs.build(value: "ok")
159
+ user.save
160
+ # document saves in MongoDB as:
161
+ # { "name" => "foo", "my_preferences" => [{ "value" => "ok" }]}
162
+
163
+ * \#1806 `Model.find_or_create_by` and `Model.find_or_initialize_by` can now
164
+ take documents as paramters for belongs_to relations.
165
+
166
+ person = Person.first
167
+ Game.find_or_create_by(person: person)
168
+
169
+ * \#1774 Relations now have a :restrict option for dependent relations
170
+ which will raise an error when attempting to delete a parent that
171
+ still has children on it. (Hans Hasselberg)
172
+
173
+ class Band
174
+ include Mongoid::Document
175
+ has_many :albums, dependent: :restrict
176
+ end
177
+
178
+ band = Band.first
179
+ band.albums << Albums.first
180
+ band.delete # Raises DeleteRestriction error.
181
+
182
+ * \#1764 Add method to check if field differs from the default value.
183
+
184
+ class Band
185
+ include Mongoid::Document
186
+ field :name, type: String, default: "New"
187
+ end
188
+
189
+ band = Band.first
190
+ band.name_changed_from_default?
191
+
192
+ * \#1759 Invalid fields error messages have been updated to show the
193
+ source and location of the original method. The new message is:
194
+
195
+ Problem:
196
+ Defining a field named 'crazy_method' is not allowed.
197
+ Summary:
198
+ Defining this field would override the method 'crazy_method',
199
+ which would cause issues with expectations around the original
200
+ method and cause extremely hard to debug issues.
201
+ The original method was defined in:
202
+ Object: MyModule
203
+ File: /path/to/my/module.rb
204
+ Line: 8
205
+ Resolution:
206
+ Use Mongoid.destructive_fields to see what names are
207
+ not allowed, and don't use these names. These include names
208
+ that also conflict with core Ruby methods on Object, Module,
209
+ Enumerable, or included gems that inject methods into these
210
+ or Mongoid internals.
211
+
212
+ * \#1753/#1649 A setter and getter for has_many relations to set it's
213
+ children is now provided. (Piotr Jakubowski)
214
+
215
+ class Album
216
+ include Mongoid::Document
217
+ has_many :engineers
218
+ end
219
+
220
+ class Engineer
221
+ include Mongoid::Document
222
+ belongs_to :album
223
+ end
224
+
225
+ album = Album.first
226
+ engineer = Engineer.first
227
+ album.engineer_ids = [ engineer.id ]
228
+ album.engineer_ids # Returns the ids of the engineers.
229
+
230
+ * \#1741 Mongoid now provides a rake task to force remove indexes for
231
+ environments where Mongoid manages the index definitions and the
232
+ removal should be automated. (Hans Hasselberg)
233
+
234
+ rake db:force_remove_indexes
235
+ rake db:mongoid:force_remove_indexes
236
+
237
+ * \#1726 `Mongoid.load!` now accepts an optional second argument for the
238
+ environment to load. This takes precedence over any environment variable
239
+ that is set if provided.
240
+
241
+ Mongoid.load!("/path/to/mongoid.yml", :development)
242
+
243
+ * \#1724 Mongoid now supports regex fields.
244
+
245
+ class Rule
246
+ include Mongoid::Document
247
+ field :pattern, type: Regexp, default: /[^abc]/
248
+ end
249
+
250
+ * \#1714/\#1706 Added better logging on index creation. (Hans Hasselberg)
251
+
252
+ When an index is present on a root document model:
253
+
254
+ Creating indexes on: Model for: name, dob.
255
+
256
+ When an index is defined on an embedded model:
257
+
258
+ Index ignored on: Address, please define in the root model.
259
+
260
+ When no index is defined, nothing is logged, and if a bad index is
261
+ defined an error is raised.
262
+
263
+ * \#1710 For cases when you don't want Mongoid to auto-protect the id
264
+ and type attributes, you can set a configuration option to turn this
265
+ off.
266
+
267
+ Mongoid.protect_sensitive_fields = false
268
+
269
+ * \#1685 Belongs to relations now have build_ and create_ methods.
270
+
271
+ class Comment
272
+ include Mongoid::Document
273
+ belongs_to :user
274
+ end
275
+
276
+ comment = Comment.new
277
+ comment.build_user # Build a new user object
278
+ comment.create_user # Create a new user object
279
+
280
+ * \#1684 Raise a `Mongoid::Errors::InverseNotFound` when attempting to
281
+ set a child on a relation without the proper inverse_of definitions
282
+ due to Mongoid not being able to determine it.
283
+
284
+ class Lush
285
+ include Mongoid::Document
286
+ embeds_one :whiskey, class_name: "Drink"
287
+ end
288
+
289
+ class Drink
290
+ include Mongoid::Document
291
+ embedded_in :alcoholic, class_name: "Lush"
292
+ end
293
+
294
+ lush = Lush.new
295
+ lush.whiskey = Drink.new # raises an InverseNotFound error.
296
+
297
+ * \#1680 Polymorphic relations now use `*_type` keys in lookup queries.
298
+
299
+ class User
300
+ include Mongoid::Document
301
+ has_many :comments, as: :commentable
302
+ end
303
+
304
+ class Comment
305
+ include Mongoid::Document
306
+ belongs_to :commentable, polymorphic: true
307
+ end
308
+
309
+ user = User.find(id)
310
+ user.comments # Uses user.id and type "User" in the query.
311
+
312
+ * \#1677 Support for parent separable polymorphic relations to the same
313
+ parent class is now available. This only works if set from the parent
314
+ side in order to know which relation the children belong to.
315
+ (Douwe Maan)
316
+
317
+ class Face
318
+ include Mongoid::Document
319
+ has_one :left_eye, class_name: "Eye", as: :visible
320
+ has_one :right_eye, class_name: "Eye", as: :visible
321
+ end
322
+
323
+ class Eye
324
+ include Mongoid::Document
325
+ belongs_to :visible, polymorphic: true
326
+ end
327
+
328
+ face = Face.new
329
+ right_eye = Eye.new
330
+ left_eye = Eye.new
331
+ face.right_eye = right_eye
332
+ face.left_eye = left_eye
333
+ right_eye.visible = face # Will raise an error.
334
+
335
+ * \#1650 Objects that respond to `to_criteria` can now be merged into
336
+ existing criteria objects.
337
+
338
+ class Filter
339
+ def to_criteria
340
+ # return a Criteria object.
341
+ end
342
+ end
343
+
344
+ criteria = Person.where(title: "Sir")
345
+ criteria.merge(filter)
346
+
347
+ * \#1635 All exceptions now provide more comprehensive errors, including
348
+ the problem that occured, a detail summary of why it happened, and
349
+ potential resolutions. Example:
350
+
351
+ (Mongoid::Errors::DocumentNotFound)
352
+ Problem:
353
+ Document not found for class Town with
354
+ id(s) [BSON::ObjectId('4f35781b8ad54812e1000001')].
355
+ Summary:
356
+ When calling Town.find with an id or array of ids,
357
+ each parameter must match a document in the database
358
+ or this error will be raised.
359
+ Resolution:
360
+ Search for an id that is in the database or set the
361
+ Mongoid.raise_not_found_error configuration option to
362
+ false, which will cause a nil to be returned instead
363
+ of raising this error.
364
+
365
+ * \#1616 `Model.find_by` added which takes a hash of arugments to search
366
+ for in the database. If no single document is returned a DocumentNotFound
367
+ error is raised. (Piotr Jakubowski)
368
+
369
+ Band.find_by(name: "Depeche Mode")
370
+
371
+ * \#1606 Mongoid now enables autosave, like Active Record, when adding
372
+ an accepts_nested_attributes_for to a relation.
373
+
374
+ class Band
375
+ include Mongoid::Document
376
+ has_many :albums
377
+ accepts_nested_attributes_for :albums # This enables the autosave.
378
+ end
379
+
380
+ * \#1477 Mongoid now automatically protects the id and type attributes
381
+ from mass assignment. You can override this (not recommended) by redefining
382
+ them as accessible.
383
+
384
+ class Band
385
+ include Mongoid::Document
386
+ attr_accessible :id, :_id, :_type
387
+ end
388
+
389
+ * \#1459 The identity map can be disabled now for specific code execution
390
+ by passing options to the unit of work.
391
+
392
+ Mongoid.unit_of_work(disable: :all) do
393
+ # Disables the identity map on all threads for the block.
394
+ end
395
+
396
+ Mongoid.unit_of_work(disable: :current) do
397
+ # Disables the identity map on the current thread for the block.
398
+ end
399
+
400
+ Mongoid.unit_of_work do
401
+ # Business as usual.
402
+ end
403
+
404
+ * \#1355 Associations now can have safety options provided to them on single
405
+ document persistence operations.
406
+
407
+ band.albums.with(safe: true).push(album)
408
+ band.albums.with(safe: true).create(name: "Smiths")
409
+
410
+ album.with(safe: true).create_producer(name: "Flood")
411
+
412
+ * \#1348 Eager loading is now supported on many-to-many relations.
413
+
414
+ * \#1292 Remove attribute now unsets the attribute when the document is
415
+ saved instead of setting to nil.
416
+
417
+ band = Band.find(id)
418
+ band.remove_attribute(:label) # Uses $unset when the document is saved.
419
+
420
+ * \#1291 Mongoid database sessions are now connected to lazily, and are
421
+ completely thread safe. If a new thread is created, then a new database
422
+ session will be created for it.
423
+
424
+ * \#1291 Mongoid now supports any number of database connections as defined in
425
+ the mongoid.yml. For example you could have a local single server db, a
426
+ multi availablity zone replica set, and a shard cluster all in the same
427
+ application environment. Mongoid can connect to any session at any point in
428
+ time.
429
+
430
+ * \#1291 Mongoid now allows you to persist to whatever database or collection
431
+ you like at runtime, on a per-query or persistence operation basis by using
432
+ `with`.
433
+
434
+ Band.with(collection: "artists").create(name: "Depeche Mode")
435
+ band.with(database: "secondary).save!
436
+ Band.with(collection: "artists").where(name: "Depeche Mode")
437
+
438
+ * \#1291 You can now configure on a per-model basis where it's documents are
439
+ stored with the new and improved `store_in` macro.
440
+
441
+ class Band
442
+ include Mongoid::Document
443
+ store_in collection: "artists", database: "secondary", session: "replica"
444
+ end
445
+
446
+ This can be overridden, of course, at runtime via the `with` method.
447
+
448
+ * \#1212 Embedded documents can now be popped off a relation with persistence.
449
+
450
+ band.albums.pop # Pop 1 document and persist the removal.
451
+ band.albums.pop(3) # Pop 3 documents and persist the removal.
452
+
453
+ * \#1188 Relations now have existence predicates for simplified checking if the
454
+ relation is blank or not. (Andy Morris)
455
+
456
+ class Band
457
+ include Mongoid::Document
458
+ embeds_many :albums
459
+ embeds_one :label
460
+ end
461
+
462
+ band = Band.new
463
+ band.albums?
464
+ band.has_albums?
465
+ band.label?
466
+ band.has_label?
467
+
468
+ * \#1188 1-1 relations now have an :autobuild option to indicate if the
469
+ relation should automatically be build with empty attributes upon access
470
+ where the relation currently does not exist. Works on embeds_one,
471
+ embedded_in, has_one, belongs_to. (Andy Morris)
472
+
473
+ class Band
474
+ include Mongoid::Document
475
+ has_one :label, autobuild: true
476
+ end
477
+
478
+ band = Band.new
479
+ band.label # Returns a new label with empty attributes.
480
+
481
+ When using existence checks, autobuilding will not execute.
482
+
483
+ band = Band.new
484
+ band.label? # Returns false, does not autobuild on a check.
485
+ band.has_label? # Returns false, does not autobuild on a check.
486
+
487
+ * \#1081 Mongoid indexes both id and type as a compound index when providing
488
+ `index: true` to a polymorphic belongs_to.
489
+
490
+ class Comment
491
+ include Mongoid::Document
492
+
493
+ # Indexes commentable_id and commentable_type as a compound index.
494
+ belongs_to :commentable, polymorphic: true, index: true
495
+ end
496
+
497
+ * \#1053 Raise a `Mongoid::Errors::UnknownAttribute` instead of no method
498
+ when attempting to set a field that is not defined and allow dynamic
499
+ fields is false. (Cyril Mougel)
67
500
 
68
- * \#2178 Ensure destroy callbacks are run post replacement of an embeds one
69
- relation.
501
+ Mongoid.allow_dynamic_fields = false
70
502
 
71
- * \#2169 Allow saves to pass when documents are destroyed after the save
72
- in a callback.
503
+ class Person
504
+ include Mongoid::Document
505
+ field :title, type: String
506
+ end
73
507
 
74
- * \#2144 Uniqueness validation on paranoid documents now properly scopes.
508
+ Person.new.age = 50 # raises the UnknownAttribute error.
75
509
 
76
- * \#2127 Don't unbind parents of embedded documents mid nested
77
- attributes deletion.
510
+ * \#772 Fields can now be flagged as readonly, which will only let their
511
+ values be set when the document is new.
78
512
 
79
- ## 2.4.11
513
+ class Band
514
+ include Mongoid::Document
515
+ field :name, type: String
516
+ field :genre, type: String
517
+
518
+ attr_readonly :name, :genre
519
+ end
520
+
521
+ Readonly values are ignored when attempting to set them on persisted
522
+ documents, with the exception of update_attribute and remove_attribute,
523
+ where errors will get raised.
524
+
525
+ band = Band.create(name: "Depeche Mode")
526
+ band.update_attribute(:name, "Smiths") # Raises ReadonlyAttribute error.
527
+ band.remove_attribute(:name) # Raises ReadonlyAttribute error.
528
+
529
+
530
+ ### Major Changes (Backwards Incompatible)
531
+
532
+ * \#2039 Validating presence of a relation now checks both the relation and
533
+ the foreign key value.
534
+
535
+ * Indexing syntax has changed. The first parameter is now a hash of
536
+ name/direction pairs with an optional second hash parameter for
537
+ additional options.
538
+
539
+ Normal indexing with options, directions are either 1 or -1:
540
+
541
+ class Band
542
+ include Mongoid::Document
543
+ field :name, type: String
544
+
545
+ index({ name: 1 }, { unique: true, background: true })
546
+ end
547
+
548
+ Geospacial indexing needs "2d" as it's direction.
549
+
550
+ class Venue
551
+ include Mongoid::Document
552
+ field :location, type: Array
553
+
554
+ index location: "2d"
555
+ end
556
+
557
+ * Custom serializable fields have revamped. Your object no longer should
558
+ include `Mongoid::Fields::Serializable` - instead it only needs to
559
+ implement 3 methods: `#mongoize`, `.demongoize` and `.evolve`.
560
+
561
+ `#mongoize` is an instance method that transforms your object into
562
+ a mongo-friendly value.
563
+
564
+ `.demongoize` is a class method, that can take some data from mongo
565
+ and instantiate and object of your custom type.
566
+
567
+ `.evolve` is a class method, that can take any object, and
568
+ transform it for use in a `Mongoid::Criteria`.
569
+
570
+ An example of an implementation of this for `Range`:
571
+
572
+ class Range
573
+
574
+ def mongoize
575
+ { "min" => first, "max" => last }
576
+ end
577
+
578
+ class << self
579
+
580
+ def demongoize(object)
581
+ Range.new(object["min"], object["max"])
582
+ end
583
+
584
+ def evolve(object)
585
+ { "$gte" => object.first, "$lte" => object.last }
586
+ end
587
+ end
588
+ end
589
+
590
+ * `Document#changes` is no longer a hash with indifferent access.
591
+
592
+ * `after_initialize` callbacks no longer cascade to children if the option
593
+ is set.
594
+
595
+ * \#1865 `count` on the memory and mongo contexts now behave exactly the
596
+ same as Ruby's `count` on enumerable, and can take an object or a block.
597
+ This is optimized on the mongo context not to load everything in memory
598
+ with the exception of passing a block.
599
+
600
+ Band.where(name: "Tool").count
601
+ Band.where(name: "Tool").count(tool) # redundant.
602
+ Band.where(name: "Tool") do |doc|
603
+ doc.likes > 0
604
+ end
605
+
606
+ Note that although the signatures are the same for both the memory and
607
+ mongo contexts, it's recommended you only use the block syntax for the
608
+ memory context since the embedded documents are already loaded into
609
+ memory.
610
+
611
+ Also note that passing a boolean to take skip and limit into account
612
+ is no longer supported, as this is not necessarily a useful feature.
613
+
614
+ * The `autocreate_indexes` configuration option has been removed.
615
+
616
+ * `Model.defaults` no longer exists. You may get all defaults with a
617
+ combination of `Model.pre_processed_defaults` and
618
+ `Model.post_processed_defaults`.
619
+
620
+ Band.pre_processed_defaults
621
+ Band.post_processed_defaults
622
+
623
+ * `Model.identity` and `Model.key` have been removed. For custom ids,
624
+ users must now override the _id field.
625
+
626
+ When the default value is a proc, the default is applied *after* all
627
+ other attributes are set.
628
+
629
+ class Band
630
+ include Mongoid::Document
631
+ field :_id, type: String, default: ->{ name }
632
+ end
633
+
634
+ To have the default applied *before* other attributes, set `:pre_processed`
635
+ to true.
636
+
637
+ class Band
638
+ include Mongoid::Document
639
+ field :_id,
640
+ type: String,
641
+ pre_processed: true,
642
+ default: ->{ BSON::ObjectId.new.to_s }
643
+ end
644
+
645
+ * Custom application exceptions in various languages has been removed,
646
+ along with the `Mongoid.add_language` feature.
647
+
648
+ * Mongoid no longer supports 1.8 syntax. 1.9.x or other vms running in
649
+ 1.9 mode is now only supported.
650
+
651
+ * \#1734 When searching for documents via `Model.find` with multiple ids,
652
+ Mongoid will raise an error if not *all* ids are found, and tell you
653
+ what the missing ones were. Previously the error only got raised if
654
+ nothing was returned.
655
+
656
+ * \#1675 Adding presence validation on a relation now enables autosave.
657
+ This is to ensure that when a new parent object is saved with a new
658
+ child and marked is valid, both are persisted to ensure a correct
659
+ state in the database.
660
+
661
+ * \#1491 Ensure empty translations returns an empty hash on access.
662
+
663
+ * \#1484 `Model#has_attribute?` now behaves the same as Active Record.
664
+
665
+ * \#1471 Mongoid no longer strips any level of precision off of times.
666
+
667
+ * \#1475 Active support's time zone is now used by default in time
668
+ serialization if it is defined.
669
+
670
+ * \#1342 `Model.find` and `model.relation.find` now only take a single or
671
+ multiple ids. The first/last/all with a conditions hash has been removed.
672
+
673
+ * \#1291 The mongoid.yml has been revamped completely, and upgrading
674
+ existing applications will greet you with some lovely Mongoid specific
675
+ configuration errors. You can re-generate a new mongoid.yml via the
676
+ existing rake task, which is commented to an insane degree to help you
677
+ with all the configuration possibilities.
678
+
679
+ * \#1291 The `persist_in_safe_mode` configuration option has been removed.
680
+ You must now tell a database session in the mongoid.yml whether or not
681
+ it should persist in safe mode by default.
682
+
683
+ production:
684
+ sessions:
685
+ default:
686
+ database: my_app_prod
687
+ hosts:
688
+ - db.app.com:27018
689
+ - db.app.com:27019
690
+ options:
691
+ consistency: :eventual
692
+ safe: true
693
+
694
+ * \#1291 `safely` and `unsafely` have been removed. Please now use `with`
695
+ to provide safe mode options at runtime.
696
+
697
+ Band.with(safe: true).create
698
+ band.with(safe: { w: 3 }).save!
699
+ Band.with(safe: false).create!
700
+
701
+ * \#1270 Relation macros have been changed to match their AR counterparts:
702
+ only :has_one, :has_many, :has_and_belongs_to_many, and :belongs_to
703
+ exist now.
704
+
705
+ * \#1268 `Model#new?` has been removed, developers must now always use
706
+ `Model#new_record?`.
707
+
708
+ * \#1182 A reload is no longer required to refresh a relation after setting
709
+ the value of the foreign key field for it. Note this behaves exactly as
710
+ Active Record.
711
+
712
+ If the id is set, but the document for it has not been persisted, accessing
713
+ the relation will return empty results.
714
+
715
+ If the id is set and it's document is persisted, accessing the relation
716
+ will return the document.
717
+
718
+ If the id is set, but the base document is not saved afterwards, then
719
+ reloading will return the document to it's original state.
720
+
721
+ * \#1093 Field serialization strategies have changed on Array, Hash, Integer
722
+ and Boolean to be more consistent and match AR where appropriate.
723
+
724
+ Serialization of arrays calls `Array.wrap(object)`
725
+ Serialization of hashes calls `Hash[object]` (to_hash on the object)
726
+ Serialization of integers always returns an int via `to_i`
727
+ Serialization of booleans defaults to false instead of nil.
728
+
729
+ * \#933 `:field.size` has been renamed to `:field.count` in criteria for
730
+ $size not to conflict with Symbol's size method.
731
+
732
+ * \#829/\#797 Mongoid scoping code has been completely rewritten, and now
733
+ matches the Active Record API. With this backwards incompatible change,
734
+ some methods have been removed or renamed.
735
+
736
+ Criteria#as_conditions and Criteria#fuse no longer exist.
737
+
738
+ Criteria#merge now only accepts another object that responds to
739
+ `to_criteria`.
740
+
741
+ Criteria#merge! now merges in another object without creating a new
742
+ criteria object.
743
+
744
+ Band.where(name: "Tool").merge!(criteria)
745
+
746
+ Named scopes and default scopes no longer take hashes as parameters.
747
+ From now on only criteria and procs wrapping criteria will be
748
+ accepted, and an error will be raised if the arguments are incorrect.
749
+
750
+ class Band
751
+ include Mongoid::Document
752
+
753
+ default_scope ->{ where(active: true) }
754
+ scope :inactive, where(active: false)
755
+ scope :invalid, where: { valid: false } # This will raise an error.
756
+ end
757
+
758
+ The 'named_scope' macro has been removed, from now on only use 'scope'.
759
+
760
+ Model.unscoped now accepts a block which will not allow default scoping
761
+ to be applied for any calls inside the block.
762
+
763
+ Band.unscoped do
764
+ Band.scoped.where(name: "Ministry")
765
+ end
766
+
767
+ Model.scoped now takes options that will be set directly on the criteria
768
+ options hash.
769
+
770
+ Band.scoped(skip: 10, limit: 20)
80
771
 
81
772
  ### Resolved Issues
82
773
 
83
- * This release forces a cap on the mongo driver version at 1.6.2 due to
84
- changes in the `Mongo::Connection.from_uri` API not allowing valid
85
- connection options anymore.
774
+ * \#1997 Cascading callbacks should be able to halt the callback chain when
775
+ terminating.
776
+
777
+ * \#1972 `added`, `loaded`, and `unloaded` can now be valid scope names on a
778
+ document that is part of a 1-n relation.
86
779
 
87
- * \#2040 Fixed bad interpolation for locale presence validation.
780
+ * \#1952/#1950 `#all_in` behaviour on embedded documents now properly matches
781
+ root documents when passing an empty array. (Hans Hasselberg)
782
+
783
+ * \#1941/#1939 `Model.find_by` now returns nil if raise not found error is
784
+ set to false. (Hans Hasselberg)
785
+
786
+ * \#1859/#1860 `Model#remove_attribute` now properly unsets on embedded
787
+ documents. (Anton Onyshchenko)
788
+
789
+ * \#1852 Ensure no infinite recursion on cascading callbacks. (Ara Howard)
790
+
791
+ * \#1823 `Relation#includes?` now properly works with identity map enabled.
792
+
793
+ * \#1810 `Model#changed?` no longer returns true when hash and array fields
794
+ have only been accessed.
795
+
796
+ * \#1876/\#1782 Allow dot notation in embeds many criteria queries.
797
+ (Cyril Mougel)
798
+
799
+ * \#1745 Fixed batch clear to work within attribute setting.
800
+
801
+ * \#1718 Ensure consistency of #first/#last in relations - they now always
802
+ match first/last in the database, but opts for in memory first.
803
+
804
+ * \#1692/\#1376 `Model#updateattributes` and `Model#update_attributes!` now
805
+ accept assignment options. (Hans Hasselberg)
806
+
807
+ * \#1688/\#1207 Don't require namespacing when providing class name on
808
+ relation macros inside the namespace. (Hans Hasselberg)
809
+
810
+ * \#1665/\#1672 Expand complex criteria in nested criteria selectors, like
811
+ \#matches. (Hans Hasselberg)
812
+
813
+ * \#1335 Don't add id sorting criteria to first/last is there is already
814
+ sorting options on the criteria.
815
+
816
+ * \#1321 Referenced many enumerable targets are now hash-backed, preventing
817
+ duplicates in a more efficient manner.
818
+
819
+ * \#1135 DateTimes now properly get time zones on deserialization.
820
+
821
+ * \#1031 Mongoid now serializes values in Array fields to their proper
822
+ Mongo-friendly values when possible.
823
+
824
+ * \#685 Attempting to use versioning with embedded documents will now
825
+ raise a proper error alerting the developer this is not allowed.
826
+
827
+ ## 2.4.11 (branch: 2.4.0-stable)
828
+
829
+ ### Resolved Issues
88
830
 
89
831
  * \#2038 Allow inverse relations to be determined by foreign keys alone
90
832
  if defined on both sides, not just an inverse_of declaration.
@@ -95,8 +837,6 @@ For instructions on upgrading to newer versions, visit
95
837
  * \#2008 Presence validation should hit the db to check validity if the
96
838
  relation in memory is blank.
97
839
 
98
- * \#2006 Allow excluding only the _id field post execution of an #only call.
99
-
100
840
  ## 2.4.10
101
841
 
102
842
  ### Resolved Issues
@@ -113,8 +853,6 @@ For instructions on upgrading to newer versions, visit
113
853
  * \#1987 Don't double-insert documents into identity map when eager loading
114
854
  twice inside the unit of work.
115
855
 
116
- * \#1976 Don't execute eager load queries when base query is empty.
117
-
118
856
  * \#1953 Uniqueness validation now works on localized fields.
119
857
 
120
858
  * \#1936 Allow setting n levels deep embedded documents atomically without
@@ -156,7 +894,7 @@ For instructions on upgrading to newer versions, visit
156
894
  * \#1916/\#1913 Uniqueness validation no longer is affected by the default
157
895
  scope. (Hans Hasselberg)
158
896
 
159
- * \#1778 Ensure foreign keys are always set regardless of binding state.
897
+ * \#1943 Ensure numericality validation works for big decimals.
160
898
 
161
899
  ## 2.4.8
162
900
 
@@ -267,8 +1005,8 @@ For instructions on upgrading to newer versions, visit
267
1005
 
268
1006
  * \#1676 Allow eager loading to work as a default scope.
269
1007
 
270
- * \#1665/#1672 Expand complex criteria in nested criteria selectors, like
271
- #matches. (Hans Hasselberg)
1008
+ * \#1665/\#1672 Expand complex criteria in nested criteria selectors, like
1009
+ \#matches. (Hans Hasselberg)
272
1010
 
273
1011
  * \#1668 Ensure Mongoid logger exists before calling warn. (Rémy Coutable)
274
1012
 
@@ -276,10 +1014,10 @@ For instructions on upgrading to newer versions, visit
276
1014
 
277
1015
  * \#1659 Clear delayed atomic sets when resetting the same embedded relation.
278
1016
 
279
- * \#1656/#1657 Don't hit database for uniqueness validation if BOTH scope
1017
+ * \#1656/\#1657 Don't hit database for uniqueness validation if BOTH scope
280
1018
  and attribute hasn't changed. (priyaaank)
281
1019
 
282
- * \#1205/#1642 When limiting fields returned from the database via
1020
+ * \#1205/\#1642 When limiting fields returned from the database via
283
1021
  `Criteria#only` and `Criteria#without` and then subsequently saving
284
1022
  the document. Default values no longer override excluded fields.
285
1023
 
@@ -290,16 +1028,18 @@ For instructions on upgrading to newer versions, visit
290
1028
  * \#1647 DateTime serialization when already in UTC does not convert to
291
1029
  local time.
292
1030
 
1031
+ * \#1641/\#1639 Mongoid.observer.disable :all now behaves as AR does.
1032
+
293
1033
  * \#1640 Update consumers should be tied to the name of the collection
294
1034
  they persist to, not the name of the class.
295
1035
 
296
- * \#1636 Scopes no longer modify parent class scopes when subclassing.
1036
+ * \#1637/\#1636 Scopes no longer modify parent class scopes when subclassing.
297
1037
  (Hans Hasselberg)
298
1038
 
299
1039
  * \#1629 $all and $in criteria on embedded many relations now properly
300
1040
  handles regex searches and elements of varying length. (Douwe Maan)
301
1041
 
302
- * \#1623 Default scopes no longer break Mongoid::Versioning.
1042
+ * \#1623/\#1634 Default scopes no longer break Mongoid::Versioning.
303
1043
  (Hans Hasselberg)
304
1044
 
305
1045
  * \#1605 Fix regression of rescue responses, Rails 3.2
@@ -308,6 +1048,10 @@ For instructions on upgrading to newer versions, visit
308
1048
 
309
1049
  ### Resolved Issues
310
1050
 
1051
+ * \#1628 _type field can once again be included in serialization to json
1052
+ or xml as a global option with `include_type_for_serialization`.
1053
+ (Roman Shterenzon)
1054
+
311
1055
  * \#1627 Validating format now works properly with localized fields.
312
1056
  (Douwe Maan)
313
1057