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,87 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # Binding class for belongs_to associations.
8
+ class Binding
9
+ include Bindable
10
+
11
+ # Binds the base object to the inverse of the relation. This is so we
12
+ # are referenced to the actual objects themselves on both sides.
13
+ #
14
+ # This case sets the association on the inverse object as well as the
15
+ # document itself.
16
+ #
17
+ # @example Bind the documents.
18
+ # game.person.bind(:continue => true)
19
+ # game.person = Person.new
20
+ #
21
+ # @since 2.0.0.rc.1
22
+ def bind_one
23
+ binding do
24
+ check_polymorphic_inverses!(_target)
25
+ bind_foreign_key(_base, record_id(_target))
26
+ bind_polymorphic_inverse_type(_base, _target.class.name)
27
+ if inverse = _association.inverse(_target)
28
+ if set_base_association
29
+ if _base.referenced_many?
30
+ _target.__send__(inverse).push(_base)
31
+ else
32
+ _target.set_relation(inverse, _base)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ # Unbinds the base object and the inverse, caused by setting the
40
+ # reference to nil.
41
+ #
42
+ # @example Unbind the document.
43
+ # game.person.unbind(:continue => true)
44
+ # game.person = nil
45
+ #
46
+ # @since 2.0.0.rc.1
47
+ def unbind_one
48
+ binding do
49
+ inverse = _association.inverse(_target)
50
+ bind_foreign_key(_base, nil)
51
+ bind_polymorphic_inverse_type(_base, nil)
52
+ if inverse
53
+ set_base_association
54
+ if _base.referenced_many?
55
+ _target.__send__(inverse).delete(_base)
56
+ else
57
+ _target.set_relation(inverse, nil)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ # Check for problems with multiple inverse definitions.
66
+ #
67
+ # @api private
68
+ #
69
+ # @example Check for inverses errors.
70
+ # binding.check_inverses!(doc)
71
+ #
72
+ # @param [ Document ] doc The document to check.
73
+ #
74
+ # @since 3.0.0
75
+ def check_polymorphic_inverses!(doc)
76
+ inverses = _association.inverses(doc)
77
+ if inverses.count > 1 && _base.send(_association.foreign_key).nil?
78
+ raise Errors::InvalidSetPolymorphicRelation.new(
79
+ _association.name, _base.class.name, _target.class.name
80
+ )
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # The Builder behavior for belongs_to 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.
14
+ #
15
+ # @example Build the document.
16
+ # relation.build(meta, attrs)
17
+ #
18
+ # @param [ Object ] base The base object.
19
+ # @param [ Object ] object The object to use to build the relation.
20
+ # @param [ String ] type The type of the relation.
21
+ #
22
+ # @return [ Document ] A single document.
23
+ def build(base, object, type = nil)
24
+ return object unless query?(object)
25
+ execute_query(object, type)
26
+ end
27
+
28
+ private
29
+
30
+ def execute_query(object, type)
31
+ query_criteria(object, type).limit(-1).first(id_sort: :none)
32
+ end
33
+
34
+ def query_criteria(object, type)
35
+ model = type ? type.constantize : relation_class
36
+ model.where(primary_key => object)
37
+ end
38
+
39
+ def query?(object)
40
+ object && !object.is_a?(Mongoid::Document)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # Eager class for belongs_to associations.
8
+ class Eager < Association::Referenced::Eager::Base
9
+
10
+ private
11
+
12
+ def preload
13
+ raise Errors::EagerLoad.new(@association.name) if @association.polymorphic?
14
+
15
+ @docs.each do |d|
16
+ set_relation(d, nil)
17
+ end
18
+
19
+ each_loaded_document do |doc|
20
+ id = doc.send(key)
21
+ set_on_parent(id, doc)
22
+ end
23
+ end
24
+
25
+ def group_by_key
26
+ @association.foreign_key
27
+ end
28
+
29
+ def key
30
+ @association.primary_key
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,136 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+ module Referenced
5
+ class BelongsTo
6
+
7
+ # This class handles all behaviour for relations that are either
8
+ # one-to-many or one-to-one, where the foreign key is stored on this side
9
+ # of the relation and the reference is to document(s) in another
10
+ # collection.
11
+ class Proxy < Association::One
12
+ include Evolvable
13
+
14
+ # Instantiate a new belongs_to association proxy.
15
+ #
16
+ # @example Create the new proxy.
17
+ # Association::BelongsTo::Proxy.new(game, person, association)
18
+ #
19
+ # @param [ Document ] base The document this relation hangs off of.
20
+ # @param [ Document, Array<Document> ] target The target (parent) of the
21
+ # relation.
22
+ # @param [ Association ] association The association object.
23
+ def initialize(base, target, association)
24
+ init(base, target, association) do
25
+ characterize_one(_target)
26
+ bind_one
27
+ end
28
+ end
29
+
30
+ # Removes the association between the base document and the target
31
+ # document by deleting the foreign key and the reference, orphaning
32
+ # the target document in the process.
33
+ #
34
+ # @example Nullify the relation.
35
+ # person.game.nullify
36
+ #
37
+ def nullify
38
+ unbind_one
39
+ _target.save
40
+ end
41
+
42
+ # Substitutes the supplied target documents for the existing document
43
+ # in the relation.
44
+ #
45
+ # @example Substitute the relation.
46
+ # name.substitute(new_name)
47
+ #
48
+ # @param [ Document, Array<Document> ] replacement The replacement.
49
+ #
50
+ # @return [ self, nil ] The relation or nil.
51
+ #
52
+ # @since 2.0.0.rc.1
53
+ def substitute(replacement)
54
+ unbind_one
55
+ if replacement
56
+ self._target = normalize(replacement)
57
+ bind_one
58
+ self
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ # Instantiate the binding associated with this relation.
65
+ #
66
+ # @example Get the binding object.
67
+ # binding([ address ])
68
+ #
69
+ # @return [ Binding ] The binding object.
70
+ #
71
+ # @since 2.0.0.rc.1
72
+ def binding
73
+ BelongsTo::Binding.new(_base, _target, _association)
74
+ end
75
+
76
+ # Normalize the value provided as a replacement for substitution.
77
+ #
78
+ # @api private
79
+ #
80
+ # @example Normalize the substitute.
81
+ # proxy.normalize(id)
82
+ #
83
+ # @param [ Document, Object ] replacement The replacement object.
84
+ #
85
+ # @return [ Document ] The document.
86
+ #
87
+ # @since 3.1.5
88
+ def normalize(replacement)
89
+ return replacement if replacement.is_a?(Document)
90
+ _association.build(klass, replacement)
91
+ end
92
+
93
+ # Are we able to persist this relation?
94
+ #
95
+ # @example Can we persist the relation?
96
+ # relation.persistable?
97
+ #
98
+ # @return [ true, false ] If the relation is persistable.
99
+ #
100
+ # @since 2.1.0
101
+ def persistable?
102
+ _target.persisted? && !_binding? && !_building?
103
+ end
104
+
105
+ class << self
106
+
107
+ # Get the Eager object for this type of association.
108
+ #
109
+ # @example Get the eager loader object
110
+ #
111
+ # @param [ Association ] association The association object.
112
+ # @param [ Array<Document> ] docs The array of documents.
113
+ #
114
+ # @since 7.0
115
+ def eager_loader(association, docs)
116
+ Eager.new(association, docs)
117
+ end
118
+
119
+ # Returns true if the relation is an embedded one. In this case
120
+ # always false.
121
+ #
122
+ # @example Is this relation embedded?
123
+ # Association::BelongsTo::Proxy.embedded?
124
+ #
125
+ # @return [ false ] Always false.
126
+ #
127
+ # @since 2.0.0.rc.1
128
+ def embedded?
129
+ false
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,248 @@
1
+ require 'mongoid/association/referenced/belongs_to/binding'
2
+ require 'mongoid/association/referenced/belongs_to/buildable'
3
+ require 'mongoid/association/referenced/belongs_to/proxy'
4
+ require 'mongoid/association/referenced/belongs_to/eager'
5
+
6
+ module Mongoid
7
+ module Association
8
+ module Referenced
9
+
10
+ # The BelongsTo type association.
11
+ #
12
+ # @since 7.0
13
+ class BelongsTo
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
+ :autobuild,
25
+ :autosave,
26
+ :counter_cache,
27
+ :dependent,
28
+ :foreign_key,
29
+ :index,
30
+ :polymorphic,
31
+ :primary_key,
32
+ :touch,
33
+ :optional,
34
+ :required
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 type of the field holding the foreign key.
46
+ #
47
+ # @return [ Object ]
48
+ #
49
+ # @since 7.0
50
+ FOREIGN_KEY_FIELD_TYPE = Object
51
+
52
+ # The default foreign key suffix.
53
+ #
54
+ # @return [ String ] '_id'
55
+ #
56
+ # @since 7.0
57
+ FOREIGN_KEY_SUFFIX = '_id'.freeze
58
+
59
+ # The list of association complements.
60
+ #
61
+ # @return [ Array<Association> ] The association complements.
62
+ #
63
+ # @since 7.0
64
+ def relation_complements
65
+ @relation_complements ||= [ HasMany, HasOne ].freeze
66
+ end
67
+
68
+ # Setup the instance methods, fields, etc. on the association owning class.
69
+ #
70
+ # @return [ self ]
71
+ #
72
+ # @since 7.0
73
+ def setup!
74
+ setup_instance_methods!
75
+ @owner_class.aliased_fields[name.to_s] = foreign_key
76
+ self
77
+ end
78
+
79
+ # Does this association type store the foreign key?
80
+ #
81
+ # @return [ true ] Always true.
82
+ #
83
+ # @since 7.0
84
+ def stores_foreign_key?; true; end
85
+
86
+ # Is this association type embedded?
87
+ #
88
+ # @return [ false ] Always false.
89
+ #
90
+ # @since 7.0
91
+ def embedded?; false; end
92
+
93
+ # The default for validation the association object.
94
+ #
95
+ # @return [ false ] Always false.
96
+ #
97
+ # @since 7.0
98
+ def validation_default; false; end
99
+
100
+ # Get the foreign key field for saving the association reference.
101
+ #
102
+ # @return [ String ] The foreign key field for saving the association reference.
103
+ #
104
+ # @since 7.0
105
+ def foreign_key
106
+ @foreign_key ||= @options[:foreign_key] ? @options[:foreign_key].to_s :
107
+ default_foreign_key_field
108
+ end
109
+
110
+ # Get the relation proxy class for this association type.
111
+ #
112
+ # @return [ Association::BelongsTo::Proxy ] The proxy class.
113
+ #
114
+ # @since 7.0
115
+ def relation
116
+ Proxy
117
+ end
118
+
119
+ # Is this association polymorphic?
120
+ #
121
+ # @return [ true, false ] Whether this association is polymorphic.
122
+ #
123
+ # @since 7.0
124
+ def polymorphic?
125
+ @polymorphic ||= !!@options[:polymorphic]
126
+ end
127
+
128
+ # The name of the field used to store the type of polymorphic relation.
129
+ #
130
+ # @return [ String ] The field used to store the type of polymorphic relation.
131
+ #
132
+ # @since 7.0
133
+ def inverse_type
134
+ (@inverse_type ||= "#{name}_type") if polymorphic?
135
+ end
136
+
137
+ # The nested builder object.
138
+ #
139
+ # @param [ Hash ] attributes The attributes to use to build the association object.
140
+ # @param [ Hash ] options The options for the association.
141
+ #
142
+ # @return [ Association::Nested::One ] The Nested Builder object.
143
+ #
144
+ # @since 7.0
145
+ def nested_builder(attributes, options)
146
+ Nested::One.new(self, attributes, options)
147
+ end
148
+
149
+ # Get the path calculator for the supplied document.
150
+ #
151
+ # @example Get the path calculator.
152
+ # association.path(document)
153
+ #
154
+ # @param [ Document ] document The document to calculate on.
155
+ #
156
+ # @return [ Root ] The root atomic path calculator.
157
+ #
158
+ # @since 2.1.0
159
+ def path(document)
160
+ Mongoid::Atomic::Paths::Root.new(document)
161
+ end
162
+
163
+ private
164
+
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
+ define_counter_cache_callbacks!
173
+ polymorph!
174
+ define_dependency!
175
+ create_foreign_key_field!
176
+ setup_index!
177
+ define_touchable!
178
+ @owner_class.validates_associated(name) if validate?
179
+ @owner_class.validates(name, presence: true) if require_association?
180
+ end
181
+
182
+ def index_spec
183
+ if polymorphic?
184
+ { key => 1, inverse_type => 1 }
185
+ else
186
+ { key => 1 }
187
+ end
188
+ end
189
+
190
+ def default_primary_key
191
+ PRIMARY_KEY_DEFAULT
192
+ end
193
+
194
+ def default_foreign_key_field
195
+ @default_foreign_key_field ||= "#{name}#{FOREIGN_KEY_SUFFIX}"
196
+ end
197
+
198
+ def polymorph!
199
+ if polymorphic?
200
+ @owner_class.polymorphic = true
201
+ @owner_class.field(inverse_type, type: String)
202
+ end
203
+ end
204
+
205
+ def polymorphic_inverses(other = nil)
206
+ if other
207
+ matches = other.relations.values.select do |rel|
208
+ relation_complements.include?(rel.class) &&
209
+ rel.as == name &&
210
+ rel.relation_class_name == inverse_class_name
211
+ end
212
+ matches.collect { |m| m.name }
213
+ end
214
+ end
215
+
216
+ def determine_inverses(other)
217
+ matches = (other || relation_class).relations.values.select do |rel|
218
+ relation_complements.include?(rel.class) &&
219
+ rel.relation_class_name == inverse_class_name
220
+
221
+ end
222
+ if matches.size > 1
223
+ raise Errors::AmbiguousRelationship.new(relation_class, @owner_class, name, matches)
224
+ end
225
+ matches.collect { |m| m.name }
226
+ end
227
+
228
+ # If set to true, then the associated object will be validated when this object is saved
229
+ def require_association?
230
+ required = @options[:required] if @options.key?(:required)
231
+ required = !@options[:optional] if @options.key?(:optional) && required.nil?
232
+ required.nil? ? Mongoid.belongs_to_required_by_default : required
233
+ end
234
+
235
+ def create_foreign_key_field!
236
+ @owner_class.field(
237
+ foreign_key,
238
+ type: FOREIGN_KEY_FIELD_TYPE,
239
+ identity: true,
240
+ overwrite: true,
241
+ association: self,
242
+ default: nil
243
+ )
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end