mongoid 6.4.2 → 7.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -0,0 +1,204 @@
1
+ require 'mongoid/association/referenced/has_one/binding'
2
+ require 'mongoid/association/referenced/has_one/buildable'
3
+ require 'mongoid/association/referenced/has_one/proxy'
4
+ require 'mongoid/association/referenced/has_one/eager'
5
+
6
+ module Mongoid
7
+ module Association
8
+ module Referenced
9
+
10
+ # The has_one association.
11
+ #
12
+ # @since 7.0
13
+ class HasOne
14
+ include Relatable
15
+ include Buildable
16
+
17
+ # The options available for this type of association, in addition to the
18
+ # common ones.
19
+ #
20
+ # @return [ Array<Symbol> ] The extra valid options.
21
+ #
22
+ # @since 7.0
23
+ ASSOCIATION_OPTIONS = [
24
+ :as,
25
+ :autobuild,
26
+ :autosave,
27
+ :dependent,
28
+ :foreign_key,
29
+ :primary_key
30
+ ].freeze
31
+
32
+ # The complete list of valid options for this association, including
33
+ # the shared ones.
34
+ #
35
+ # @return [ Array<Symbol> ] The valid options.
36
+ #
37
+ # @since 7.0
38
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
39
+
40
+ # The default foreign key suffix.
41
+ #
42
+ # @return [ String ] '_id'
43
+ #
44
+ # @since 7.0
45
+ FOREIGN_KEY_SUFFIX = '_id'.freeze
46
+
47
+ # The list of association complements.
48
+ #
49
+ # @return [ Array<Association> ] The association complements.
50
+ #
51
+ # @since 7.0
52
+ def relation_complements
53
+ @relation_complements ||= [ Referenced::BelongsTo ].freeze
54
+ end
55
+
56
+ # Setup the instance methods, fields, etc. on the association owning class.
57
+ #
58
+ # @return [ self ]
59
+ #
60
+ # @since 7.0
61
+ def setup!
62
+ setup_instance_methods!
63
+ self
64
+ end
65
+
66
+ # Get the foreign key field for saving the association reference.
67
+ #
68
+ # @return [ String ] The foreign key field for saving the
69
+ # association reference.
70
+ #
71
+ # @since 7.0
72
+ def foreign_key
73
+ @foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
74
+ default_foreign_key_field
75
+ end
76
+
77
+ # Is this association type embedded?
78
+ #
79
+ # @return [ false ] Always false.
80
+ #
81
+ # @since 7.0
82
+ def embedded?; false; end
83
+
84
+ # The default for validation the association object.
85
+ #
86
+ # @return [ true ] Always true.
87
+ #
88
+ # @since 7.0
89
+ def validation_default; true; end
90
+
91
+ # Get the relation proxy class for this association type.
92
+ #
93
+ # @return [ Association::HasOne::Proxy ] The proxy class.
94
+ #
95
+ # @since 7.0
96
+ def relation
97
+ Proxy
98
+ end
99
+
100
+ # The nested builder object.
101
+ #
102
+ # @param [ Hash ] attributes The attributes to use to build the association object.
103
+ # @param [ Hash ] options The options for the association.
104
+ #
105
+ # @return [ Association::Nested::Many ] The Nested Builder object.
106
+ #
107
+ # @since 7.0
108
+ def nested_builder(attributes, options)
109
+ Nested::One.new(self, attributes, options)
110
+ end
111
+
112
+ # Is this association polymorphic?
113
+ #
114
+ # @return [ true, false ] Whether this association is polymorphic.
115
+ #
116
+ # @since 7.0
117
+ def polymorphic?
118
+ @polymorphic ||= !!as
119
+ end
120
+
121
+ # The type of this association if it's polymorphic.
122
+ #
123
+ # @note Only relevant for polymorphic relations.
124
+ #
125
+ # @return [ String, nil ] The type field.
126
+ #
127
+ # @since 7.0
128
+ def type
129
+ @type ||= "#{as}_type" if polymorphic?
130
+ end
131
+
132
+ # Whether trying to bind an object using this association should raise
133
+ # an error.
134
+ #
135
+ # @param [ Document ] doc The document to be bound.
136
+ #
137
+ # @return [ true, false ] Whether the document can be bound.
138
+ def bindable?(doc)
139
+ forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
140
+ end
141
+
142
+ def stores_foreign_key?; false; end
143
+
144
+ # Get the path calculator for the supplied document.
145
+ #
146
+ # @example Get the path calculator.
147
+ # Proxy.path(document)
148
+ #
149
+ # @param [ Document ] document The document to calculate on.
150
+ #
151
+ # @return [ Root ] The root atomic path calculator.
152
+ #
153
+ # @since 2.1.0
154
+ def path(document)
155
+ Mongoid::Atomic::Paths::Root.new(document)
156
+ end
157
+
158
+ private
159
+
160
+ # Setup the instance methods on the class having this association type.
161
+ #
162
+ # @return [ self ]
163
+ #
164
+ # @since 7.0
165
+ def setup_instance_methods!
166
+ define_getter!
167
+ define_setter!
168
+ define_existence_check!
169
+ define_builder!
170
+ define_creator!
171
+ define_autosaver!
172
+ polymorph!
173
+ define_dependency!
174
+ @owner_class.validates_associated(name) if validate?
175
+ self
176
+ end
177
+
178
+ def default_foreign_key_field
179
+ @default_foreign_key_field ||= "#{inverse}#{FOREIGN_KEY_SUFFIX}"
180
+ end
181
+
182
+ def polymorphic_inverses(other)
183
+ [ as ]
184
+ end
185
+
186
+ def determine_inverses(other)
187
+ matches = (other || relation_class).relations.values.select do |rel|
188
+ relation_complements.include?(rel.class) &&
189
+ rel.relation_class_name == inverse_class_name
190
+
191
+ end
192
+ if matches.size > 1
193
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
194
+ end
195
+ matches.collect { |m| m.name } unless matches.blank?
196
+ end
197
+
198
+ def default_primary_key
199
+ PRIMARY_KEY_DEFAULT
200
+ end
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,170 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+
6
+ # This module handles the behaviour for synchronizing foreign keys between
7
+ # both sides of a many to many relations.
8
+ module Syncable
9
+
10
+ # Is the document able to be synced on the inverse side? This is only if
11
+ # the key has changed and the relation bindings have not been run.
12
+ #
13
+ # @example Are the foreign keys syncable?
14
+ # document._syncable?(association)
15
+ #
16
+ # @param [ Association ] association The association metadata.
17
+ #
18
+ # @return [ true, false ] If we can sync.
19
+ #
20
+ # @since 2.1.0
21
+ def _syncable?(association)
22
+ !_synced?(association.foreign_key) && send(association.foreign_key_check)
23
+ end
24
+
25
+ # Get the synced foreign keys.
26
+ #
27
+ # @example Get the synced foreign keys.
28
+ # document._synced
29
+ #
30
+ # @return [ Hash ] The synced foreign keys.
31
+ #
32
+ # @since 2.1.0
33
+ def _synced
34
+ @_synced ||= {}
35
+ end
36
+
37
+ # Has the document been synced for the foreign key?
38
+ #
39
+ # @example Has the document been synced?
40
+ # document._synced?
41
+ #
42
+ # @param [ String ] foreign_key The foreign key.
43
+ #
44
+ # @return [ true, false ] If we can sync.
45
+ #
46
+ # @since 2.1.0
47
+ def _synced?(foreign_key)
48
+ !!_synced[foreign_key]
49
+ end
50
+
51
+ # Update the inverse keys on destroy.
52
+ #
53
+ # @example Update the inverse keys.
54
+ # document.remove_inverse_keys(association)
55
+ #
56
+ # @param [ Association ] association The association.
57
+ #
58
+ # @return [ Object ] The updated values.
59
+ #
60
+ # @since 2.2.1
61
+ def remove_inverse_keys(association)
62
+ foreign_keys = send(association.foreign_key)
63
+ unless foreign_keys.nil? || foreign_keys.empty?
64
+ association.criteria(self, foreign_keys).pull(association.inverse_foreign_key => _id)
65
+ end
66
+ end
67
+
68
+ # Update the inverse keys for the relation.
69
+ #
70
+ # @example Update the inverse keys
71
+ # document.update_inverse_keys(association)
72
+ #
73
+ # @param [ Association ] association The document association.
74
+ #
75
+ # @return [ Object ] The updated values.
76
+ #
77
+ # @since 2.1.0
78
+ def update_inverse_keys(association)
79
+ if changes.has_key?(association.foreign_key)
80
+ old, new = changes[association.foreign_key]
81
+ adds, subs = new - (old || []), (old || []) - new
82
+
83
+ # If we are autosaving we don't want a duplicate to get added - the
84
+ # $addToSet would run previously and then the $push and $each from the
85
+ # inverse on the autosave would cause this. We delete each id from
86
+ # what's in memory in case a mix of id addition and object addition
87
+ # had occurred.
88
+ if association.autosave?
89
+ send(association.name).in_memory.each do |doc|
90
+ adds.delete_one(doc._id)
91
+ end
92
+ end
93
+
94
+ unless adds.empty?
95
+ association.criteria(self, adds).without_options.add_to_set(association.inverse_foreign_key => _id)
96
+ end
97
+ unless subs.empty?
98
+ association.criteria(self, subs).without_options.pull(association.inverse_foreign_key => _id)
99
+ end
100
+ end
101
+ end
102
+
103
+ module ClassMethods
104
+
105
+ # Set up the syncing of many to many foreign keys.
106
+ #
107
+ # @example Set up the syncing.
108
+ # Person._synced(association)
109
+ #
110
+ # @param [ Association ] association The association metadata.
111
+ #
112
+ # @since 2.1.0
113
+ def _synced(association)
114
+ unless association.forced_nil_inverse?
115
+ synced_save(association)
116
+ synced_destroy(association)
117
+ end
118
+ end
119
+
120
+ private
121
+
122
+ # Set up the sync of inverse keys that needs to happen on a save.
123
+ #
124
+ # If the foreign key field has changed and the document is not
125
+ # synced, $addToSet the new ids, $pull the ones no longer in the
126
+ # array from the inverse side.
127
+ #
128
+ # @example Set up the save syncing.
129
+ # Person.synced_save(association)
130
+ #
131
+ # @param [ Association ] association The relation association.
132
+ #
133
+ # @return [ Class ] The class getting set up.
134
+ #
135
+ # @since 2.1.0
136
+ def synced_save(association)
137
+ set_callback(
138
+ :save,
139
+ :after,
140
+ if: ->(doc) { doc._syncable?(association) }
141
+ ) do |doc|
142
+ doc.update_inverse_keys(association)
143
+ end
144
+ self
145
+ end
146
+
147
+ # Set up the sync of inverse keys that needs to happen on a destroy.
148
+ #
149
+ # @example Set up the destroy syncing.
150
+ # Person.synced_destroy(association)
151
+ #
152
+ # @param [ Association ] association The association metadata.
153
+ #
154
+ # @return [ Class ] The class getting set up.
155
+ #
156
+ # @since 2.2.1
157
+ def synced_destroy(association)
158
+ set_callback(
159
+ :destroy,
160
+ :after
161
+ ) do |doc|
162
+ doc.remove_inverse_keys(association)
163
+ end
164
+ self
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,7 @@
1
+ require 'mongoid/association/referenced/auto_save'
2
+ require 'mongoid/association/referenced/counter_cache'
3
+ require 'mongoid/association/referenced/syncable'
4
+ require 'mongoid/association/referenced/belongs_to'
5
+ require 'mongoid/association/referenced/has_many'
6
+ require 'mongoid/association/referenced/has_and_belongs_to_many'
7
+ require 'mongoid/association/referenced/has_one'
@@ -1,62 +1,66 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # The reflections module provides convenience methods that can retrieve
6
6
  # useful information about associations.
7
7
  module Reflections
8
8
  extend ActiveSupport::Concern
9
9
 
10
- # Returns the relation metadata for the supplied name.
10
+ # Returns the association metadata for the supplied name.
11
11
  #
12
- # @example Find relation metadata by name.
12
+ # @example Find relation association by name.
13
13
  # person.reflect_on_association(:addresses)
14
14
  #
15
15
  # @param [ String, Symbol ] name The name of the relation to find.
16
16
  #
17
- # @return [ Metadata ] The matching relation metadata.
17
+ # @return [ Association ] The matching association metadata.
18
18
  def reflect_on_association(name)
19
19
  self.class.reflect_on_association(name)
20
20
  end
21
21
 
22
- # Returns all relation metadata for the supplied macros.
22
+ # Returns all association metadata for the supplied macros.
23
23
  #
24
- # @example Find multiple relation metadata by macro.
24
+ # @example Find multiple association metadata by macro.
25
25
  # person.reflect_on_all_associations(:embeds_many)
26
26
  #
27
27
  # @param [ Array<Symbol> ] macros The relation macros.
28
28
  #
29
- # @return [ Array<Metadata> ] The matching relation metadata.
30
- def reflect_on_all_associations(*macros)
29
+ # @return [ Array<Association> ] The matching association metadata.
30
+ def reflect_on_all_association(*macros)
31
31
  self.class.reflect_on_all_associations(*macros)
32
32
  end
33
33
 
34
34
  module ClassMethods
35
35
 
36
- # Returns the relation metadata for the supplied name.
36
+ # Returns the association metadata for the supplied name.
37
37
  #
38
- # @example Find relation metadata by name.
38
+ # @example Find association metadata by name.
39
39
  # Person.reflect_on_association(:addresses)
40
40
  #
41
41
  # @param [ String, Symbol ] name The name of the relation to find.
42
42
  #
43
- # @return [ Metadata ] The matching relation metadata.
43
+ # @return [ Association ] The matching association metadata.
44
44
  def reflect_on_association(name)
45
45
  relations[name.to_s]
46
46
  end
47
47
 
48
- # Returns all relation metadata for the supplied macros.
48
+ # Returns all association metadata for the supplied macros.
49
49
  #
50
- # @example Find multiple relation metadata by macro.
50
+ # @example Find multiple association metadata by macro.
51
51
  # Person.reflect_on_all_associations(:embeds_many)
52
52
  #
53
53
  # @param [ Array<Symbol> ] macros The relation macros.
54
54
  #
55
- # @return [ Array<Metadata> ] The matching relation metadata.
55
+ # @return [ Array<Association> ] The matching association metadata.
56
56
  def reflect_on_all_associations(*macros)
57
- association_reflections = relations.values
58
- association_reflections.select! { |reflection| macros.include?(reflection.macro) } unless macros.empty?
59
- association_reflections
57
+ all_associations = relations.values
58
+ unless macros.empty?
59
+ all_associations.select! do |reflection|
60
+ macros.include?(Association::MACRO_MAPPING.key(reflection.class))
61
+ end
62
+ end
63
+ all_associations
60
64
  end
61
65
  end
62
66
  end