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,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for references_many relations.
8
8
  class Many < Binding
@@ -17,14 +17,8 @@ module Mongoid # :nodoc:
17
17
  #
18
18
  # @since 2.0.0.rc.1
19
19
  def bind_one(doc)
20
- doc.you_must(metadata.foreign_key_setter, base.id)
21
- if metadata.type
22
- doc.you_must(metadata.type_setter, base.class.model_name)
23
- end
24
- unless _binding?
25
- _binding do
26
- doc.send(metadata.inverse_setter, base)
27
- end
20
+ binding do
21
+ bind_from_relational_parent(doc)
28
22
  end
29
23
  end
30
24
 
@@ -37,14 +31,8 @@ module Mongoid # :nodoc:
37
31
  #
38
32
  # @since 2.0.0.rc.1
39
33
  def unbind_one(doc)
40
- doc.you_must(metadata.foreign_key_setter, nil)
41
- if metadata.type
42
- doc.you_must(metadata.type_setter, nil)
43
- end
44
- unless _binding?
45
- _binding do
46
- doc.send(metadata.inverse_setter, nil)
47
- end
34
+ binding do
35
+ unbind_from_relational_parent(doc)
48
36
  end
49
37
  end
50
38
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for all references_and_referenced_in_many relations.
8
8
  class ManyToMany < Binding
@@ -17,13 +17,11 @@ module Mongoid # :nodoc:
17
17
  #
18
18
  # @since 2.0.0.rc.1
19
19
  def bind_one(doc)
20
- unless _binding?
21
- _binding do
22
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
23
- inverse_keys.push(base.id) if inverse_keys
24
- base.synced[metadata.foreign_key] = true
25
- doc.synced[metadata.inverse_foreign_key] = true
26
- end
20
+ binding do
21
+ inverse_keys = doc.you_must(metadata.inverse_foreign_key)
22
+ inverse_keys.push(base.id) if inverse_keys
23
+ base.synced[metadata.foreign_key] = true
24
+ doc.synced[metadata.inverse_foreign_key] = true
27
25
  end
28
26
  end
29
27
 
@@ -34,14 +32,12 @@ module Mongoid # :nodoc:
34
32
  #
35
33
  # @since 2.0.0.rc.1
36
34
  def unbind_one(doc)
37
- unless _binding?
38
- _binding do
39
- base.send(metadata.foreign_key).delete_one(doc.id)
40
- inverse_keys = doc.you_must(metadata.inverse_foreign_key)
41
- inverse_keys.delete_one(base.id) if inverse_keys
42
- base.synced[metadata.foreign_key] = true
43
- doc.synced[metadata.inverse_foreign_key] = true
44
- end
35
+ binding do
36
+ base.send(metadata.foreign_key).delete_one(doc.id)
37
+ inverse_keys = doc.you_must(metadata.inverse_foreign_key)
38
+ inverse_keys.delete_one(base.id) if inverse_keys
39
+ base.synced[metadata.foreign_key] = true
40
+ doc.synced[metadata.inverse_foreign_key] = true
45
41
  end
46
42
  end
47
43
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Bindings #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Bindings
5
+ module Referenced
6
6
 
7
7
  # Binding class for references_one relations.
8
8
  class One < Binding
@@ -18,18 +18,11 @@ module Mongoid # :nodoc:
18
18
  # person.game = Game.new
19
19
  #
20
20
  # @since 2.0.0.rc.1
21
- def bind
22
- target.you_must(metadata.foreign_key_setter, base.id)
23
- if metadata.type
24
- target.you_must(metadata.type_setter, base.class.model_name)
25
- end
26
- unless _binding?
27
- _binding do
28
- target.send(metadata.inverse_setter, base)
29
- end
21
+ def bind_one
22
+ binding do
23
+ bind_from_relational_parent(target)
30
24
  end
31
25
  end
32
- alias :bind_one :bind
33
26
 
34
27
  # Unbinds the base object and the inverse, caused by setting the
35
28
  # reference to nil.
@@ -39,18 +32,11 @@ module Mongoid # :nodoc:
39
32
  # person.game = nil
40
33
  #
41
34
  # @since 2.0.0.rc.1
42
- def unbind
43
- target.you_must(metadata.foreign_key_setter, nil)
44
- if metadata.type
45
- target.you_must(metadata.type_setter, nil)
46
- end
47
- unless _binding?
48
- _binding do
49
- target.send(metadata.inverse_setter, nil)
50
- end
35
+ def unbind_one
36
+ binding do
37
+ unbind_from_relational_parent(target)
51
38
  end
52
39
  end
53
- alias :unbind_one :unbind
54
40
  end
55
41
  end
56
42
  end
@@ -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
  # Superclass for all builder objects. Builders are responsible for either
6
6
  # looking up a relation's target from the database, or creating them from a
@@ -49,7 +49,7 @@ module Mongoid # :nodoc:
49
49
  #
50
50
  # @since 2.0.0.rc.1
51
51
  def query?
52
- obj = Array(object).first
52
+ obj = object.__array__.first
53
53
  !obj.is_a?(Mongoid::Document) && !obj.nil?
54
54
  end
55
55
  end
@@ -11,8 +11,8 @@ require "mongoid/relations/builders/referenced/many"
11
11
  require "mongoid/relations/builders/referenced/many_to_many"
12
12
  require "mongoid/relations/builders/referenced/one"
13
13
 
14
- module Mongoid # :nodoc:
15
- module Relations #:nodoc:
14
+ module Mongoid
15
+ module Relations
16
16
 
17
17
  # This module is responsible for defining the build and create methods used
18
18
  # in one to one relations.
@@ -49,7 +49,7 @@ module Mongoid # :nodoc:
49
49
  [ args.first || {}, args.size > 1 ? args[1] : {} ]
50
50
  end
51
51
 
52
- module ClassMethods #:nodoc:
52
+ module ClassMethods
53
53
 
54
54
  # Defines a builder method for an embeds_one relation. This is
55
55
  # defined as #build_name.
@@ -63,15 +63,16 @@ module Mongoid # :nodoc:
63
63
  #
64
64
  # @since 2.0.0.rc.1
65
65
  def builder(name, metadata)
66
- tap do
67
- define_method("build_#{name}") do |*args|
68
- attributes, options = parse_args(*args)
69
- document = Factory.build(metadata.klass, attributes, options)
70
- _building do
71
- send("#{name}=", document).tap {|child| child.run_callbacks(:build) }
72
- end
66
+ re_define_method("build_#{name}") do |*args|
67
+ attributes, options = parse_args(*args)
68
+ document = Factory.build(metadata.klass, attributes, options)
69
+ _building do
70
+ child = send("#{name}=", document)
71
+ child.run_callbacks(:build)
72
+ child
73
73
  end
74
74
  end
75
+ self
75
76
  end
76
77
 
77
78
  # Defines a creator method for an embeds_one relation. This is
@@ -87,13 +88,15 @@ module Mongoid # :nodoc:
87
88
  #
88
89
  # @since 2.0.0.rc.1
89
90
  def creator(name, metadata)
90
- tap do
91
- define_method("create_#{name}") do |*args|
92
- attributes, options = parse_args(*args)
93
- document = Factory.build(metadata.klass, attributes, options)
94
- send("#{name}=", document).tap { |doc| doc.save }
95
- end
91
+ re_define_method("create_#{name}") do |*args|
92
+ attributes, options = parse_args(*args)
93
+ document = Factory.build(metadata.klass, attributes, options)
94
+ doc = send("#{name}=", document)
95
+ doc.save
96
+ save if new_record? && metadata.stores_foreign_key?
97
+ doc
96
98
  end
99
+ self
97
100
  end
98
101
  end
99
102
  end
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Embedded #:nodoc:
6
- class In < Builder #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Embedded
6
+ class In < Builder
7
7
 
8
8
  # This builder doesn't actually build anything, just returns the
9
9
  # parent since it should already be instantiated.
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Embedded #:nodoc:
6
- class Many < Builder #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Embedded
6
+ class Many < Builder
7
7
 
8
8
  # Builds the document out of the attributes using the provided
9
9
  # metadata on the relation. Instantiates through the factory in order
@@ -19,15 +19,15 @@ module Mongoid # :nodoc:
19
19
  def build(type = nil)
20
20
  return [] if object.blank?
21
21
  return object if object.first.is_a?(Document)
22
- [].tap do |docs|
23
- object.each do |attrs|
24
- if _loading?
25
- docs.push(Factory.from_db(klass, attrs))
26
- else
27
- docs.push(Factory.build(klass, attrs))
28
- end
22
+ docs = []
23
+ object.each do |attrs|
24
+ if _loading? && base.persisted?
25
+ docs.push(Factory.from_db(klass, attrs))
26
+ else
27
+ docs.push(Factory.build(klass, attrs))
29
28
  end
30
29
  end
30
+ docs
31
31
  end
32
32
  end
33
33
  end
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Embedded #:nodoc:
6
- class One < Builder #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Embedded
6
+ class One < Builder
7
7
 
8
8
  # Builds the document out of the attributes using the provided
9
9
  # metadata on the relation. Instantiates through the factory in order
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
17
17
  # @return [ Document ] A single document.
18
18
  def build(type = nil)
19
19
  return object unless object.is_a?(Hash)
20
- if _loading?
20
+ if _loading? && base.persisted?
21
21
  Factory.from_db(klass, object)
22
22
  else
23
23
  Factory.build(klass, object)
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module NestedAttributes #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module NestedAttributes
6
6
  class Many < NestedBuilder
7
7
 
8
8
  # Builds the relation depending on the attributes and the options
@@ -25,9 +25,9 @@ module Mongoid # :nodoc:
25
25
  end
26
26
  attributes.each do |attrs|
27
27
  if attrs.respond_to?(:with_indifferent_access)
28
- process(parent, attrs)
28
+ process_attributes(parent, attrs)
29
29
  else
30
- process(parent, attrs[1])
30
+ process_attributes(parent, attrs[1])
31
31
  end
32
32
  end
33
33
  end
@@ -86,10 +86,10 @@ module Mongoid # :nodoc:
86
86
  # new, existing, or ignored document.
87
87
  #
88
88
  # @example Process the attributes
89
- # builder.process({ "id" => 1, "street" => "Bond" })
89
+ # builder.process_attributes({ "id" => 1, "street" => "Bond" })
90
90
  #
91
91
  # @param [ Hash ] attrs The single document attributes to process.
92
- def process(parent, attrs)
92
+ def process_attributes(parent, attrs)
93
93
  return if reject?(parent, attrs)
94
94
  if id = attrs.extract_id
95
95
  first = existing.first
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module NestedAttributes #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module NestedAttributes
6
6
  class One < NestedBuilder
7
7
 
8
8
  attr_accessor :destroy
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class In < Builder
7
7
 
8
8
  # This builder either takes a foreign key and queries for the
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class Many < Builder
7
7
 
8
8
  # This builder either takes a hash and queries for the
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  return [] if object.is_a?(Array)
20
- crit = metadata.criteria(Conversions.flag(object, metadata))
20
+ crit = metadata.criteria(Conversions.flag(object, metadata), base.class)
21
21
  IdentityMap.get(crit.klass, crit.selector) || crit
22
22
  end
23
23
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class ManyToMany < Builder
7
7
 
8
8
  # This builder either takes a hash and queries for the
@@ -16,7 +16,9 @@ module Mongoid # :nodoc:
16
16
  # @return [ Array<Document> ] The documents.
17
17
  def build(type = nil)
18
18
  return object.try(:dup) unless query?
19
- metadata.criteria(object || [])
19
+ ids = object || []
20
+ crit = metadata.criteria(ids, base.class)
21
+ IdentityMap.get(crit.klass, ids) || crit
20
22
  end
21
23
 
22
24
  # Do we need to perform a database query? It will be so if the object we
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
- module Mongoid # :nodoc:
3
- module Relations #:nodoc:
4
- module Builders #:nodoc:
5
- module Referenced #:nodoc:
2
+ module Mongoid
3
+ module Relations
4
+ module Builders
5
+ module Referenced
6
6
  class One < Builder
7
7
 
8
8
  # This builder either takes an _id or an object and queries for the
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  return nil if base.new_record?
20
- metadata.criteria(Conversions.flag(object, metadata)).from_map_or_db
20
+ metadata.criteria(Conversions.flag(object, metadata), base.class).from_map_or_db
21
21
  end
22
22
  end
23
23
  end