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,683 +0,0 @@
1
- # encoding: utf-8
2
- require "mongoid/relations/embedded/batchable"
3
-
4
- module Mongoid
5
- module Relations
6
- module Embedded
7
-
8
- # This class handles the behaviour for a document that embeds many other
9
- # documents within in it as an array.
10
- class Many < Relations::Many
11
- include Batchable
12
-
13
- # The allowed options when defining this relation.
14
- #
15
- # @return [ Array<Symbol> ] The allowed options when defining this relation.
16
- #
17
- # @since 6.0.0
18
- VALID_OPTIONS = [
19
- :as,
20
- :cascade_callbacks,
21
- :cyclic,
22
- :order,
23
- :store_as,
24
- :before_add,
25
- :after_add,
26
- :before_remove,
27
- :after_remove
28
- ].freeze
29
-
30
- # Appends a document or array of documents to the relation. Will set
31
- # the parent and update the index in the process.
32
- #
33
- # @example Append a document.
34
- # person.addresses << address
35
- #
36
- # @example Push a document.
37
- # person.addresses.push(address)
38
- #
39
- # @param [ Document, Array<Document> ] args Any number of documents.
40
- #
41
- def <<(*args)
42
- docs = args.flatten
43
- return concat(docs) if docs.size > 1
44
- if doc = docs.first
45
- append(doc)
46
- doc.save if persistable? && !_assigning?
47
- end
48
- self
49
- end
50
- alias :push :<<
51
-
52
- # Get this relation as as its representation in the database.
53
- #
54
- # @example Convert the relation to an attributes hash.
55
- # person.addresses.as_document
56
- #
57
- # @return [ Array<Hash> ] The relation as stored in the db.
58
- #
59
- # @since 2.0.0.rc.1
60
- def as_document
61
- as_attributes.collect { |attrs| BSON::Document.new(attrs) }
62
- end
63
-
64
- # Appends an array of documents to the relation. Performs a batch
65
- # insert of the documents instead of persisting one at a time.
66
- #
67
- # @example Concat with other documents.
68
- # person.addresses.concat([ address_one, address_two ])
69
- #
70
- # @param [ Array<Document> ] docs The docs to add.
71
- #
72
- # @return [ Array<Document> ] The documents.
73
- #
74
- # @since 2.4.0
75
- def concat(docs)
76
- batch_insert(docs) unless docs.empty?
77
- self
78
- end
79
-
80
- # Builds a new document in the relation and appends it to the target.
81
- # Takes an optional type if you want to specify a subclass.
82
- #
83
- # @example Build a new document on the relation.
84
- # person.people.build(:name => "Bozo")
85
- #
86
- # @overload build(attributes = {}, options = {}, type = nil)
87
- # @param [ Hash ] attributes The attributes to build the document with.
88
- # @param [ Class ] type Optional class to build the document with.
89
- #
90
- # @overload build(attributes = {}, type = nil)
91
- # @param [ Hash ] attributes The attributes to build the document with.
92
- # @param [ Class ] type Optional class to build the document with.
93
- #
94
- # @return [ Document ] The new document.
95
- def build(attributes = {}, type = nil)
96
- doc = Factory.build(type || __metadata.klass, attributes)
97
- append(doc)
98
- doc.apply_post_processed_defaults
99
- yield(doc) if block_given?
100
- doc.run_callbacks(:build) { doc }
101
- base._reset_memoized_children!
102
- doc
103
- end
104
- alias :new :build
105
-
106
- # Clear the relation. Will delete the documents from the db if they are
107
- # already persisted.
108
- #
109
- # @example Clear the relation.
110
- # person.addresses.clear
111
- #
112
- # @return [ Many ] The empty relation.
113
- def clear
114
- batch_clear(target.dup)
115
- self
116
- end
117
-
118
- # Returns a count of the number of documents in the association that have
119
- # actually been persisted to the database.
120
- #
121
- # Use #size if you want the total number of documents.
122
- #
123
- # @example Get the count of persisted documents.
124
- # person.addresses.count
125
- #
126
- # @return [ Integer ] The total number of persisted embedded docs, as
127
- # flagged by the #persisted? method.
128
- def count
129
- target.select { |doc| doc.persisted? }.size
130
- end
131
-
132
- # Delete the supplied document from the target. This method is proxied
133
- # in order to reindex the array after the operation occurs.
134
- #
135
- # @example Delete the document from the relation.
136
- # person.addresses.delete(address)
137
- #
138
- # @param [ Document ] document The document to be deleted.
139
- #
140
- # @return [ Document, nil ] The deleted document or nil if nothing deleted.
141
- #
142
- # @since 2.0.0.rc.1
143
- def delete(document)
144
- execute_callback :before_remove, document
145
- doc = target.delete_one(document)
146
- if doc && !_binding?
147
- _unscoped.delete_one(doc)
148
- if _assigning?
149
- base.add_atomic_pull(doc)
150
- else
151
- doc.delete(suppress: true)
152
- unbind_one(doc)
153
- end
154
- end
155
- reindex
156
- execute_callback :after_remove, document
157
- doc
158
- end
159
-
160
- # Delete all the documents in the association without running callbacks.
161
- #
162
- # @example Delete all documents from the relation.
163
- # person.addresses.delete_all
164
- #
165
- # @example Conditionally delete documents from the relation.
166
- # person.addresses.delete_all({ :street => "Bond" })
167
- #
168
- # @param [ Hash ] conditions Conditions on which documents to delete.
169
- #
170
- # @return [ Integer ] The number of documents deleted.
171
- def delete_all(conditions = {})
172
- remove_all(conditions, :delete)
173
- end
174
-
175
- # Delete all the documents for which the provided block returns true.
176
- #
177
- # @example Delete the matching documents.
178
- # person.addresses.delete_if do |doc|
179
- # doc.state == "GA"
180
- # end
181
- #
182
- # @return [ Many, Enumerator ] The relation or an enumerator if no
183
- # block was provided.
184
- #
185
- # @since 3.1.0
186
- def delete_if
187
- if block_given?
188
- dup_target = target.dup
189
- dup_target.each do |doc|
190
- delete(doc) if yield(doc)
191
- end
192
- self
193
- else
194
- super
195
- end
196
- end
197
-
198
- # Destroy all the documents in the association whilst running callbacks.
199
- #
200
- # @example Destroy all documents from the relation.
201
- # person.addresses.destroy_all
202
- #
203
- # @example Conditionally destroy documents from the relation.
204
- # person.addresses.destroy_all({ :street => "Bond" })
205
- #
206
- # @param [ Hash ] conditions Conditions on which documents to destroy.
207
- #
208
- # @return [ Integer ] The number of documents destroyed.
209
- def destroy_all(conditions = {})
210
- remove_all(conditions, :destroy)
211
- end
212
-
213
- # Determine if any documents in this relation exist in the database.
214
- #
215
- # @example Are there persisted documents?
216
- # person.posts.exists?
217
- #
218
- # @return [ true, false ] True is persisted documents exist, false if not.
219
- def exists?
220
- count > 0
221
- end
222
-
223
- # Finds a document in this association through several different
224
- # methods.
225
- #
226
- # @example Find a document by its id.
227
- # person.addresses.find(BSON::ObjectId.new)
228
- #
229
- # @example Find documents for multiple ids.
230
- # person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
231
- #
232
- # @param [ Array<Object> ] args Various arguments.
233
- #
234
- # @return [ Array<Document>, Document ] A single or multiple documents.
235
- def find(*args)
236
- criteria.find(*args)
237
- end
238
-
239
- # Instantiate a new embeds_many relation.
240
- #
241
- # @example Create the new relation.
242
- # Many.new(person, addresses, metadata)
243
- #
244
- # @param [ Document ] base The document this relation hangs off of.
245
- # @param [ Array<Document> ] target The child documents of the relation.
246
- # @param [ Metadata ] metadata The relation's metadata
247
- #
248
- # @return [ Many ] The proxy.
249
- def initialize(base, target, metadata)
250
- init(base, target, metadata) do
251
- target.each_with_index do |doc, index|
252
- integrate(doc)
253
- doc._index = index
254
- end
255
- @_unscoped = target.dup
256
- @target = scope(target)
257
- end
258
- end
259
-
260
- # Get all the documents in the relation that are loaded into memory.
261
- #
262
- # @example Get the in memory documents.
263
- # relation.in_memory
264
- #
265
- # @return [ Array<Document> ] The documents in memory.
266
- #
267
- # @since 2.1.0
268
- def in_memory
269
- target
270
- end
271
-
272
- # Pop documents off the relation. This can be a single document or
273
- # multiples, and will automatically persist the changes.
274
- #
275
- # @example Pop a single document.
276
- # relation.pop
277
- #
278
- # @example Pop multiple documents.
279
- # relation.pop(3)
280
- #
281
- # @param [ Integer ] count The number of documents to pop, or 1 if not
282
- # provided.
283
- #
284
- # @return [ Document, Array<Document> ] The popped document(s).
285
- #
286
- # @since 3.0.0
287
- def pop(count = nil)
288
- if count
289
- if docs = target[target.size - count, target.size]
290
- docs.each { |doc| delete(doc) }
291
- end
292
- else
293
- delete(target[-1])
294
- end
295
- end
296
-
297
- # Shift documents off the relation. This can be a single document or
298
- # multiples, and will automatically persist the changes.
299
- #
300
- # @example Shift a single document.
301
- # relation.shift
302
- #
303
- # @example Shift multiple documents.
304
- # relation.shift(3)
305
- #
306
- # @param [ Integer ] count The number of documents to shift, or 1 if not
307
- # provided.
308
- #
309
- # @return [ Document, Array<Document> ] The shifted document(s).
310
- def shift(count = nil)
311
- if count
312
- if target.size > 0 && docs = target[0, count]
313
- docs.each { |doc| delete(doc) }
314
- end
315
- else
316
- delete(target[0])
317
- end
318
- end
319
-
320
- # Substitutes the supplied target documents for the existing documents
321
- # in the relation.
322
- #
323
- # @example Substitute the relation's target.
324
- # person.addresses.substitute([ address ])
325
- #
326
- # @param [ Array<Document> ] docs The replacement docs.
327
- #
328
- # @return [ Many ] The proxied relation.
329
- #
330
- # @since 2.0.0.rc.1
331
- def substitute(docs)
332
- batch_replace(docs)
333
- self
334
- end
335
-
336
- # Return the relation with all previous scoping removed. This is the
337
- # exact representation of the docs in the database.
338
- #
339
- # @example Get the unscoped documents.
340
- # person.addresses.unscoped
341
- #
342
- # @return [ Criteria ] The unscoped relation.
343
- #
344
- # @since 2.4.0
345
- def unscoped
346
- criterion = klass.unscoped
347
- criterion.embedded = true
348
- criterion.documents = _unscoped.delete_if(&:marked_for_destruction?)
349
- criterion
350
- end
351
-
352
- private
353
-
354
- # Appends the document to the target array, updating the index on the
355
- # document at the same time.
356
- #
357
- # @example Append to the document.
358
- # relation.append(document)
359
- #
360
- # @param [ Document ] document The document to append to the target.
361
- #
362
- # @since 2.0.0.rc.1
363
- def append(document)
364
- execute_callback :before_add, document
365
- target.push(*scope([document]))
366
- _unscoped.push(document)
367
- integrate(document)
368
- document._index = _unscoped.size - 1
369
- execute_callback :after_add, document
370
- end
371
-
372
- # Instantiate the binding associated with this relation.
373
- #
374
- # @example Create the binding.
375
- # relation.binding([ address ])
376
- #
377
- # @return [ Binding ] The many binding.
378
- #
379
- # @since 2.0.0.rc.1
380
- def binding
381
- Bindings::Embedded::Many.new(base, target, __metadata)
382
- end
383
-
384
- # Returns the criteria object for the target class with its documents set
385
- # to target.
386
- #
387
- # @example Get a criteria for the relation.
388
- # relation.criteria
389
- #
390
- # @return [ Criteria ] A new criteria.
391
- def criteria
392
- criterion = klass.scoped
393
- criterion.embedded = true
394
- criterion.documents = target
395
- criterion.parent_document = base
396
- criterion.metadata = relation_metadata
397
- Many.apply_ordering(criterion, __metadata)
398
- end
399
-
400
- # Deletes one document from the target and unscoped.
401
- #
402
- # @api private
403
- #
404
- # @example Delete one document.
405
- # relation.delete_one(doc)
406
- #
407
- # @param [ Document ] document The document to delete.
408
- #
409
- # @since 2.4.7
410
- def delete_one(document)
411
- target.delete_one(document)
412
- _unscoped.delete_one(document)
413
- reindex
414
- end
415
-
416
- # Integrate the document into the relation. will set its metadata and
417
- # attempt to bind the inverse.
418
- #
419
- # @example Integrate the document.
420
- # relation.integrate(document)
421
- #
422
- # @param [ Document ] document The document to integrate.
423
- #
424
- # @since 2.1.0
425
- def integrate(document)
426
- characterize_one(document)
427
- bind_one(document)
428
- end
429
-
430
- # If the target array does not respond to the supplied method then try to
431
- # find a named scope or criteria on the class and send the call there.
432
- #
433
- # If the method exists on the array, use the default proxy behavior.
434
- #
435
- # @param [ Symbol, String ] name The name of the method.
436
- # @param [ Array ] args The method args
437
- # @param [ Proc ] block Optional block to pass.
438
- #
439
- # @return [ Criteria, Object ] A Criteria or return value from the target.
440
- def method_missing(name, *args, &block)
441
- return super if target.respond_to?(name)
442
- klass.send(:with_scope, criteria) do
443
- criteria.public_send(name, *args, &block)
444
- end
445
- end
446
-
447
- # Are we able to persist this relation?
448
- #
449
- # @example Can we persist the relation?
450
- # relation.persistable?
451
- #
452
- # @return [ true, false ] If the relation is persistable.
453
- #
454
- # @since 2.1.0
455
- def persistable?
456
- base.persisted? && !_binding?
457
- end
458
-
459
- # Reindex all the target elements. This is useful when performing
460
- # operations on the proxied target directly and the indices need to
461
- # match that on the database side.
462
- #
463
- # @example Reindex the relation.
464
- # person.addresses.reindex
465
- #
466
- # @since 2.0.0.rc.1
467
- def reindex
468
- _unscoped.each_with_index do |doc, index|
469
- doc._index = index
470
- end
471
- end
472
-
473
- # Apply the metadata ordering or the default scoping to the provided
474
- # documents.
475
- #
476
- # @example Apply scoping.
477
- # person.addresses.scope(target)
478
- #
479
- # @param [ Array<Document> ] docs The documents to scope.
480
- #
481
- # @return [ Array<Document> ] The scoped docs.
482
- #
483
- # @since 2.4.0
484
- def scope(docs)
485
- return docs unless __metadata.order || __metadata.klass.default_scoping?
486
- crit = __metadata.klass.order_by(__metadata.order)
487
- crit.embedded = true
488
- crit.documents = docs
489
- crit.entries
490
- end
491
-
492
- # Remove all documents from the relation, either with a delete or a
493
- # destroy depending on what this was called through.
494
- #
495
- # @example Destroy documents from the relation.
496
- # relation.remove_all({ :num => 1 }, true)
497
- #
498
- # @param [ Hash ] conditions Conditions to filter by.
499
- # @param [ true, false ] method
500
- #
501
- # @return [ Integer ] The number of documents removed.
502
- def remove_all(conditions = {}, method = :delete)
503
- criteria = where(conditions || {})
504
- removed = criteria.size
505
- batch_remove(criteria, method)
506
- removed
507
- end
508
-
509
- # Get the internal unscoped documents.
510
- #
511
- # @example Get the unscoped documents.
512
- # relation._unscoped
513
- #
514
- # @return [ Array<Document> ] The unscoped documents.
515
- #
516
- # @since 2.4.0
517
- def _unscoped
518
- @_unscoped ||= []
519
- end
520
-
521
- # Set the internal unscoped documents.
522
- #
523
- # @example Set the unscoped documents.
524
- # relation._unscoped = docs
525
- #
526
- # @param [ Array<Document> ] docs The documents.
527
- #
528
- # @return [ Array<Document ] The unscoped docs.
529
- #
530
- # @since 2.4.0
531
- def _unscoped=(docs)
532
- @_unscoped = docs
533
- end
534
-
535
- def as_attributes
536
- attributes = []
537
- _unscoped.each do |doc|
538
- attributes.push(doc.as_document)
539
- end
540
- attributes
541
- end
542
-
543
- class << self
544
-
545
- # Return the builder that is responsible for generating the documents
546
- # that will be used by this relation.
547
- #
548
- # @example Get the builder.
549
- # Embedded::Many.builder(meta, object)
550
- #
551
- # @param [ Document ] base The base document.
552
- # @param [ Metadata ] meta The metadata of the relation.
553
- # @param [ Document, Hash ] object A document or attributes to build
554
- # with.
555
- #
556
- # @return [ Builder ] A newly instantiated builder object.
557
- #
558
- # @since 2.0.0.rc.1
559
- def builder(base, meta, object)
560
- Builders::Embedded::Many.new(base, meta, object)
561
- end
562
-
563
- # Returns true if the relation is an embedded one. In this case
564
- # always true.
565
- #
566
- # @example Is the relation embedded?
567
- # Embedded::Many.embedded?
568
- #
569
- # @return [ true ] true.
570
- #
571
- # @since 2.0.0.rc.1
572
- def embedded?
573
- true
574
- end
575
-
576
- # Returns the suffix of the foreign key field, either "_id" or "_ids".
577
- #
578
- # @example Get the suffix for the foreign key.
579
- # Referenced::Many.foreign_key_suffix
580
- #
581
- # @return [ nil ] nil.
582
- #
583
- # @since 3.0.0
584
- def foreign_key_suffix
585
- nil
586
- end
587
-
588
- # Returns the macro for this relation. Used mostly as a helper in
589
- # reflection.
590
- #
591
- # @example Get the relation macro.
592
- # Mongoid::Relations::Embedded::Many.macro
593
- #
594
- # @return [ Symbol ] :embeds_many
595
- #
596
- # @since 2.0.0.rc.1
597
- def macro
598
- :embeds_many
599
- end
600
-
601
- # Return the nested builder that is responsible for generating the
602
- # documents that will be used by this relation.
603
- #
604
- # @example Get the nested builder.
605
- # NestedAttributes::Many.builder(attributes, options)
606
- #
607
- # @param [ Metadata ] metadata The relation metadata.
608
- # @param [ Hash ] attributes The attributes to build with.
609
- # @param [ Hash ] options The builder options.
610
- #
611
- # @option options [ true, false ] :allow_destroy Can documents be
612
- # deleted?
613
- # @option options [ Integer ] :limit Max number of documents to
614
- # create at once.
615
- # @option options [ Proc, Symbol ] :reject_if If documents match this
616
- # option then they are ignored.
617
- # @option options [ true, false ] :update_only Only existing documents
618
- # can be modified.
619
- #
620
- # @return [ NestedBuilder ] The nested attributes builder.
621
- #
622
- # @since 2.0.0.rc.1
623
- def nested_builder(metadata, attributes, options)
624
- Builders::NestedAttributes::Many.new(metadata, attributes, options)
625
- end
626
-
627
- # Get the path calculator for the supplied document.
628
- #
629
- # @example Get the path calculator.
630
- # Proxy.path(document)
631
- #
632
- # @param [ Document ] document The document to calculate on.
633
- #
634
- # @return [ Mongoid::Atomic::Paths::Embedded::Many ]
635
- # The embedded many atomic path calculator.
636
- #
637
- # @since 2.1.0
638
- def path(document)
639
- Mongoid::Atomic::Paths::Embedded::Many.new(document)
640
- end
641
-
642
- # Tells the caller if this relation is one that stores the foreign
643
- # key on its own objects.
644
- #
645
- # @example Does this relation store a foreign key?
646
- # Embedded::Many.stores_foreign_key?
647
- #
648
- # @return [ false ] false.
649
- #
650
- # @since 2.0.0.rc.1
651
- def stores_foreign_key?
652
- false
653
- end
654
-
655
- # Get the valid options allowed with this relation.
656
- #
657
- # @example Get the valid options.
658
- # Relation.valid_options
659
- #
660
- # @return [ Array<Symbol> ] The valid options.
661
- #
662
- # @since 2.1.0
663
- def valid_options
664
- VALID_OPTIONS
665
- end
666
-
667
- # Get the default validation setting for the relation. Determines if
668
- # by default a validates associated will occur.
669
- #
670
- # @example Get the validation default.
671
- # Proxy.validation_default
672
- #
673
- # @return [ true, false ] The validation default.
674
- #
675
- # @since 2.1.9
676
- def validation_default
677
- true
678
- end
679
- end
680
- end
681
- end
682
- end
683
- end