mongoid 2.4.10 → 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 +843 -9
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +16 -9
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +1 -1
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +31 -19
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -160
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +2 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -128
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +8 -10
  234. data/lib/mongoid/validations.rb +28 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +92 -154
  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/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -487
  276. data/lib/mongoid/contexts.rb +0 -25
  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 -108
  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 -76
  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/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -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,15 +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
- 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
138
144
  end
139
- alias :belongs_to_related :belongs_to
140
- alias :referenced_in :belongs_to
141
145
 
142
146
  # Adds a relational association from a parent Document to many
143
147
  # Documents in another database or collection.
@@ -158,15 +162,14 @@ module Mongoid # :nodoc:
158
162
  # @param [ Hash ] options The relation options.
159
163
  # @param [ Proc ] block Optional block for defining extensions.
160
164
  def has_many(name, options = {}, &block)
161
- characterize(name, Referenced::Many, options, &block).tap do |meta|
162
- relate(name, meta)
163
- reference(meta)
164
- autosave(meta)
165
- validates_relation(meta)
166
- 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
167
172
  end
168
- alias :has_many_related :has_many
169
- alias :references_many :has_many
170
173
 
171
174
  # Adds a relational many-to-many association between many of this
172
175
  # Document and many of another Document.
@@ -189,15 +192,14 @@ module Mongoid # :nodoc:
189
192
  #
190
193
  # @since 2.0.0.rc.1
191
194
  def has_and_belongs_to_many(name, options = {}, &block)
192
- characterize(name, Referenced::ManyToMany, options, &block).tap do |meta|
193
- relate(name, meta)
194
- reference(meta, Array)
195
- autosave(meta)
196
- validates_relation(meta)
197
- synced(meta)
198
- 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
199
202
  end
200
- alias :references_and_referenced_in_many :has_and_belongs_to_many
201
203
 
202
204
  # Adds a relational association from the child Document to a Document in
203
205
  # another database or collection.
@@ -218,20 +220,15 @@ module Mongoid # :nodoc:
218
220
  # @param [ Hash ] options The relation options.
219
221
  # @param [ Proc ] block Optional block for defining extensions.
220
222
  def has_one(name, options = {}, &block)
221
- characterize(name, Referenced::One, options, &block).tap do |meta|
222
- relate(name, meta)
223
- reference(meta)
224
- builder(name, meta).creator(name, meta).autosave(meta)
225
- validates_relation(meta)
226
- end
223
+ reference_one_to_one(name, options, Referenced::One, &block)
227
224
  end
228
- alias :has_one_related :has_one
229
- alias :references_one :has_one
230
225
 
231
226
  private
232
227
 
233
228
  # Create the metadata for the relation.
234
229
  #
230
+ # @api private
231
+ #
235
232
  # @example Create the metadata.
236
233
  # Person.characterize(:posts, Referenced::Many, {})
237
234
  #
@@ -243,15 +240,17 @@ module Mongoid # :nodoc:
243
240
  # @return [ Metadata ] The metadata for the relation.
244
241
  def characterize(name, relation, options, &block)
245
242
  Metadata.new({
246
- :relation => relation,
247
- :extend => create_extension_module(name, &block),
248
- :inverse_class_name => self.name,
249
- :name => name
243
+ relation: relation,
244
+ extend: create_extension_module(name, &block),
245
+ inverse_class_name: self.name,
246
+ name: name
250
247
  }.merge(options))
251
248
  end
252
249
 
253
250
  # Generate a named extension module suitable for marshaling
254
251
  #
252
+ # @api private
253
+ #
255
254
  # @example Get the module.
256
255
  # Person.create_extension_module(:posts, &block)
257
256
  #
@@ -272,9 +271,27 @@ module Mongoid # :nodoc:
272
271
  end
273
272
  end
274
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
+
275
290
  # Defines a field to be used as a foreign key in the relation and
276
291
  # indexes it if defined.
277
292
  #
293
+ # @api private
294
+ #
278
295
  # @example Set up the relational fields and indexes.
279
296
  # Person.reference(metadata)
280
297
  #
@@ -285,15 +302,43 @@ module Mongoid # :nodoc:
285
302
  key = metadata.foreign_key
286
303
  field(
287
304
  key,
288
- :type => type,
289
- :identity => true,
290
- :metadata => metadata,
291
- :default => metadata.foreign_key_default
305
+ type: type,
306
+ identity: true,
307
+ metadata: metadata,
308
+ default: metadata.foreign_key_default
292
309
  )
293
- 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
294
317
  end
295
318
  end
296
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
+
297
342
  # Creates a relation for the given name, metadata and relation. It adds
298
343
  # the metadata to the relations hash and has the accessors set up.
299
344
  #
@@ -304,7 +349,7 @@ module Mongoid # :nodoc:
304
349
  # @param [ Metadata ] metadata The metadata for the relation.
305
350
  def relate(name, metadata)
306
351
  self.relations = relations.merge(name.to_s => metadata)
307
- getter(name, metadata).setter(name, metadata)
352
+ getter(name, metadata).setter(name, metadata).existence_check(name, metadata)
308
353
  end
309
354
  end
310
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