mongoid 6.4.8 → 7.0.0

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 (320) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +0 -26
  4. data/lib/config/locales/en.yml +17 -0
  5. data/lib/mongoid/association/accessors.rb +339 -0
  6. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  7. data/lib/mongoid/association/builders.rb +92 -0
  8. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  9. data/lib/mongoid/association/depending.rb +116 -0
  10. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  11. data/lib/mongoid/{relations → association}/embedded/batchable.rb +21 -21
  12. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  14. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  16. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  17. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  18. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  20. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  21. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  22. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  24. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  25. data/lib/mongoid/association/embedded.rb +4 -0
  26. data/lib/mongoid/association/macros.rb +204 -0
  27. data/lib/mongoid/{relations → association}/many.rb +20 -50
  28. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  29. data/lib/mongoid/association/nested/many.rb +200 -0
  30. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  31. data/lib/mongoid/association/nested/one.rb +127 -0
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/{relations → association}/one.rb +6 -6
  34. data/lib/mongoid/association/options.rb +152 -0
  35. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  36. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  37. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  38. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  39. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  40. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  43. data/lib/mongoid/association/referenced/eager.rb +159 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  50. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  51. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  52. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  53. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  54. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  55. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  56. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  57. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  58. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  59. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  60. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  61. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  62. data/lib/mongoid/association/referenced.rb +7 -0
  63. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  64. data/lib/mongoid/association/relatable.rb +415 -0
  65. data/lib/mongoid/association/touchable.rb +97 -0
  66. data/lib/mongoid/association.rb +150 -0
  67. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  68. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  69. data/lib/mongoid/atomic.rb +4 -4
  70. data/lib/mongoid/attributes/dynamic.rb +2 -2
  71. data/lib/mongoid/attributes/nested.rb +10 -10
  72. data/lib/mongoid/attributes/processing.rb +2 -2
  73. data/lib/mongoid/attributes/readonly.rb +2 -4
  74. data/lib/mongoid/attributes.rb +22 -13
  75. data/lib/mongoid/changeable.rb +1 -1
  76. data/lib/mongoid/clients/options.rb +1 -1
  77. data/lib/mongoid/clients/sessions.rb +2 -2
  78. data/lib/mongoid/composable.rb +4 -4
  79. data/lib/mongoid/config.rb +1 -0
  80. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  81. data/lib/mongoid/contextual/atomic.rb +1 -1
  82. data/lib/mongoid/contextual/geo_near.rb +1 -1
  83. data/lib/mongoid/contextual/map_reduce.rb +4 -4
  84. data/lib/mongoid/contextual/memory.rb +25 -7
  85. data/lib/mongoid/contextual/mongo.rb +13 -11
  86. data/lib/mongoid/copyable.rb +6 -6
  87. data/lib/mongoid/criteria/includable.rb +14 -14
  88. data/lib/mongoid/criteria/modifiable.rb +8 -14
  89. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  91. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  92. data/lib/mongoid/criteria.rb +2 -2
  93. data/lib/mongoid/document.rb +6 -6
  94. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  95. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  96. data/lib/mongoid/errors/unknown_model.rb +25 -0
  97. data/lib/mongoid/errors.rb +3 -0
  98. data/lib/mongoid/extensions/array.rb +5 -5
  99. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  100. data/lib/mongoid/extensions/hash.rb +5 -2
  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/extensions.rb +0 -4
  106. data/lib/mongoid/factory.rb +13 -3
  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/fields.rb +3 -3
  111. data/lib/mongoid/indexable.rb +8 -5
  112. data/lib/mongoid/interceptable.rb +5 -5
  113. data/lib/mongoid/matchable/and.rb +1 -1
  114. data/lib/mongoid/matchable/elem_match.rb +9 -3
  115. data/lib/mongoid/matchable.rb +0 -3
  116. data/lib/mongoid/persistable/creatable.rb +2 -2
  117. data/lib/mongoid/persistable/deletable.rb +9 -8
  118. data/lib/mongoid/persistable/incrementable.rb +1 -1
  119. data/lib/mongoid/persistable/logical.rb +1 -1
  120. data/lib/mongoid/persistable/settable.rb +5 -5
  121. data/lib/mongoid/persistable/updatable.rb +2 -2
  122. data/lib/mongoid/persistable/upsertable.rb +1 -1
  123. data/lib/mongoid/persistable.rb +5 -6
  124. data/lib/mongoid/persistence_context.rb +1 -5
  125. data/lib/mongoid/query_cache.rb +19 -64
  126. data/lib/mongoid/railtie.rb +0 -17
  127. data/lib/mongoid/reloadable.rb +1 -1
  128. data/lib/mongoid/scopable.rb +3 -3
  129. data/lib/mongoid/serializable.rb +4 -4
  130. data/lib/mongoid/shardable.rb +1 -1
  131. data/lib/mongoid/tasks/database.rb +2 -2
  132. data/lib/mongoid/threaded.rb +0 -36
  133. data/lib/mongoid/traversable.rb +3 -3
  134. data/lib/mongoid/validatable/presence.rb +2 -2
  135. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  136. data/lib/mongoid/validatable.rb +8 -8
  137. data/lib/mongoid/version.rb +1 -1
  138. data/lib/mongoid.rb +1 -1
  139. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  140. data/spec/app/models/animal.rb +2 -1
  141. data/spec/app/models/bomb.rb +1 -1
  142. data/spec/app/models/message.rb +1 -1
  143. data/spec/app/models/person.rb +5 -2
  144. data/spec/app/models/shipment_address.rb +1 -0
  145. data/spec/app/models/vertex.rb +6 -0
  146. data/spec/app/models/wiki_page.rb +1 -1
  147. data/spec/config/mongoid.yml +1 -0
  148. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  149. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  150. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  151. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  152. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  153. data/spec/mongoid/association/depending_spec.rb +613 -0
  154. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  155. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  156. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  157. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  158. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  159. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  160. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  161. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  162. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  163. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  164. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  165. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  166. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  167. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  168. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  170. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  171. data/spec/mongoid/association/options_spec.rb +1321 -0
  172. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  173. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  174. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  175. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  176. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  177. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  178. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  180. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  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_spec.rb +1027 -0
  183. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  184. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  185. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  186. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  187. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  188. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  189. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  190. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  191. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  192. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  193. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  194. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  195. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  196. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  197. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  198. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  199. data/spec/mongoid/atomic_spec.rb +4 -4
  200. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  201. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  202. data/spec/mongoid/attributes_spec.rb +38 -2
  203. data/spec/mongoid/clients/factory_spec.rb +28 -52
  204. data/spec/mongoid/clients/options_spec.rb +65 -69
  205. data/spec/mongoid/clients/sessions_spec.rb +4 -13
  206. data/spec/mongoid/config_spec.rb +24 -0
  207. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  208. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  209. data/spec/mongoid/contextual/mongo_spec.rb +30 -5
  210. data/spec/mongoid/copyable_spec.rb +34 -0
  211. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  212. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  213. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  214. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  215. data/spec/mongoid/criteria/queryable/selectable_spec.rb +3 -42
  216. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  217. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  218. data/spec/mongoid/criteria_spec.rb +16 -19
  219. data/spec/mongoid/document_spec.rb +2 -56
  220. data/spec/mongoid/extensions/array_spec.rb +11 -15
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  222. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  223. data/spec/mongoid/extensions/object_spec.rb +7 -11
  224. data/spec/mongoid/extensions/range_spec.rb +7 -0
  225. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  226. data/spec/mongoid/extensions/string_spec.rb +7 -35
  227. data/spec/mongoid/factory_spec.rb +19 -1
  228. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  229. data/spec/mongoid/fields_spec.rb +2 -2
  230. data/spec/mongoid/findable_spec.rb +1 -1
  231. data/spec/mongoid/indexable_spec.rb +18 -8
  232. data/spec/mongoid/interceptable_spec.rb +22 -1
  233. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  234. data/spec/mongoid/matchable_spec.rb +1 -26
  235. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  236. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  237. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  238. data/spec/mongoid/persistable_spec.rb +21 -6
  239. data/spec/mongoid/query_cache_spec.rb +16 -99
  240. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  241. data/spec/mongoid/scopable_spec.rb +0 -13
  242. data/spec/mongoid/shardable_spec.rb +32 -12
  243. data/spec/mongoid/threaded_spec.rb +0 -68
  244. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  245. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  246. data/spec/mongoid/validatable_spec.rb +1 -1
  247. data/spec/spec_helper.rb +12 -14
  248. data.tar.gz.sig +1 -1
  249. metadata +192 -207
  250. metadata.gz.sig +0 -0
  251. data/lib/mongoid/matchable/nor.rb +0 -37
  252. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  253. data/lib/mongoid/relations/accessors.rb +0 -267
  254. data/lib/mongoid/relations/auto_save.rb +0 -94
  255. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  256. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  257. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  258. data/lib/mongoid/relations/bindings.rb +0 -9
  259. data/lib/mongoid/relations/builder.rb +0 -57
  260. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  261. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  262. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  263. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  264. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  265. data/lib/mongoid/relations/builders.rb +0 -106
  266. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  267. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  268. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  269. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  270. data/lib/mongoid/relations/cascading.rb +0 -56
  271. data/lib/mongoid/relations/conversions.rb +0 -34
  272. data/lib/mongoid/relations/counter_cache.rb +0 -160
  273. data/lib/mongoid/relations/cyclic.rb +0 -107
  274. data/lib/mongoid/relations/eager/base.rb +0 -153
  275. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  276. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  277. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  278. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  279. data/lib/mongoid/relations/embedded/in.rb +0 -241
  280. data/lib/mongoid/relations/embedded/many.rb +0 -683
  281. data/lib/mongoid/relations/embedded/one.rb +0 -235
  282. data/lib/mongoid/relations/macros.rb +0 -367
  283. data/lib/mongoid/relations/metadata.rb +0 -1179
  284. data/lib/mongoid/relations/nested_builder.rb +0 -74
  285. data/lib/mongoid/relations/options.rb +0 -49
  286. data/lib/mongoid/relations/polymorphic.rb +0 -39
  287. data/lib/mongoid/relations/referenced/in.rb +0 -304
  288. data/lib/mongoid/relations/referenced/many.rb +0 -812
  289. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  290. data/lib/mongoid/relations/referenced/one.rb +0 -290
  291. data/lib/mongoid/relations/synchronization.rb +0 -169
  292. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  293. data/lib/mongoid/relations/targets.rb +0 -2
  294. data/lib/mongoid/relations/touchable.rb +0 -97
  295. data/lib/mongoid/relations.rb +0 -148
  296. data/spec/app/models/array_field.rb +0 -7
  297. data/spec/app/models/delegating_patient.rb +0 -16
  298. data/spec/integration/document_spec.rb +0 -22
  299. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  300. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  301. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  302. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  303. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  304. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  305. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  306. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  307. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  308. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  309. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  310. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  311. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  312. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  313. data/spec/mongoid/relations/options_spec.rb +0 -35
  314. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  315. data/spec/support/cluster_config.rb +0 -158
  316. data/spec/support/constraints.rb +0 -101
  317. data/spec/support/macros.rb +0 -20
  318. data/spec/support/session_registry.rb +0 -50
  319. data/spec/support/spec_config.rb +0 -42
  320. /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,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
@@ -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