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
@@ -1,479 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Referenced
5
-
6
- # This class defines the behaviour for all relations that are a
7
- # many-to-many between documents in different collections.
8
- class ManyToMany < Many
9
-
10
- # The allowed options when defining this relation.
11
- #
12
- # @return [ Array<Symbol> ] The allowed options when defining this relation.
13
- #
14
- # @since 6.0.0
15
- VALID_OPTIONS = [
16
- :after_add,
17
- :after_remove,
18
- :autosave,
19
- :before_add,
20
- :before_remove,
21
- :dependent,
22
- :foreign_key,
23
- :index,
24
- :order,
25
- :primary_key
26
- ].freeze
27
-
28
- # Appends a document or array of documents to the relation. Will set
29
- # the parent and update the index in the process.
30
- #
31
- # @example Append a document.
32
- # person.posts << post
33
- #
34
- # @example Push a document.
35
- # person.posts.push(post)
36
- #
37
- # @example Concat with other documents.
38
- # person.posts.concat([ post_one, post_two ])
39
- #
40
- # @param [ Document, Array<Document> ] args Any number of documents.
41
- #
42
- # @return [ Array<Document> ] The loaded docs.
43
- #
44
- # @since 2.0.0.beta.1
45
- def <<(*args)
46
- docs = args.flatten
47
- return concat(docs) if docs.size > 1
48
- if doc = docs.first
49
- append(doc)
50
- base.add_to_set(foreign_key => doc.send(__metadata.primary_key))
51
- if child_persistable?(doc)
52
- doc.save
53
- end
54
- end
55
- unsynced(base, foreign_key) and self
56
- end
57
- alias :push :<<
58
-
59
- # Appends an array of documents to the relation. Performs a batch
60
- # insert of the documents instead of persisting one at a time.
61
- #
62
- # @example Concat with other documents.
63
- # person.posts.concat([ post_one, post_two ])
64
- #
65
- # @param [ Array<Document> ] documents The docs to add.
66
- #
67
- # @return [ Array<Document> ] The documents.
68
- #
69
- # @since 2.4.0
70
- def concat(documents)
71
- ids, docs, inserts = {}, [], []
72
- documents.each do |doc|
73
- next unless doc
74
- append(doc)
75
- if persistable? || _creating?
76
- ids[doc._id] = true
77
- save_or_delay(doc, docs, inserts)
78
- else
79
- existing = base.send(foreign_key)
80
- unless existing.include?(doc._id)
81
- existing.push(doc._id) and unsynced(base, foreign_key)
82
- end
83
- end
84
- end
85
- if persistable? || _creating?
86
- base.push(foreign_key => ids.keys)
87
- end
88
- persist_delayed(docs, inserts)
89
- self
90
- end
91
-
92
- # Build a new document from the attributes and append it to this
93
- # relation without saving.
94
- #
95
- # @example Build a new document on the relation.
96
- # person.posts.build(:title => "A new post")
97
- #
98
- # @overload build(attributes = {}, type = nil)
99
- # @param [ Hash ] attributes The attributes of the new document.
100
- # @param [ Class ] type The optional subclass to build.
101
- #
102
- # @overload build(attributes = {}, type = nil)
103
- # @param [ Hash ] attributes The attributes of the new document.
104
- # @param [ Class ] type The optional subclass to build.
105
- #
106
- # @return [ Document ] The new document.
107
- #
108
- # @since 2.0.0.beta.1
109
- def build(attributes = {}, type = nil)
110
- doc = Factory.build(type || klass, attributes)
111
- base.send(foreign_key).push(doc._id)
112
- append(doc)
113
- doc.apply_post_processed_defaults
114
- unsynced(doc, inverse_foreign_key)
115
- yield(doc) if block_given?
116
- doc
117
- end
118
- alias :new :build
119
-
120
- # Delete the document from the relation. This will set the foreign key
121
- # on the document to nil. If the dependent options on the relation are
122
- # :delete or :destroy the appropriate removal will occur.
123
- #
124
- # @example Delete the document.
125
- # person.posts.delete(post)
126
- #
127
- # @param [ Document ] document The document to remove.
128
- #
129
- # @return [ Document ] The matching document.
130
- #
131
- # @since 2.1.0
132
- def delete(document)
133
- doc = super
134
- if doc && persistable?
135
- base.pull(foreign_key => doc.send(__metadata.primary_key))
136
- target._unloaded = criteria
137
- unsynced(base, foreign_key)
138
- end
139
- doc
140
- end
141
-
142
- # Removes all associations between the base document and the target
143
- # documents by deleting the foreign keys and the references, orphaning
144
- # the target documents in the process.
145
- #
146
- # @example Nullify the relation.
147
- # person.preferences.nullify
148
- #
149
- # @since 2.0.0.rc.1
150
- def nullify
151
- target.each do |doc|
152
- execute_callback :before_remove, doc
153
- end
154
- unless __metadata.forced_nil_inverse?
155
- criteria.pull(inverse_foreign_key => base._id)
156
- end
157
- if persistable?
158
- base.set(foreign_key => base.send(foreign_key).clear)
159
- end
160
- after_remove_error = nil
161
- many_to_many = target.clear do |doc|
162
- unbind_one(doc)
163
- unless __metadata.forced_nil_inverse?
164
- doc.changed_attributes.delete(inverse_foreign_key)
165
- end
166
- begin
167
- execute_callback :after_remove, doc
168
- rescue => e
169
- after_remove_error = e
170
- end
171
- end
172
- raise after_remove_error if after_remove_error
173
- many_to_many
174
- end
175
- alias :nullify_all :nullify
176
- alias :clear :nullify
177
- alias :purge :nullify
178
-
179
- # Substitutes the supplied target documents for the existing documents
180
- # in the relation. If the new target is nil, perform the necessary
181
- # deletion.
182
- #
183
- # @example Replace the relation.
184
- # person.preferences.substitute([ new_post ])
185
- #
186
- # @param [ Array<Document> ] replacement The replacement target.
187
- #
188
- # @return [ Many ] The relation.
189
- #
190
- # @since 2.0.0.rc.1
191
- def substitute(replacement)
192
- purge
193
- unless replacement.blank?
194
- push(replacement.compact.uniq)
195
- else
196
- reset_unloaded
197
- end
198
- self
199
- end
200
-
201
- # Get a criteria for the documents without the default scoping
202
- # applied.
203
- #
204
- # @example Get the unscoped criteria.
205
- # person.preferences.unscoped
206
- #
207
- # @return [ Criteria ] The unscoped criteria.
208
- #
209
- # @since 2.4.0
210
- def unscoped
211
- klass.unscoped.any_in(_id: base.send(foreign_key))
212
- end
213
-
214
- private
215
-
216
- # Appends the document to the target array, updating the index on the
217
- # document at the same time.
218
- #
219
- # @example Append the document to the relation.
220
- # relation.append(document)
221
- #
222
- # @param [ Document ] document The document to append to the target.
223
- #
224
- # @since 2.0.0.rc.1
225
- def append(document)
226
- execute_callback :before_add, document
227
- target.push(document)
228
- characterize_one(document)
229
- bind_one(document)
230
- execute_callback :after_add, document
231
- end
232
-
233
- # Instantiate the binding associated with this relation.
234
- #
235
- # @example Get the binding.
236
- # relation.binding([ address ])
237
- #
238
- # @return [ Binding ] The binding.
239
- #
240
- # @since 2.0.0.rc.1
241
- def binding
242
- Bindings::Referenced::ManyToMany.new(base, target, __metadata)
243
- end
244
-
245
- # Determine if the child document should be persisted.
246
- #
247
- # @api private
248
- #
249
- # @example Is the child persistable?
250
- # relation.child_persistable?(doc)
251
- #
252
- # @param [ Document ] doc The document.
253
- #
254
- # @return [ true, false ] If the document can be persisted.
255
- #
256
- # @since 3.0.20
257
- def child_persistable?(doc)
258
- (persistable? || _creating?) &&
259
- !(doc.persisted? && __metadata.forced_nil_inverse?)
260
- end
261
-
262
- # Returns the criteria object for the target class with its documents set
263
- # to target.
264
- #
265
- # @example Get a criteria for the relation.
266
- # relation.criteria
267
- #
268
- # @return [ Criteria ] A new criteria.
269
- def criteria
270
- ManyToMany.criteria(__metadata, base.send(foreign_key))
271
- end
272
-
273
- # Flag the base as unsynced with respect to the foreign key.
274
- #
275
- # @api private
276
- #
277
- # @example Flag as unsynced.
278
- # relation.unsynced(doc, :preference_ids)
279
- #
280
- # @param [ Document ] doc The document to flag.
281
- # @param [ Symbol ] key The key to flag on the document.
282
- #
283
- # @return [ true ] true.
284
- #
285
- # @since 3.0.0
286
- def unsynced(doc, key)
287
- doc._synced[key] = false
288
- true
289
- end
290
-
291
- class << self
292
-
293
- # Return the builder that is responsible for generating the documents
294
- # that will be used by this relation.
295
- #
296
- # @example Get the builder.
297
- # Referenced::ManyToMany.builder(meta, object)
298
- #
299
- # @param [ Document ] base The base document.
300
- # @param [ Metadata ] meta The metadata of the relation.
301
- # @param [ Document, Hash ] object A document or attributes to build
302
- # with.
303
- #
304
- # @return [ Builder ] A new builder object.
305
- #
306
- # @since 2.0.0.rc.1
307
- def builder(base, meta, object)
308
- Builders::Referenced::ManyToMany.new(base, meta, object)
309
- end
310
-
311
- # Create the standard criteria for this relation given the supplied
312
- # metadata and object.
313
- #
314
- # @example Get the criteria.
315
- # Proxy.criteria(meta, object)
316
- #
317
- # @param [ Metadata ] metadata The relation metadata.
318
- # @param [ Object ] object The object for the criteria.
319
- # @param [ Class ] type The criteria class.
320
- #
321
- # @return [ Criteria ] The criteria.
322
- #
323
- # @since 2.1.0
324
- def criteria(metadata, object, type = nil)
325
- apply_ordering(
326
- metadata.klass.all_of(
327
- metadata.primary_key => { "$in" => object || [] }
328
- ), metadata
329
- )
330
- end
331
-
332
- def eager_load_klass
333
- Relations::Eager::HasAndBelongsToMany
334
- end
335
-
336
- # Returns true if the relation is an embedded one. In this case
337
- # always false.
338
- #
339
- # @example Is this relation embedded?
340
- # Referenced::ManyToMany.embedded?
341
- #
342
- # @return [ false ] Always false.
343
- #
344
- # @since 2.0.0.rc.1
345
- def embedded?
346
- false
347
- end
348
-
349
- # Get the foreign key for the provided name.
350
- #
351
- # @example Get the foreign key.
352
- # Referenced::ManyToMany.foreign_key(:person)
353
- #
354
- # @param [ Symbol ] name The name.
355
- #
356
- # @return [ String ] The foreign key.
357
- #
358
- # @since 3.0.0
359
- def foreign_key(name)
360
- "#{name.to_s.singularize}#{foreign_key_suffix}"
361
- end
362
-
363
- # Get the default value for the foreign key.
364
- #
365
- # @example Get the default.
366
- # Referenced::ManyToMany.foreign_key_default
367
- #
368
- # @return [ Array ] Always an empty array.
369
- #
370
- # @since 2.0.0.rc.1
371
- def foreign_key_default
372
- []
373
- end
374
-
375
- # Returns the suffix of the foreign key field, either "_id" or "_ids".
376
- #
377
- # @example Get the suffix for the foreign key.
378
- # Referenced::ManyToMany.foreign_key_suffix
379
- #
380
- # @return [ String ] "_ids"
381
- #
382
- # @since 2.0.0.rc.1
383
- def foreign_key_suffix
384
- "_ids"
385
- end
386
-
387
- # Returns the macro for this relation. Used mostly as a helper in
388
- # reflection.
389
- #
390
- # @example Get the macro.
391
- # Referenced::ManyToMany.macro
392
- #
393
- # @return [ Symbol ] :has_and_belongs_to_many
394
- def macro
395
- :has_and_belongs_to_many
396
- end
397
-
398
- # Return the nested builder that is responsible for generating the documents
399
- # that will be used by this relation.
400
- #
401
- # @example Get the nested builder.
402
- # Referenced::ManyToMany.builder(attributes, options)
403
- #
404
- # @param [ Metadata ] metadata The relation metadata.
405
- # @param [ Hash ] attributes The attributes to build with.
406
- # @param [ Hash ] options The options for the builder.
407
- #
408
- # @option options [ true, false ] :allow_destroy Can documents be
409
- # deleted?
410
- # @option options [ Integer ] :limit Max number of documents to
411
- # create at once.
412
- # @option options [ Proc, Symbol ] :reject_if If documents match this
413
- # option then they are ignored.
414
- # @option options [ true, false ] :update_only Only existing documents
415
- # can be modified.
416
- #
417
- # @return [ NestedBuilder ] A newly instantiated nested builder object.
418
- #
419
- # @since 2.0.0.rc.1
420
- def nested_builder(metadata, attributes, options)
421
- Builders::NestedAttributes::Many.new(metadata, attributes, options)
422
- end
423
-
424
- # Get the path calculator for the supplied document.
425
- #
426
- # @example Get the path calculator.
427
- # Proxy.path(document)
428
- #
429
- # @param [ Document ] document The document to calculate on.
430
- #
431
- # @return [ Root ] The root atomic path calculator.
432
- #
433
- # @since 2.1.0
434
- def path(document)
435
- Mongoid::Atomic::Paths::Root.new(document)
436
- end
437
-
438
- # Tells the caller if this relation is one that stores the foreign
439
- # key on its own objects.
440
- #
441
- # @example Does this relation store a foreign key?
442
- # Referenced::Many.stores_foreign_key?
443
- #
444
- # @return [ true ] Always true.
445
- #
446
- # @since 2.0.0.rc.1
447
- def stores_foreign_key?
448
- true
449
- end
450
-
451
- # Get the valid options allowed with this relation.
452
- #
453
- # @example Get the valid options.
454
- # Relation.valid_options
455
- #
456
- # @return [ Array<Symbol> ] The valid options.
457
- #
458
- # @since 2.1.0
459
- def valid_options
460
- VALID_OPTIONS
461
- end
462
-
463
- # Get the default validation setting for the relation. Determines if
464
- # by default a validates associated will occur.
465
- #
466
- # @example Get the validation default.
467
- # Proxy.validation_default
468
- #
469
- # @return [ true, false ] The validation default.
470
- #
471
- # @since 2.1.9
472
- def validation_default
473
- true
474
- end
475
- end
476
- end
477
- end
478
- end
479
- end