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,275 @@
1
+ require 'mongoid/association/referenced/has_many/binding'
2
+ require 'mongoid/association/referenced/has_many/buildable'
3
+ require 'mongoid/association/referenced/has_many/proxy'
4
+ require 'mongoid/association/referenced/has_many/enumerable'
5
+ require 'mongoid/association/referenced/has_many/eager'
6
+
7
+ module Mongoid
8
+ module Association
9
+ module Referenced
10
+
11
+ # The has_many association.
12
+ #
13
+ # @since 7.0
14
+ class HasMany
15
+ include Relatable
16
+ include Buildable
17
+
18
+ # The options available for this type of association, in addition to the
19
+ # common ones.
20
+ #
21
+ # @return [ Array<Symbol> ] The extra valid options.
22
+ #
23
+ # @since 7.0
24
+ ASSOCIATION_OPTIONS = [
25
+ :after_add,
26
+ :after_remove,
27
+ :as,
28
+ :autosave,
29
+ :before_add,
30
+ :before_remove,
31
+ :dependent,
32
+ :foreign_key,
33
+ :order,
34
+ :primary_key
35
+ ].freeze
36
+
37
+ # The complete list of valid options for this association, including
38
+ # the shared ones.
39
+ #
40
+ # @return [ Array<Symbol> ] The valid options.
41
+ #
42
+ # @since 7.0
43
+ VALID_OPTIONS = (ASSOCIATION_OPTIONS + SHARED_OPTIONS).freeze
44
+
45
+ # The default foreign key suffix.
46
+ #
47
+ # @return [ String ] '_id'
48
+ #
49
+ # @since 7.0
50
+ FOREIGN_KEY_SUFFIX = '_id'.freeze
51
+
52
+ # The list of association complements.
53
+ #
54
+ # @return [ Array<Association> ] The association complements.
55
+ #
56
+ # @since 7.0
57
+ def relation_complements
58
+ @relation_complements ||= [ Referenced::BelongsTo ].freeze
59
+ end
60
+
61
+ # Setup the instance methods, fields, etc. on the association owning class.
62
+ #
63
+ # @return [ self ]
64
+ #
65
+ # @since 7.0
66
+ def setup!
67
+ setup_instance_methods!
68
+ self
69
+ end
70
+
71
+ # Setup the instance methods on the class having this association type.
72
+ #
73
+ # @return [ self ]
74
+ #
75
+ # @since 7.0
76
+ def setup_instance_methods!
77
+ define_getter!
78
+ define_ids_getter!
79
+ define_setter!
80
+ define_ids_setter!
81
+ define_existence_check!
82
+ define_autosaver!
83
+ polymorph!
84
+ define_dependency!
85
+ @owner_class.validates_associated(name) if validate?
86
+ self
87
+ end
88
+
89
+
90
+ # Get the foreign key field on the inverse for saving the association reference.
91
+ #
92
+ # @return [ String ] The foreign key field on the inverse for saving the
93
+ # association reference.
94
+ #
95
+ # @since 7.0
96
+ def foreign_key
97
+ @foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
98
+ default_foreign_key_field
99
+ end
100
+
101
+ # Is this association type embedded?
102
+ #
103
+ # @return [ false ] Always false.
104
+ #
105
+ # @since 7.0
106
+ def embedded?; false; end
107
+
108
+ # The default for validation the association object.
109
+ #
110
+ # @return [ true ] Always true.
111
+ #
112
+ # @since 7.0
113
+ def validation_default; true; end
114
+
115
+ # Does this association type store the foreign key?
116
+ #
117
+ # @return [ true ] Always true.
118
+ #
119
+ # @since 7.0
120
+ def stores_foreign_key?; false; end
121
+
122
+ # Get the relation proxy class for this association type.
123
+ #
124
+ # @return [ Association::HasMany::Proxy ] The proxy class.
125
+ #
126
+ # @since 7.0
127
+ def relation
128
+ Proxy
129
+ end
130
+
131
+ # The criteria used for querying this relation.
132
+ #
133
+ # @return [ Mongoid::Criteria ] The criteria used for querying this relation.
134
+ #
135
+ # @since 7.0
136
+ def criteria(base)
137
+ query_criteria(base.send(primary_key), base)
138
+ end
139
+
140
+ # The type of this association if it's polymorphic.
141
+ #
142
+ # @note Only relevant for polymorphic relations.
143
+ #
144
+ # @return [ String, nil ] The type field.
145
+ #
146
+ # @since 7.0
147
+ def type
148
+ @type ||= "#{as}_type" if polymorphic?
149
+ end
150
+
151
+ # Add polymorphic query criteria to a Criteria object, if this association is
152
+ # polymorphic.
153
+ #
154
+ # @param [ Mongoid::Criteria ] criteria The criteria object to add to.
155
+ # @param [ Class ] object_class The object class.
156
+ #
157
+ # @return [ Mongoid::Criteria ] The criteria object.
158
+ #
159
+ # @since 7.0
160
+ def add_polymorphic_criterion(criteria, object_class)
161
+ if polymorphic?
162
+ criteria.where(type => object_class.name)
163
+ else
164
+ criteria
165
+ end
166
+ end
167
+
168
+ # Is this association polymorphic?
169
+ #
170
+ # @return [ true, false ] Whether this association is polymorphic.
171
+ #
172
+ # @since 7.0
173
+ def polymorphic?
174
+ @polymorphic ||= !!as
175
+ end
176
+
177
+ # Whether trying to bind an object using this association should raise
178
+ # an error.
179
+ #
180
+ # @param [ Document ] doc The document to be bound.
181
+ #
182
+ # @return [ true, false ] Whether the document can be bound.
183
+ def bindable?(doc)
184
+ forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
185
+ end
186
+
187
+ # The nested builder object.
188
+ #
189
+ # @param [ Hash ] attributes The attributes to use to build the association object.
190
+ # @param [ Hash ] options The options for the association.
191
+ #
192
+ # @return [ Association::Nested::Many ] The Nested Builder object.
193
+ #
194
+ # @since 7.0
195
+ def nested_builder(attributes, options)
196
+ Nested::Many.new(self, attributes, options)
197
+ end
198
+
199
+ # Get the path calculator for the supplied document.
200
+ #
201
+ # @example Get the path calculator.
202
+ # Proxy.path(document)
203
+ #
204
+ # @param [ Document ] document The document to calculate on.
205
+ #
206
+ # @return [ Root ] The root atomic path calculator.
207
+ #
208
+ # @since 2.1.0
209
+ def path(document)
210
+ Mongoid::Atomic::Paths::Root.new(document)
211
+ end
212
+
213
+ private
214
+
215
+ def default_foreign_key_field
216
+ @default_foreign_key_field ||= "#{inverse}#{FOREIGN_KEY_SUFFIX}"
217
+ end
218
+
219
+ def polymorphic_inverses(other)
220
+ [ as ]
221
+ end
222
+
223
+ def determine_inverses(other)
224
+ matches = (other || relation_class).relations.values.select do |rel|
225
+ relation_complements.include?(rel.class) &&
226
+ rel.relation_class_name == inverse_class_name
227
+
228
+ end
229
+ if matches.size > 1
230
+ return [ default_inverse.name ] if default_inverse
231
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
232
+ end
233
+ matches.collect { |m| m.name } unless matches.blank?
234
+ end
235
+
236
+ def default_primary_key
237
+ PRIMARY_KEY_DEFAULT
238
+ end
239
+
240
+ def query_criteria(object, base)
241
+ crit = klass.where(foreign_key => object)
242
+ crit = with_polymorphic_criterion(crit, base)
243
+ crit.association = self
244
+ crit.parent_document = base
245
+ with_ordering(crit)
246
+ end
247
+
248
+ def with_polymorphic_criterion(criteria, base)
249
+ if polymorphic?
250
+ criteria.where(type => base.class.name)
251
+ else
252
+ criteria
253
+ end
254
+ end
255
+
256
+ def with_ordering(criteria)
257
+ if order
258
+ criteria.order_by(order)
259
+ else
260
+ criteria
261
+ end
262
+ end
263
+
264
+ def with_inverse_field_criterion(criteria)
265
+ inverse_association = inverse_association(klass)
266
+ if inverse_association.try(:inverse_of)
267
+ criteria.any_in(inverse_association.inverse_of => [name, nil])
268
+ else
269
+ criteria
270
+ end
271
+ end
272
+ end
273
+ end
274
+ end
275
+ end
@@ -1,16 +1,19 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
4
- module Bindings
5
- module Referenced
3
+ module Association
4
+ module Referenced
5
+ class HasOne
6
6
 
7
- # Binding class for references_one relations.
8
- class One < Binding
7
+ # Binding class for has_one relations.
8
+ #
9
+ # @since 7.0
10
+ class Binding
11
+ include Bindable
9
12
 
10
13
  # Binds the base object to the inverse of the relation. This is so we
11
14
  # are referenced to the actual objects themselves on both sides.
12
15
  #
13
- # This case sets the metadata on the inverse object as well as the
16
+ # This case sets the association metadata on the inverse object as well as the
14
17
  # document itself.
15
18
  #
16
19
  # @example Bind the document.
@@ -20,7 +23,7 @@ module Mongoid
20
23
  # @since 2.0.0.rc.1
21
24
  def bind_one
22
25
  binding do
23
- bind_from_relational_parent(target)
26
+ bind_from_relational_parent(_target)
24
27
  end
25
28
  end
26
29
 
@@ -34,7 +37,7 @@ module Mongoid
34
37
  # @since 2.0.0.rc.1
35
38
  def unbind_one
36
39
  binding do
37
- unbind_from_relational_parent(target)
40
+ unbind_from_relational_parent(_target)
38
41
  end
39
42
  end
40
43
  end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasOne
6
+
7
+ # The Builder behavior for has_one associations.
8
+ #
9
+ # @since 7.0
10
+ module Buildable
11
+
12
+ # This method either takes an _id or an object and queries for the
13
+ # inverse side using the id or sets the object after clearing the
14
+ # associated object.
15
+ #
16
+ # @return [ Document ] A single document.
17
+ def build(base, object, type = nil)
18
+ if query?(object)
19
+ if !base.new_record?
20
+ execute_query(object, base)
21
+ end
22
+ else
23
+ clear_associated(object)
24
+ object
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def clear_associated(object)
31
+ if object && (associated = object.send(inverse))
32
+ associated.substitute(nil)
33
+ end
34
+ end
35
+
36
+ def query_criteria(object, base)
37
+ crit = klass.where(foreign_key => object)
38
+ with_polymorphic_criterion(crit, base)
39
+ end
40
+
41
+ def execute_query(object, base)
42
+ query_criteria(object, base).limit(-1).first(id_sort: :none)
43
+ end
44
+
45
+ def with_polymorphic_criterion(criteria, base)
46
+ if polymorphic?
47
+ criteria.where(type => base.class.name)
48
+ else
49
+ criteria
50
+ end
51
+ end
52
+
53
+ def query?(object)
54
+ object && !object.is_a?(Mongoid::Document)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+
6
+ class HasOne
7
+
8
+ class Eager < Association::Referenced::Eager::Base
9
+
10
+ private
11
+
12
+ def preload
13
+ @docs.each do |d|
14
+ set_relation(d, nil)
15
+ end
16
+
17
+ each_loaded_document do |doc|
18
+ id = doc.send(key)
19
+ set_on_parent(id, doc)
20
+ end
21
+ end
22
+
23
+ def group_by_key
24
+ @association.primary_key
25
+ end
26
+
27
+ def key
28
+ @association.foreign_key
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
4
- module Builders
3
+ module Association
4
+ module Referenced
5
5
  module NestedAttributes
6
6
  class One < NestedBuilder
7
7
 
@@ -24,14 +24,14 @@ module Mongoid
24
24
  # @since 2.0.0
25
25
  def build(parent)
26
26
  return if reject?(parent, attributes)
27
- @existing = parent.send(metadata.name)
27
+ @existing = parent.send(association.name)
28
28
  if update?
29
29
  attributes.delete_id
30
30
  existing.assign_attributes(attributes)
31
31
  elsif replace?
32
- parent.send(metadata.setter, Factory.build(metadata.klass, attributes))
32
+ parent.send(association.setter, Factory.build(association.klass, attributes))
33
33
  elsif delete?
34
- parent.send(metadata.setter, nil)
34
+ parent.send(association.setter, nil)
35
35
  end
36
36
  end
37
37
 
@@ -39,16 +39,16 @@ module Mongoid
39
39
  # relations.
40
40
  #
41
41
  # @example Instantiate the builder.
42
- # One.new(metadata, attributes)
42
+ # One.new(association, attributes)
43
43
  #
44
- # @param [ Metadata ] metadata The relation metadata.
44
+ # @param [ Association ] association The association metadata.
45
45
  # @param [ Hash ] attributes The attributes hash to attempt to set.
46
46
  # @param [ Hash ] options The options defined.
47
47
  #
48
48
  # @since 2.0.0
49
- def initialize(metadata, attributes, options)
49
+ def initialize(association, attributes, options)
50
50
  @attributes = attributes.with_indifferent_access
51
- @metadata = metadata
51
+ @association = association
52
52
  @options = options
53
53
  @destroy = @attributes.delete(:_destroy)
54
54
  end
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class HasOne
6
+
7
+ # This class defines the behaviour for all relations that are a
8
+ # one-to-one between documents in different collections.
9
+ class Proxy < Association::One
10
+
11
+ # Instantiate a new references_one relation. Will set the foreign key
12
+ # and the base on the inverse object.
13
+ #
14
+ # @example Create the new relation.
15
+ # Referenced::One.new(base, target, association)
16
+ #
17
+ # @param [ Document ] base The document this relation hangs off of.
18
+ # @param [ Document ] target The target (child) of the relation.
19
+ # @param [ Association ] association The association metadata.
20
+ def initialize(base, target, association)
21
+ init(base, target, association) do
22
+ raise_mixed if klass.embedded? && !klass.cyclic?
23
+ characterize_one(_target)
24
+ bind_one
25
+ _target.save if persistable?
26
+ end
27
+ end
28
+
29
+ # Removes the association between the base document and the target
30
+ # document by deleting the foreign key and the reference, orphaning
31
+ # the target document in the process.
32
+ #
33
+ # @example Nullify the relation.
34
+ # person.game.nullify
35
+ #
36
+ # @since 2.0.0.rc.1
37
+ def nullify
38
+ unbind_one
39
+ _target.save
40
+ end
41
+
42
+ # Substitutes the supplied target document for the existing document
43
+ # in the relation. If the new target is nil, perform the necessary
44
+ # deletion.
45
+ #
46
+ # @example Replace the relation.
47
+ # person.game.substitute(new_game)
48
+ #
49
+ # @param [ Array<Document> ] replacement The replacement target.
50
+ #
51
+ # @return [ One ] The relation.
52
+ #
53
+ # @since 2.0.0.rc.1
54
+ def substitute(replacement)
55
+ unbind_one
56
+ if persistable?
57
+ if _association.destructive?
58
+ send(_association.dependent)
59
+ else
60
+ save if persisted?
61
+ end
62
+ end
63
+ HasOne::Proxy.new(_base, replacement, _association) if replacement
64
+ end
65
+
66
+ private
67
+
68
+ # Instantiate the binding associated with this relation.
69
+ #
70
+ # @example Get the binding.
71
+ # relation.binding([ address ])
72
+ #
73
+ # @return [ Binding ] The binding object.
74
+ def binding
75
+ HasOne::Binding.new(_base, _target, _association)
76
+ end
77
+
78
+ # Are we able to persist this relation?
79
+ #
80
+ # @example Can we persist the relation?
81
+ # relation.persistable?
82
+ #
83
+ # @return [ true, false ] If the relation is persistable.
84
+ #
85
+ # @since 2.1.0
86
+ def persistable?
87
+ _base.persisted? && !_binding? && !_building?
88
+ end
89
+
90
+ class << self
91
+
92
+ def eager_loader(association, docs)
93
+ Eager.new(association, docs)
94
+ end
95
+
96
+ # Returns true if the relation is an embedded one. In this case
97
+ # always false.
98
+ #
99
+ # @example Is this relation embedded?
100
+ # Referenced::One.embedded?
101
+ #
102
+ # @return [ false ] Always false.
103
+ #
104
+ # @since 2.0.0.rc.1
105
+ def embedded?
106
+ false
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end