mongoid 6.4.8 → 7.0.0.beta

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 (315) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +0 -26
  5. data/lib/config/locales/en.yml +17 -21
  6. data/lib/mongoid.rb +2 -2
  7. data/lib/mongoid/association.rb +150 -0
  8. data/lib/mongoid/association/accessors.rb +339 -0
  9. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  10. data/lib/mongoid/association/builders.rb +92 -0
  11. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  12. data/lib/mongoid/association/depending.rb +116 -0
  13. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  14. data/lib/mongoid/association/embedded.rb +4 -0
  15. data/lib/mongoid/{relations → association}/embedded/batchable.rb +27 -53
  16. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  17. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  19. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  21. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  22. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  23. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  25. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  26. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  27. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  29. data/lib/mongoid/association/macros.rb +204 -0
  30. data/lib/mongoid/{relations → association}/many.rb +18 -52
  31. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/association/nested/many.rb +200 -0
  34. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  35. data/lib/mongoid/association/nested/one.rb +127 -0
  36. data/lib/mongoid/{relations → association}/one.rb +6 -6
  37. data/lib/mongoid/association/options.rb +152 -0
  38. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  39. data/lib/mongoid/association/referenced.rb +7 -0
  40. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  46. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  47. data/lib/mongoid/association/referenced/eager.rb +159 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +273 -0
  54. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  55. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  56. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  57. data/lib/mongoid/association/referenced/has_many/enumerable.rb +479 -0
  58. data/lib/mongoid/association/referenced/has_many/proxy.rb +577 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  61. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  62. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  63. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  64. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  65. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  66. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  67. data/lib/mongoid/association/relatable.rb +415 -0
  68. data/lib/mongoid/association/touchable.rb +97 -0
  69. data/lib/mongoid/atomic.rb +6 -6
  70. data/lib/mongoid/atomic/modifiers.rb +8 -12
  71. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  72. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  73. data/lib/mongoid/attributes.rb +2 -1
  74. data/lib/mongoid/attributes/nested.rb +10 -10
  75. data/lib/mongoid/attributes/processing.rb +2 -2
  76. data/lib/mongoid/attributes/readonly.rb +2 -4
  77. data/lib/mongoid/clients.rb +0 -2
  78. data/lib/mongoid/clients/options.rb +1 -1
  79. data/lib/mongoid/clients/storage_options.rb +0 -1
  80. data/lib/mongoid/composable.rb +3 -4
  81. data/lib/mongoid/config.rb +1 -0
  82. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  83. data/lib/mongoid/contextual/atomic.rb +3 -6
  84. data/lib/mongoid/contextual/map_reduce.rb +3 -7
  85. data/lib/mongoid/contextual/memory.rb +5 -10
  86. data/lib/mongoid/contextual/mongo.rb +10 -27
  87. data/lib/mongoid/copyable.rb +6 -6
  88. data/lib/mongoid/criteria.rb +1 -2
  89. data/lib/mongoid/criteria/includable.rb +14 -14
  90. data/lib/mongoid/criteria/modifiable.rb +8 -14
  91. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -3
  92. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  93. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  94. data/lib/mongoid/document.rb +6 -6
  95. data/lib/mongoid/errors.rb +3 -1
  96. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  97. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  98. data/lib/mongoid/errors/unknown_model.rb +25 -0
  99. data/lib/mongoid/extensions/array.rb +5 -5
  100. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  101. data/lib/mongoid/extensions/object.rb +4 -4
  102. data/lib/mongoid/extensions/range.rb +1 -0
  103. data/lib/mongoid/extensions/regexp.rb +0 -1
  104. data/lib/mongoid/extensions/string.rb +1 -3
  105. data/lib/mongoid/factory.rb +4 -3
  106. data/lib/mongoid/fields.rb +1 -1
  107. data/lib/mongoid/fields/foreign_key.rb +5 -5
  108. data/lib/mongoid/fields/standard.rb +2 -14
  109. data/lib/mongoid/fields/validators/macro.rb +1 -1
  110. data/lib/mongoid/indexable.rb +8 -5
  111. data/lib/mongoid/interceptable.rb +5 -5
  112. data/lib/mongoid/matchable.rb +0 -3
  113. data/lib/mongoid/persistable.rb +4 -5
  114. data/lib/mongoid/persistable/creatable.rb +2 -4
  115. data/lib/mongoid/persistable/deletable.rb +9 -10
  116. data/lib/mongoid/persistable/destroyable.rb +5 -1
  117. data/lib/mongoid/persistable/incrementable.rb +1 -1
  118. data/lib/mongoid/persistable/logical.rb +1 -1
  119. data/lib/mongoid/persistable/settable.rb +5 -5
  120. data/lib/mongoid/persistable/updatable.rb +2 -2
  121. data/lib/mongoid/persistable/upsertable.rb +1 -2
  122. data/lib/mongoid/persistence_context.rb +4 -9
  123. data/lib/mongoid/query_cache.rb +18 -65
  124. data/lib/mongoid/railtie.rb +0 -17
  125. data/lib/mongoid/reloadable.rb +1 -1
  126. data/lib/mongoid/scopable.rb +3 -3
  127. data/lib/mongoid/serializable.rb +3 -3
  128. data/lib/mongoid/tasks/database.rb +2 -3
  129. data/lib/mongoid/threaded.rb +0 -74
  130. data/lib/mongoid/traversable.rb +2 -2
  131. data/lib/mongoid/validatable.rb +8 -8
  132. data/lib/mongoid/validatable/presence.rb +2 -2
  133. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  134. data/lib/mongoid/version.rb +1 -1
  135. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -4
  136. data/spec/app/models/animal.rb +2 -1
  137. data/spec/app/models/band.rb +0 -1
  138. data/spec/app/models/bomb.rb +1 -1
  139. data/spec/app/models/message.rb +1 -1
  140. data/spec/app/models/person.rb +5 -2
  141. data/spec/app/models/vertex.rb +6 -0
  142. data/spec/app/models/wiki_page.rb +1 -1
  143. data/spec/config/mongoid.yml +1 -0
  144. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  145. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  146. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  147. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  148. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  149. data/spec/mongoid/association/depending_spec.rb +613 -0
  150. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  151. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  152. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  153. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  154. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  155. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  156. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  157. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  158. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  159. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  161. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  162. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  163. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  164. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  165. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -93
  166. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  167. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  168. data/spec/mongoid/association/options_spec.rb +1321 -0
  169. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  170. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  171. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  172. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  173. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  174. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  175. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  176. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  177. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  178. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  180. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  181. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  182. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +11 -11
  183. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +1 -109
  184. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  185. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  186. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  187. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  188. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  189. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  190. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  191. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  192. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  193. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  194. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  195. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  196. data/spec/mongoid/atomic_spec.rb +17 -17
  197. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  198. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  199. data/spec/mongoid/clients/factory_spec.rb +28 -52
  200. data/spec/mongoid/clients/options_spec.rb +65 -69
  201. data/spec/mongoid/config_spec.rb +24 -0
  202. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  203. data/spec/mongoid/contextual/mongo_spec.rb +4 -112
  204. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  205. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  206. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  207. data/spec/mongoid/criteria/queryable/selectable_spec.rb +6 -74
  208. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  209. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  210. data/spec/mongoid/criteria_spec.rb +16 -19
  211. data/spec/mongoid/document_spec.rb +2 -56
  212. data/spec/mongoid/extensions/array_spec.rb +11 -15
  213. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  214. data/spec/mongoid/extensions/object_spec.rb +7 -11
  215. data/spec/mongoid/extensions/range_spec.rb +7 -0
  216. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  217. data/spec/mongoid/extensions/string_spec.rb +7 -35
  218. data/spec/mongoid/factory_spec.rb +18 -11
  219. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  220. data/spec/mongoid/fields_spec.rb +2 -2
  221. data/spec/mongoid/findable_spec.rb +1 -1
  222. data/spec/mongoid/indexable_spec.rb +18 -8
  223. data/spec/mongoid/interceptable_spec.rb +21 -2
  224. data/spec/mongoid/matchable_spec.rb +1 -26
  225. data/spec/mongoid/persistable/deletable_spec.rb +0 -19
  226. data/spec/mongoid/persistable/destroyable_spec.rb +0 -19
  227. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  228. data/spec/mongoid/persistable/savable_spec.rb +3 -3
  229. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  230. data/spec/mongoid/persistable/updatable_spec.rb +2 -2
  231. data/spec/mongoid/persistable_spec.rb +16 -16
  232. data/spec/mongoid/persistence_context_spec.rb +0 -14
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +18 -87
  235. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  236. data/spec/mongoid/scopable_spec.rb +0 -13
  237. data/spec/mongoid/threaded_spec.rb +0 -68
  238. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  239. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  240. data/spec/mongoid/validatable_spec.rb +1 -1
  241. data/spec/spec_helper.rb +7 -83
  242. metadata +586 -611
  243. metadata.gz.sig +2 -5
  244. data/lib/mongoid/clients/sessions.rb +0 -113
  245. data/lib/mongoid/errors/invalid_session_use.rb +0 -24
  246. data/lib/mongoid/matchable/nor.rb +0 -37
  247. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  248. data/lib/mongoid/relations.rb +0 -148
  249. data/lib/mongoid/relations/accessors.rb +0 -267
  250. data/lib/mongoid/relations/auto_save.rb +0 -94
  251. data/lib/mongoid/relations/bindings.rb +0 -9
  252. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  253. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  254. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  255. data/lib/mongoid/relations/builder.rb +0 -57
  256. data/lib/mongoid/relations/builders.rb +0 -106
  257. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  258. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  259. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  260. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  261. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  262. data/lib/mongoid/relations/cascading.rb +0 -56
  263. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  264. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  265. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  266. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  267. data/lib/mongoid/relations/conversions.rb +0 -34
  268. data/lib/mongoid/relations/counter_cache.rb +0 -160
  269. data/lib/mongoid/relations/cyclic.rb +0 -107
  270. data/lib/mongoid/relations/eager/base.rb +0 -153
  271. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  272. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  273. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  274. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  275. data/lib/mongoid/relations/embedded/in.rb +0 -241
  276. data/lib/mongoid/relations/embedded/many.rb +0 -683
  277. data/lib/mongoid/relations/embedded/one.rb +0 -235
  278. data/lib/mongoid/relations/macros.rb +0 -367
  279. data/lib/mongoid/relations/metadata.rb +0 -1179
  280. data/lib/mongoid/relations/nested_builder.rb +0 -74
  281. data/lib/mongoid/relations/options.rb +0 -49
  282. data/lib/mongoid/relations/polymorphic.rb +0 -39
  283. data/lib/mongoid/relations/referenced/in.rb +0 -304
  284. data/lib/mongoid/relations/referenced/many.rb +0 -812
  285. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  286. data/lib/mongoid/relations/referenced/one.rb +0 -290
  287. data/lib/mongoid/relations/synchronization.rb +0 -169
  288. data/lib/mongoid/relations/targets.rb +0 -2
  289. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  290. data/lib/mongoid/relations/touchable.rb +0 -97
  291. data/spec/app/models/array_field.rb +0 -7
  292. data/spec/app/models/delegating_patient.rb +0 -16
  293. data/spec/integration/document_spec.rb +0 -22
  294. data/spec/mongoid/clients/sessions_spec.rb +0 -334
  295. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  296. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  297. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  298. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  299. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  300. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  301. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  302. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  303. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  304. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  305. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  306. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  307. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  308. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  309. data/spec/mongoid/relations/options_spec.rb +0 -35
  310. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  311. data/spec/support/cluster_config.rb +0 -158
  312. data/spec/support/constraints.rb +0 -101
  313. data/spec/support/macros.rb +0 -20
  314. data/spec/support/session_registry.rb +0 -50
  315. data/spec/support/spec_config.rb +0 -42
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # Eager class for belongs_to associations.
8
+ class Eager < Association::Referenced::Eager::Base
9
+
10
+ private
11
+
12
+ def preload
13
+ raise Errors::EagerLoad.new(@association.name) if @association.polymorphic?
14
+
15
+ @docs.each do |d|
16
+ set_relation(d, nil)
17
+ end
18
+
19
+ each_loaded_document do |doc|
20
+ id = doc.send(key)
21
+ set_on_parent(id, doc)
22
+ end
23
+ end
24
+
25
+ def group_by_key
26
+ @association.foreign_key
27
+ end
28
+
29
+ def key
30
+ @association.primary_key
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,136 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # This class handles all behaviour for relations that are either
8
+ # one-to-many or one-to-one, where the foreign key is stored on this side
9
+ # of the relation and the reference is to document(s) in another
10
+ # collection.
11
+ class Proxy < Association::One
12
+ include Evolvable
13
+
14
+ # Instantiate a new belongs_to association proxy.
15
+ #
16
+ # @example Create the new proxy.
17
+ # Association::BelongsTo::Proxy.new(game, person, association)
18
+ #
19
+ # @param [ Document ] base The document this relation hangs off of.
20
+ # @param [ Document, Array<Document> ] target The target (parent) of the
21
+ # relation.
22
+ # @param [ Association ] association The association object.
23
+ def initialize(base, target, association)
24
+ init(base, target, association) do
25
+ characterize_one(_target)
26
+ bind_one
27
+ end
28
+ end
29
+
30
+ # Removes the association between the base document and the target
31
+ # document by deleting the foreign key and the reference, orphaning
32
+ # the target document in the process.
33
+ #
34
+ # @example Nullify the relation.
35
+ # person.game.nullify
36
+ #
37
+ def nullify
38
+ unbind_one
39
+ _target.save
40
+ end
41
+
42
+ # Substitutes the supplied target documents for the existing document
43
+ # in the relation.
44
+ #
45
+ # @example Substitute the relation.
46
+ # name.substitute(new_name)
47
+ #
48
+ # @param [ Document, Array<Document> ] replacement The replacement.
49
+ #
50
+ # @return [ self, nil ] The relation or nil.
51
+ #
52
+ # @since 2.0.0.rc.1
53
+ def substitute(replacement)
54
+ unbind_one
55
+ if replacement
56
+ self._target = normalize(replacement)
57
+ bind_one
58
+ self
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ # Instantiate the binding associated with this relation.
65
+ #
66
+ # @example Get the binding object.
67
+ # binding([ address ])
68
+ #
69
+ # @return [ Binding ] The binding object.
70
+ #
71
+ # @since 2.0.0.rc.1
72
+ def binding
73
+ BelongsTo::Binding.new(_base, _target, _association)
74
+ end
75
+
76
+ # Normalize the value provided as a replacement for substitution.
77
+ #
78
+ # @api private
79
+ #
80
+ # @example Normalize the substitute.
81
+ # proxy.normalize(id)
82
+ #
83
+ # @param [ Document, Object ] replacement The replacement object.
84
+ #
85
+ # @return [ Document ] The document.
86
+ #
87
+ # @since 3.1.5
88
+ def normalize(replacement)
89
+ return replacement if replacement.is_a?(Document)
90
+ _association.build(klass, replacement)
91
+ end
92
+
93
+ # Are we able to persist this relation?
94
+ #
95
+ # @example Can we persist the relation?
96
+ # relation.persistable?
97
+ #
98
+ # @return [ true, false ] If the relation is persistable.
99
+ #
100
+ # @since 2.1.0
101
+ def persistable?
102
+ _target.persisted? && !_binding? && !_building?
103
+ end
104
+
105
+ class << self
106
+
107
+ # Get the Eager object for this type of association.
108
+ #
109
+ # @example Get the eager loader object
110
+ #
111
+ # @param [ Association ] association The association object.
112
+ # @param [ Array<Document> ] docs The array of documents.
113
+ #
114
+ # @since 7.0
115
+ def eager_loader(association, docs)
116
+ Eager.new(association, docs)
117
+ end
118
+
119
+ # Returns true if the relation is an embedded one. In this case
120
+ # always false.
121
+ #
122
+ # @example Is this relation embedded?
123
+ # Association::BelongsTo::Proxy.embedded?
124
+ #
125
+ # @return [ false ] Always false.
126
+ #
127
+ # @since 2.0.0.rc.1
128
+ def embedded?
129
+ false
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,163 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ module CounterCache
6
+ extend ActiveSupport::Concern
7
+
8
+ # Reset the given counter using the .count() query from the
9
+ # db. This method is usuful in case that a counter got
10
+ # corrupted, or a new counter was added to the collection.
11
+ #
12
+ # @example Reset the given counter cache
13
+ # post.reset_counters(:comments)
14
+ #
15
+ # @param [ Symbol, Array ] counters One or more counter caches to reset
16
+ #
17
+ # @since 4.0.0
18
+ def reset_counters(*counters)
19
+ self.class.with(persistence_context) do |_class|
20
+ _class.reset_counters(self, *counters)
21
+ end
22
+ end
23
+
24
+ module ClassMethods
25
+
26
+ # Reset the given counter using the .count() query from the
27
+ # db. This method is usuful in case that a counter got
28
+ # corrupted, or a new counter was added to the collection.
29
+ #
30
+ # @example Reset the given counter cache
31
+ # Post.reset_counters('50e0edd97c71c17ea9000001', :comments)
32
+ #
33
+ # @param [ String ] id The id of the object that will be reset.
34
+ # @param [ Symbol, Array ] counters One or more counter caches to reset
35
+ #
36
+ # @since 3.1.0
37
+ def reset_counters(id, *counters)
38
+ document = id.is_a?(Document) ? id : find(id)
39
+ counters.each do |name|
40
+ relation_association = relations[name]
41
+ counter_name = relation_association.inverse_association.counter_cache_column_name
42
+ document.update_attribute(counter_name, document.send(name).count)
43
+ end
44
+ end
45
+
46
+ # Update the given counters by the value factor. It uses the
47
+ # atomic $inc command.
48
+ #
49
+ # @example Add 5 to comments counter and remove 2 from likes
50
+ # counter.
51
+ # Post.update_counters('50e0edd97c71c17ea9000001',
52
+ # :comments_count => 5, :likes_count => -2)
53
+ #
54
+ # @param [ String ] id The id of the object to update.
55
+ # @param [ Hash ] counters
56
+ #
57
+ # @since 3.1.0
58
+ def update_counters(id, counters)
59
+ where(:_id => id).inc(counters)
60
+ end
61
+
62
+ # Increment the counter name from the entries that match the
63
+ # id by one. This method is used on associations callbacks
64
+ # when counter_cache is enabled
65
+ #
66
+ # @example Increment comments counter
67
+ # Post.increment_counter(:comments_count, '50e0edd97c71c17ea9000001')
68
+ #
69
+ # @param [ Symbol ] counter_name Counter cache name
70
+ # @param [ String ] id The id of the object that will have its counter incremented.
71
+ #
72
+ # @since 3.1.0
73
+ def increment_counter(counter_name, id)
74
+ update_counters(id, counter_name.to_sym => 1)
75
+ end
76
+
77
+ # Decrement the counter name from the entries that match the
78
+ # id by one. This method is used on associations callbacks
79
+ # when counter_cache is enabled
80
+ #
81
+ # @example Decrement comments counter
82
+ # Post.decrement_counter(:comments_count, '50e0edd97c71c17ea9000001')
83
+ #
84
+ # @param [ Symbol ] counter_name Counter cache name
85
+ # @param [ String ] id The id of the object that will have its counter decremented.
86
+ #
87
+ # @since 3.1.0
88
+ def decrement_counter(counter_name, id)
89
+ update_counters(id, counter_name.to_sym => -1)
90
+ end
91
+ end
92
+
93
+ # Add the callbacks responsible for update the counter cache field.
94
+ #
95
+ # @api private
96
+ #
97
+ # @example Add the touchable.
98
+ # Mongoid::Association::Referenced::CounterCache.define_callbacks!(association)
99
+ #
100
+ # @param [ Association ] association The association.
101
+ #
102
+ # @return [ Class ] The association's owning class.
103
+ #
104
+ # @since 7.0
105
+ def self.define_callbacks!(association)
106
+ name = association.name
107
+ cache_column = association.counter_cache_column_name.to_sym
108
+
109
+ association.inverse_class.tap do |klass|
110
+ klass.after_update do
111
+ if record = __send__(name)
112
+ foreign_key = association.foreign_key
113
+
114
+ if attribute_changed?(foreign_key)
115
+ original, current = attribute_change(foreign_key)
116
+
117
+ unless original.nil?
118
+ record.class.with(persistence_context) do |_class|
119
+ _class.decrement_counter(cache_column, original)
120
+ end
121
+ end
122
+
123
+ unless current.nil?
124
+ record[cache_column] = (record[cache_column] || 0) + 1
125
+ record.class.with(record.persistence_context) do |_class|
126
+ _class.increment_counter(cache_column, current) if record.persisted?
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ klass.after_create do
134
+ if record = __send__(name)
135
+ record[cache_column] = (record[cache_column] || 0) + 1
136
+
137
+ if record.persisted?
138
+ record.class.with(record.persistence_context) do |_class|
139
+ _class.increment_counter(cache_column, record._id)
140
+ end
141
+ record.remove_change(cache_column)
142
+ end
143
+ end
144
+ end
145
+
146
+ klass.before_destroy do
147
+ if record = __send__(name)
148
+ record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen?
149
+
150
+ if record.persisted?
151
+ record.class.with(record.persistence_context) do |_class|
152
+ _class.decrement_counter(cache_column, record._id)
153
+ end
154
+ record.remove_change(cache_column)
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,159 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ module Eager
6
+
7
+ # Base class for eager load preload functions.
8
+ #
9
+ # @since 4.0.0
10
+ class Base
11
+
12
+ # Instantiate the eager load class.
13
+ #
14
+ # @example Create the new belongs to eager load preloader.
15
+ # BelongsTo.new(association, parent_docs)
16
+ #
17
+ # @param [ Array<Association> ] associations Associations to eager load
18
+ # @param [ Array<Document> ] docs Documents to preload the relations
19
+ #
20
+ # @return [ Base ] The eager load preloader
21
+ #
22
+ # @since 4.0.0
23
+ def initialize(associations, docs)
24
+ @associations = associations
25
+ @docs = docs
26
+ @grouped_docs = {}
27
+ end
28
+
29
+ # Run the preloader.
30
+ #
31
+ # @example Preload the relations into the documents.
32
+ # loader.run
33
+ #
34
+ # @return [ Array ] The list of documents given.
35
+ #
36
+ # @since 4.0.0
37
+ def run
38
+ @loaded = []
39
+ while shift_association
40
+ preload
41
+ @loaded << @docs.collect { |d| d.send(@association.name) if d.respond_to?(@association.name) }
42
+ end
43
+ @loaded.flatten
44
+ end
45
+
46
+ protected
47
+
48
+ # Preload the current relation.
49
+ #
50
+ # This method should be implemented in the subclass
51
+ #
52
+ # @example Preload the current relation into the documents.
53
+ # loader.preload
54
+ #
55
+ # @since 4.0.0
56
+ def preload
57
+ raise NotImplementedError
58
+ end
59
+
60
+ # Run the preloader.
61
+ #
62
+ # @example Iterate over the documents loaded for the current relation
63
+ # loader.each_loaded_document { |doc| }
64
+ #
65
+ # @since 4.0.0
66
+ def each_loaded_document
67
+ criteria = @association.klass.any_in(key => keys_from_docs)
68
+ criteria.inclusions = criteria.inclusions - [@association]
69
+ criteria.each do |doc|
70
+ yield doc
71
+ end
72
+ end
73
+
74
+ # Set the pre-loaded document into its parent.
75
+ #
76
+ # @example Set docs into parent with pk = "foo"
77
+ # loader.set_on_parent("foo", docs)
78
+ #
79
+ # @param [ ObjectId ] id parent`s id
80
+ # @param [ Document, Array ] element to push into the parent
81
+ #
82
+ # @since 4.0.0
83
+ def set_on_parent(id, element)
84
+ grouped_docs[id].each do |d|
85
+ set_relation(d, element)
86
+ end
87
+ end
88
+
89
+ # Return a hash with the current documents grouped by key.
90
+ #
91
+ # @example Return a hash with the current documents grouped by key.
92
+ # loader.grouped_docs
93
+ #
94
+ # @return [ Hash ] hash with grouped documents.
95
+ #
96
+ # @since 4.0.0
97
+ def grouped_docs
98
+ @grouped_docs[@association.name] ||= @docs.group_by do |doc|
99
+ doc.send(group_by_key) if doc.respond_to?(group_by_key)
100
+ end
101
+ end
102
+
103
+ # Group the documents and return the keys
104
+ #
105
+ # @example
106
+ # loader.keys_from_docs
107
+ #
108
+ # @return [ Array ] keys, ids
109
+ #
110
+ # @since 4.0.0
111
+ def keys_from_docs
112
+ grouped_docs.keys
113
+ end
114
+
115
+ # Return the key to group the current documents.
116
+ #
117
+ # This method should be implemented in the subclass
118
+ #
119
+ # @example Return the key for group
120
+ # loader.group_by_key
121
+ #
122
+ # @return [ Symbol ] Key to group by the current documents.
123
+ #
124
+ # @since 4.0.0
125
+ def group_by_key
126
+ raise NotImplementedError
127
+ end
128
+
129
+ # Set the pre-loaded document into its parent.
130
+ #
131
+ # @example Set docs into parent using the current relation name.
132
+ # loader.set_relation(doc, docs)
133
+ #
134
+ # @param [ Document ] doc The object to set the relation on
135
+ # @param [ Document, Array ] element to set into the parent
136
+ #
137
+ # @since 4.0.0
138
+ def set_relation(doc, element)
139
+ doc.set_relation(@association.name, element) unless doc.blank?
140
+ end
141
+
142
+ private
143
+
144
+ # Shift the current association metadata
145
+ #
146
+ # @example Shift the current association.
147
+ # loader.shift_association
148
+ #
149
+ # @return [ Association ] The association object.
150
+ #
151
+ # @since 4.0.0
152
+ def shift_association
153
+ @association = @associations.shift
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end