mongoid 2.8.1 → 3.0.0.rc

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 (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
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Embedded #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Embedded
5
5
 
6
6
  # This class defines the behaviour needed for embedded one to one
7
7
  # relations.
@@ -35,17 +35,16 @@ module Mongoid # :nodoc:
35
35
  #
36
36
  # @since 2.0.0.rc.1
37
37
  def substitute(replacement)
38
- tap do |proxy|
39
- if _assigning?
40
- base.atomic_unsets.push(proxy.atomic_path)
41
- else
42
- proxy.destroy if persistable?
43
- end
44
- proxy.unbind_one
45
- return nil unless replacement
46
- proxy.target = replacement
47
- proxy.bind_one
38
+ if _assigning?
39
+ base.atomic_unsets.push(atomic_path)
40
+ else
41
+ delete if persistable?
48
42
  end
43
+ unbind_one
44
+ return nil unless replacement
45
+ self.target = replacement
46
+ bind_one
47
+ self
49
48
  end
50
49
 
51
50
  private
@@ -108,6 +107,18 @@ module Mongoid # :nodoc:
108
107
  true
109
108
  end
110
109
 
110
+ # Returns the suffix of the foreign key field, either "_id" or "_ids".
111
+ #
112
+ # @example Get the suffix for the foreign key.
113
+ # Referenced::Many.foreign_key_suffix
114
+ #
115
+ # @return [ nil ] nil.
116
+ #
117
+ # @since 3.0.0
118
+ def foreign_key_suffix
119
+ nil
120
+ end
121
+
111
122
  # Returns the macro for this relation. Used mostly as a helper in
112
123
  # reflection.
113
124
  #
@@ -184,7 +195,7 @@ module Mongoid # :nodoc:
184
195
  #
185
196
  # @since 2.1.0
186
197
  def valid_options
187
- [ :as, :cascade_callbacks, :cyclic ]
198
+ [ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
188
199
  end
189
200
 
190
201
  # Get the default validation setting for the relation. Determines if
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
4
 
5
5
  # This module contains the core macros for defining relations between
6
6
  # documents. They can be either embedded or referenced (relational).
@@ -8,9 +8,11 @@ module Mongoid # :nodoc:
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  included do
11
- class_attribute :embedded, :instance_reader => false
11
+ class_attribute :embedded, instance_reader: false
12
+ class_attribute :embedded_relations
12
13
  class_attribute :relations
13
14
  self.embedded = false
15
+ self.embedded_relations = {}
14
16
  self.relations = {}
15
17
  end
16
18
 
@@ -26,7 +28,7 @@ module Mongoid # :nodoc:
26
28
  self.relations
27
29
  end
28
30
 
29
- module ClassMethods #:nodoc:
31
+ module ClassMethods
30
32
 
31
33
  # Adds the relation back to the parent document. This macro is
32
34
  # necessary to set the references from the child back to the parent
@@ -49,10 +51,14 @@ module Mongoid # :nodoc:
49
51
  # @param [ Hash ] options The relation options.
50
52
  # @param [ Proc ] block Optional block for defining extensions.
51
53
  def embedded_in(name, options = {}, &block)
52
- characterize(name, Embedded::In, options, &block).tap do |meta|
53
- self.embedded = true
54
- relate(name, meta)
54
+ if ancestors.include?(Mongoid::Versioning)
55
+ raise Errors::VersioningNotOnRoot.new(self)
55
56
  end
57
+ meta = characterize(name, Embedded::In, options, &block)
58
+ self.embedded = true
59
+ relate(name, meta)
60
+ builder(name, meta).creator(name, meta)
61
+ meta
56
62
  end
57
63
 
58
64
  # Adds the relation from a parent document to its children. The name
@@ -75,11 +81,12 @@ module Mongoid # :nodoc:
75
81
  # @param [ Hash ] options The relation options.
76
82
  # @param [ Proc ] block Optional block for defining extensions.
77
83
  def embeds_many(name, options = {}, &block)
78
- characterize(name, Embedded::Many, options, &block).tap do |meta|
79
- self.cyclic = true if options[:cyclic]
80
- relate(name, meta)
81
- validates_relation(meta)
82
- end
84
+ meta = characterize(name, Embedded::Many, options, &block)
85
+ self.cyclic = true if options[:cyclic]
86
+ relate(name, meta)
87
+ embed(name, meta)
88
+ validates_relation(meta)
89
+ meta
83
90
  end
84
91
 
85
92
  # Adds the relation from a parent document to its child. The name
@@ -102,12 +109,13 @@ module Mongoid # :nodoc:
102
109
  # @param [ Hash ] options The relation options.
103
110
  # @param [ Proc ] block Optional block for defining extensions.
104
111
  def embeds_one(name, options = {}, &block)
105
- characterize(name, Embedded::One, options, &block).tap do |meta|
106
- self.cyclic = true if options[:cyclic]
107
- relate(name, meta)
108
- builder(name, meta).creator(name, meta)
109
- validates_relation(meta)
110
- end
112
+ meta = characterize(name, Embedded::One, options, &block)
113
+ self.cyclic = true if options[:cyclic]
114
+ relate(name, meta)
115
+ embed(name, meta)
116
+ builder(name, meta).creator(name, meta)
117
+ validates_relation(meta)
118
+ meta
111
119
  end
112
120
 
113
121
  # Adds a relational association from the child Document to a Document in
@@ -129,16 +137,11 @@ module Mongoid # :nodoc:
129
137
  # @param [ Hash ] options The relation options.
130
138
  # @param [ Proc ] block Optional block for defining extensions.
131
139
  def belongs_to(name, options = {}, &block)
132
- characterize(name, Referenced::In, options, &block).tap do |meta|
133
- relate(name, meta)
134
- reference(meta)
135
- autosave(meta)
136
- validates_relation(meta)
137
- touchable(meta)
138
- end
140
+ meta = reference_one_to_one(name, options, Referenced::In, &block)
141
+ aliased_fields[name.to_s] = meta.foreign_key
142
+ touchable(meta)
143
+ meta
139
144
  end
140
- alias :belongs_to_related :belongs_to
141
- alias :referenced_in :belongs_to
142
145
 
143
146
  # Adds a relational association from a parent Document to many
144
147
  # Documents in another database or collection.
@@ -159,15 +162,14 @@ module Mongoid # :nodoc:
159
162
  # @param [ Hash ] options The relation options.
160
163
  # @param [ Proc ] block Optional block for defining extensions.
161
164
  def has_many(name, options = {}, &block)
162
- characterize(name, Referenced::Many, options, &block).tap do |meta|
163
- relate(name, meta)
164
- reference(meta)
165
- autosave(meta)
166
- validates_relation(meta)
167
- end
165
+ meta = characterize(name, Referenced::Many, options, &block)
166
+ relate(name, meta)
167
+ ids_getter(name, meta).ids_setter(name, meta)
168
+ reference(meta)
169
+ autosave(meta)
170
+ validates_relation(meta)
171
+ meta
168
172
  end
169
- alias :has_many_related :has_many
170
- alias :references_many :has_many
171
173
 
172
174
  # Adds a relational many-to-many association between many of this
173
175
  # Document and many of another Document.
@@ -190,15 +192,14 @@ module Mongoid # :nodoc:
190
192
  #
191
193
  # @since 2.0.0.rc.1
192
194
  def has_and_belongs_to_many(name, options = {}, &block)
193
- characterize(name, Referenced::ManyToMany, options, &block).tap do |meta|
194
- relate(name, meta)
195
- reference(meta, Array)
196
- autosave(meta)
197
- validates_relation(meta)
198
- synced(meta)
199
- end
195
+ meta = characterize(name, Referenced::ManyToMany, options, &block)
196
+ relate(name, meta)
197
+ reference(meta, Array)
198
+ autosave(meta)
199
+ validates_relation(meta)
200
+ synced(meta)
201
+ meta
200
202
  end
201
- alias :references_and_referenced_in_many :has_and_belongs_to_many
202
203
 
203
204
  # Adds a relational association from the child Document to a Document in
204
205
  # another database or collection.
@@ -219,20 +220,15 @@ module Mongoid # :nodoc:
219
220
  # @param [ Hash ] options The relation options.
220
221
  # @param [ Proc ] block Optional block for defining extensions.
221
222
  def has_one(name, options = {}, &block)
222
- characterize(name, Referenced::One, options, &block).tap do |meta|
223
- relate(name, meta)
224
- reference(meta)
225
- builder(name, meta).creator(name, meta).autosave(meta)
226
- validates_relation(meta)
227
- end
223
+ reference_one_to_one(name, options, Referenced::One, &block)
228
224
  end
229
- alias :has_one_related :has_one
230
- alias :references_one :has_one
231
225
 
232
226
  private
233
227
 
234
228
  # Create the metadata for the relation.
235
229
  #
230
+ # @api private
231
+ #
236
232
  # @example Create the metadata.
237
233
  # Person.characterize(:posts, Referenced::Many, {})
238
234
  #
@@ -244,15 +240,17 @@ module Mongoid # :nodoc:
244
240
  # @return [ Metadata ] The metadata for the relation.
245
241
  def characterize(name, relation, options, &block)
246
242
  Metadata.new({
247
- :relation => relation,
248
- :extend => create_extension_module(name, &block),
249
- :inverse_class_name => self.name,
250
- :name => name
243
+ relation: relation,
244
+ extend: create_extension_module(name, &block),
245
+ inverse_class_name: self.name,
246
+ name: name
251
247
  }.merge(options))
252
248
  end
253
249
 
254
250
  # Generate a named extension module suitable for marshaling
255
251
  #
252
+ # @api private
253
+ #
256
254
  # @example Get the module.
257
255
  # Person.create_extension_module(:posts, &block)
258
256
  #
@@ -273,9 +271,27 @@ module Mongoid # :nodoc:
273
271
  end
274
272
  end
275
273
 
274
+ # Add an embedded relation metadata to the embedded relations.
275
+ #
276
+ # @api private
277
+ #
278
+ # @example Add the metadata to embedded relations.
279
+ # Person.embed("addresses", metadata)
280
+ #
281
+ # @param [ String ] name The name of the relation.
282
+ # @param [ Metadata ] metadata The relation metadata.
283
+ #
284
+ # @since 3.0.0
285
+ def embed(name, metadata)
286
+ self.embedded_relations =
287
+ embedded_relations.merge(name.to_s => metadata)
288
+ end
289
+
276
290
  # Defines a field to be used as a foreign key in the relation and
277
291
  # indexes it if defined.
278
292
  #
293
+ # @api private
294
+ #
279
295
  # @example Set up the relational fields and indexes.
280
296
  # Person.reference(metadata)
281
297
  #
@@ -286,15 +302,43 @@ module Mongoid # :nodoc:
286
302
  key = metadata.foreign_key
287
303
  field(
288
304
  key,
289
- :type => type,
290
- :identity => true,
291
- :metadata => metadata,
292
- :default => metadata.foreign_key_default
305
+ type: type,
306
+ identity: true,
307
+ metadata: metadata,
308
+ default: metadata.foreign_key_default
293
309
  )
294
- index(key, :background => true) if metadata.indexed?
310
+ if metadata.indexed?
311
+ if metadata.polymorphic?
312
+ index({ key => 1, metadata.type => 1 }, { background: true })
313
+ else
314
+ index({ key => 1 }, { background: true })
315
+ end
316
+ end
295
317
  end
296
318
  end
297
319
 
320
+ # Handle common behaviour for referenced 1-1 relation setup.
321
+ #
322
+ # @api private
323
+ #
324
+ # @example Add the one to one behaviour.
325
+ # Model.reference_one_to_one(:name, meta)
326
+ #
327
+ # @param [ Symbol ] name The name of the relation.
328
+ # @param [ Metadata ] meta The relation metadata.
329
+ #
330
+ # @return [ Class ] The model class.
331
+ #
332
+ # @since 3.0.0
333
+ def reference_one_to_one(name, options, relation, &block)
334
+ meta = characterize(name, relation, options, &block)
335
+ relate(name, meta)
336
+ reference(meta)
337
+ builder(name, meta).creator(name, meta).autosave(meta)
338
+ validates_relation(meta)
339
+ meta
340
+ end
341
+
298
342
  # Creates a relation for the given name, metadata and relation. It adds
299
343
  # the metadata to the relations hash and has the accessors set up.
300
344
  #
@@ -305,7 +349,7 @@ module Mongoid # :nodoc:
305
349
  # @param [ Metadata ] metadata The metadata for the relation.
306
350
  def relate(name, metadata)
307
351
  self.relations = relations.merge(name.to_s => metadata)
308
- getter(name, metadata).setter(name, metadata)
352
+ getter(name, metadata).setter(name, metadata).existence_check(name, metadata)
309
353
  end
310
354
  end
311
355
  end
@@ -1,13 +1,13 @@
1
1
  # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- module Relations #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
4
 
5
5
  # This is the superclass for all many to one and many to many relation
6
6
  # proxies.
7
7
  class Many < Proxy
8
8
 
9
- delegate :avg, :max, :min, :sum, :to => :criteria
10
- delegate :length, :size, :to => :target
9
+ delegate :avg, :max, :min, :sum, to: :criteria
10
+ delegate :length, :size, to: :target
11
11
 
12
12
  # Is the relation empty?
13
13
  #
@@ -21,6 +21,57 @@ module Mongoid #:nodoc:
21
21
  size == 0
22
22
  end
23
23
 
24
+ # Creates a new document on the references many relation. This will
25
+ # save the document if the parent has been persisted.
26
+ #
27
+ # @example Create and save the new document.
28
+ # person.posts.create(:text => "Testing")
29
+ #
30
+ # @overload create(attributes = nil, options = {}, type = nil)
31
+ # @param [ Hash ] attributes The attributes to create with.
32
+ # @param [ Hash ] options The scoped assignment options.
33
+ # @param [ Class ] type The optional type of document to create.
34
+ #
35
+ # @overload create(attributes = nil, type = nil)
36
+ # @param [ Hash ] attributes The attributes to create with.
37
+ # @param [ Class ] type The optional type of document to create.
38
+ #
39
+ # @return [ Document ] The newly created document.
40
+ #
41
+ # @since 2.0.0.beta.1
42
+ def create(attributes = nil, options = {}, type = nil, &block)
43
+ doc = build(attributes, options, type, &block)
44
+ base.persisted? ? doc.save : raise_unsaved(doc)
45
+ doc
46
+ end
47
+
48
+ # Creates a new document on the references many relation. This will
49
+ # save the document if the parent has been persisted and will raise an
50
+ # error if validation fails.
51
+ #
52
+ # @example Create and save the new document.
53
+ # person.posts.create!(:text => "Testing")
54
+ #
55
+ # @overload create!(attributes = nil, options = {}, type = nil)
56
+ # @param [ Hash ] attributes The attributes to create with.
57
+ # @param [ Hash ] options The scoped assignment options.
58
+ # @param [ Class ] type The optional type of document to create.
59
+ #
60
+ # @overload create!(attributes = nil, type = nil)
61
+ # @param [ Hash ] attributes The attributes to create with.
62
+ # @param [ Class ] type The optional type of document to create.
63
+ #
64
+ # @raise [ Errors::Validations ] If validation failed.
65
+ #
66
+ # @return [ Document ] The newly created document.
67
+ #
68
+ # @since 2.0.0.beta.1
69
+ def create!(attributes = nil, options = {}, type = nil, &block)
70
+ doc = build(attributes, options, type, &block)
71
+ base.persisted? ? doc.save! : raise_unsaved(doc)
72
+ doc
73
+ end
74
+
24
75
  # Determine if any documents in this relation exist in the database.
25
76
  #
26
77
  # @example Are there persisted documents?
@@ -37,11 +88,18 @@ module Mongoid #:nodoc:
37
88
  # @example Find or create.
38
89
  # person.posts.find_or_create_by(:title => "Testing")
39
90
  #
40
- # @param [ Hash ] attrs The attributes to search or create with.
91
+ # @overload find_or_create_by(attributes = nil, options = {}, type = nil)
92
+ # @param [ Hash ] attributes The attributes to search or create with.
93
+ # @param [ Hash ] options The scoped assignment options.
94
+ # @param [ Class ] type The optional type of document to create.
95
+ #
96
+ # @overload find_or_create_by(attributes = nil, type = nil)
97
+ # @param [ Hash ] attributes The attributes to search or create with.
98
+ # @param [ Class ] type The optional type of document to create.
41
99
  #
42
100
  # @return [ Document ] An existing document or newly created one.
43
- def find_or_create_by(attrs = {}, &block)
44
- find_or(:create, attrs, &block)
101
+ def find_or_create_by(attrs = {}, options = {}, type = nil, &block)
102
+ find_or(:create, attrs, options, type, &block)
45
103
  end
46
104
 
47
105
  # Find the first +Document+ given the conditions, or instantiates a new document
@@ -50,11 +108,18 @@ module Mongoid #:nodoc:
50
108
  # @example Find or initialize.
51
109
  # person.posts.find_or_initialize_by(:title => "Test")
52
110
  #
53
- # @param [ Hash ] attrs The attributes to search or initialize with.
111
+ # @overload find_or_initialize_by(attributes = {}, options = {}, type = nil)
112
+ # @param [ Hash ] attributes The attributes to search or initialize with.
113
+ # @param [ Hash ] options The scoped assignment options.
114
+ # @param [ Class ] type The optional subclass to build.
115
+ #
116
+ # @overload find_or_initialize_by(attributes = {}, type = nil)
117
+ # @param [ Hash ] attributes The attributes to search or initialize with.
118
+ # @param [ Class ] type The optional subclass to build.
54
119
  #
55
120
  # @return [ Document ] An existing document or newly instantiated one.
56
- def find_or_initialize_by(attrs = {}, &block)
57
- find_or(:build, attrs, &block)
121
+ def find_or_initialize_by(attrs = {}, options = {}, type = nil, &block)
122
+ find_or(:build, attrs, options, type, &block)
58
123
  end
59
124
 
60
125
  # This proxy can never be nil.
@@ -136,12 +201,26 @@ module Mongoid #:nodoc:
136
201
  # @example Find or create|initialize.
137
202
  # person.addresses.find_or(:create, :street => "Bond")
138
203
  #
139
- # @param [ Symbol ] method The method name, create or new.
140
- # @param [ Hash ] attrs The attributes to build with.
204
+ # @overload find_or(method, attributes = {}, options = {}, type = nil)
205
+ # @param [ Symbol ] method The method name, create or new.
206
+ # @param [ Hash ] attributes The attributes to search or build with.
207
+ # @param [ Hash ] options The scoped assignment options.
208
+ # @param [ Class ] type The optional subclass to build.
209
+ #
210
+ # @overload find_or(attributes = {}, type = nil)
211
+ # @param [ Symbol ] method The method name, create or new.
212
+ # @param [ Hash ] attributes The attributes to search or build with.
213
+ # @param [ Class ] type The optional subclass to build.
141
214
  #
142
215
  # @return [ Document ] A matching document or a new/created one.
143
- def find_or(method, attrs = {}, &block)
144
- find(:first, :conditions => attrs) || send(method, attrs, &block)
216
+ def find_or(method, attrs = {}, options = {}, type = nil, &block)
217
+ if options.is_a? Class
218
+ options, type = {}, options
219
+ end
220
+
221
+ attrs["_type"] = type.to_s if type
222
+
223
+ where(attrs).first || send(method, attrs, options, type, &block)
145
224
  end
146
225
  end
147
226
  end