mongoid 6.4.2 → 7.0.3

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -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,162 @@
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
+ doc_keys = keys_from_docs
68
+ return @association.klass.none if doc_keys.all?(&:nil?)
69
+
70
+ criteria = @association.klass.any_in(key => doc_keys)
71
+ criteria.inclusions = criteria.inclusions - [@association]
72
+ criteria.each do |doc|
73
+ yield doc
74
+ end
75
+ end
76
+
77
+ # Set the pre-loaded document into its parent.
78
+ #
79
+ # @example Set docs into parent with pk = "foo"
80
+ # loader.set_on_parent("foo", docs)
81
+ #
82
+ # @param [ ObjectId ] id parent`s id
83
+ # @param [ Document, Array ] element to push into the parent
84
+ #
85
+ # @since 4.0.0
86
+ def set_on_parent(id, element)
87
+ grouped_docs[id].each do |d|
88
+ set_relation(d, element)
89
+ end
90
+ end
91
+
92
+ # Return a hash with the current documents grouped by key.
93
+ #
94
+ # @example Return a hash with the current documents grouped by key.
95
+ # loader.grouped_docs
96
+ #
97
+ # @return [ Hash ] hash with grouped documents.
98
+ #
99
+ # @since 4.0.0
100
+ def grouped_docs
101
+ @grouped_docs[@association.name] ||= @docs.group_by do |doc|
102
+ doc.send(group_by_key) if doc.respond_to?(group_by_key)
103
+ end
104
+ end
105
+
106
+ # Group the documents and return the keys
107
+ #
108
+ # @example
109
+ # loader.keys_from_docs
110
+ #
111
+ # @return [ Array ] keys, ids
112
+ #
113
+ # @since 4.0.0
114
+ def keys_from_docs
115
+ grouped_docs.keys
116
+ end
117
+
118
+ # Return the key to group the current documents.
119
+ #
120
+ # This method should be implemented in the subclass
121
+ #
122
+ # @example Return the key for group
123
+ # loader.group_by_key
124
+ #
125
+ # @return [ Symbol ] Key to group by the current documents.
126
+ #
127
+ # @since 4.0.0
128
+ def group_by_key
129
+ raise NotImplementedError
130
+ end
131
+
132
+ # Set the pre-loaded document into its parent.
133
+ #
134
+ # @example Set docs into parent using the current relation name.
135
+ # loader.set_relation(doc, docs)
136
+ #
137
+ # @param [ Document ] doc The object to set the relation on
138
+ # @param [ Document, Array ] element to set into the parent
139
+ #
140
+ # @since 4.0.0
141
+ def set_relation(doc, element)
142
+ doc.set_relation(@association.name, element) unless doc.blank?
143
+ end
144
+
145
+ private
146
+
147
+ # Shift the current association metadata
148
+ #
149
+ # @example Shift the current association.
150
+ # loader.shift_association
151
+ #
152
+ # @return [ Association ] The association object.
153
+ #
154
+ # @since 4.0.0
155
+ def shift_association
156
+ @association = @associations.shift
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasAndBelongsToMany
6
+
7
+ # Binding class for all has_and_belongs_to_many relations.
8
+ class Binding
9
+ include Bindable
10
+
11
+ # Binds a single document with the inverse relation. Used
12
+ # specifically when appending to the proxy.
13
+ #
14
+ # @example Bind one document.
15
+ # person.preferences.bind_one(preference)
16
+ #
17
+ # @param [ Document ] doc The single document to bind.
18
+ #
19
+ # @since 2.0.0.rc.1
20
+ def bind_one(doc)
21
+ binding do
22
+ inverse_keys = doc.you_must(_association.inverse_foreign_key)
23
+ if inverse_keys
24
+ record_id = inverse_record_id(doc)
25
+ unless inverse_keys.include?(record_id)
26
+ doc.you_must(_association.inverse_foreign_key_setter, inverse_keys.push(record_id))
27
+ end
28
+ doc.reset_relation_criteria(_association.inverse)
29
+ end
30
+ _base._synced[_association.foreign_key] = true
31
+ doc._synced[_association.inverse_foreign_key] = true
32
+ end
33
+ end
34
+
35
+ # Unbind a single document.
36
+ #
37
+ # @example Unbind the document.
38
+ # person.preferences.unbind_one(document)
39
+ #
40
+ # @since 2.0.0.rc.1
41
+ def unbind_one(doc)
42
+ binding do
43
+ _base.send(_association.foreign_key).delete_one(record_id(doc))
44
+ inverse_keys = doc.you_must(_association.inverse_foreign_key)
45
+ if inverse_keys
46
+ inverse_keys.delete_one(inverse_record_id(doc))
47
+ doc.reset_relation_criteria(_association.inverse)
48
+ end
49
+ _base._synced[_association.foreign_key] = true
50
+ doc._synced[_association.inverse_foreign_key] = true
51
+ end
52
+ end
53
+
54
+ # Find the inverse id referenced by inverse_keys
55
+ def inverse_record_id(doc)
56
+ inverse_association = determine_inverse_association(doc)
57
+ if inverse_association
58
+ _base.__send__(inverse_association.primary_key)
59
+ else
60
+ _base._id
61
+ end
62
+ end
63
+
64
+ def determine_inverse_association(doc)
65
+ doc.relations[_base.class.name.demodulize.underscore.pluralize]
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasAndBelongsToMany
6
+
7
+ # The Builder behavior for has_and_belongs_to_many associations.
8
+ #
9
+ # @since 7.0
10
+ module Buildable
11
+
12
+ # This builder either takes a hash and queries for the
13
+ # object or an array of documents, where it will just return them.
14
+ #
15
+ # @example Build the documents.
16
+ # relation.build(association, attrs)
17
+ #
18
+ # @param [ Object ] base The base object.
19
+ # @param [ Object ] object The object to use to build the relation.
20
+ # @param [ String ] type Not used in this context.
21
+ #
22
+ # @return [ Array<Document> ] The documents.
23
+ def build(base, object, type = nil)
24
+ if query?(object)
25
+ query_criteria(object)
26
+ else
27
+ object.try(:dup)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def query?(object)
34
+ object.nil? || Array(object).all? { |d| !d.is_a?(Mongoid::Document) }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasAndBelongsToMany
6
+
7
+ # Eager class for has_and_belongs_to_many associations.
8
+ class Eager < Association::Referenced::Eager::Base
9
+
10
+ private
11
+
12
+ def preload
13
+ @docs.each do |d|
14
+ set_relation(d, [])
15
+ end
16
+
17
+ entries = {}
18
+ each_loaded_document do |doc|
19
+ entries[doc.send(key)] = doc
20
+ end
21
+
22
+ @docs.each do |d|
23
+ keys = d.send(group_by_key)
24
+ docs = entries.values_at(*keys).compact
25
+ set_relation(d, docs)
26
+ end
27
+ end
28
+
29
+ def keys_from_docs
30
+ keys = Set.new
31
+ @docs.each do |d|
32
+ keys += d.send(group_by_key)
33
+ end
34
+ keys.to_a
35
+ end
36
+
37
+ def set_relation(doc, element)
38
+ doc.__build__(@association.name, element, @association) unless doc.blank?
39
+ end
40
+
41
+ def group_by_key
42
+ @association.foreign_key
43
+ end
44
+
45
+ def key
46
+ @association.primary_key
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end