mongoid 6.4.8 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +0 -26
  4. data/lib/config/locales/en.yml +17 -0
  5. data/lib/mongoid/association/accessors.rb +339 -0
  6. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  7. data/lib/mongoid/association/builders.rb +92 -0
  8. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  9. data/lib/mongoid/association/depending.rb +116 -0
  10. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  11. data/lib/mongoid/{relations → association}/embedded/batchable.rb +21 -21
  12. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  14. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  16. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  17. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  18. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  20. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  21. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  22. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  24. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  25. data/lib/mongoid/association/embedded.rb +4 -0
  26. data/lib/mongoid/association/macros.rb +204 -0
  27. data/lib/mongoid/{relations → association}/many.rb +20 -50
  28. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  29. data/lib/mongoid/association/nested/many.rb +200 -0
  30. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  31. data/lib/mongoid/association/nested/one.rb +127 -0
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/{relations → association}/one.rb +6 -6
  34. data/lib/mongoid/association/options.rb +152 -0
  35. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  36. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  37. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  38. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  39. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  40. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  43. data/lib/mongoid/association/referenced/eager.rb +159 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  50. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  51. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  52. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  53. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  54. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  55. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  56. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  57. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  58. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  59. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  60. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  61. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  62. data/lib/mongoid/association/referenced.rb +7 -0
  63. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  64. data/lib/mongoid/association/relatable.rb +415 -0
  65. data/lib/mongoid/association/touchable.rb +97 -0
  66. data/lib/mongoid/association.rb +150 -0
  67. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  68. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  69. data/lib/mongoid/atomic.rb +4 -4
  70. data/lib/mongoid/attributes/dynamic.rb +2 -2
  71. data/lib/mongoid/attributes/nested.rb +10 -10
  72. data/lib/mongoid/attributes/processing.rb +2 -2
  73. data/lib/mongoid/attributes/readonly.rb +2 -4
  74. data/lib/mongoid/attributes.rb +22 -13
  75. data/lib/mongoid/changeable.rb +1 -1
  76. data/lib/mongoid/clients/options.rb +1 -1
  77. data/lib/mongoid/clients/sessions.rb +2 -2
  78. data/lib/mongoid/composable.rb +4 -4
  79. data/lib/mongoid/config.rb +1 -0
  80. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  81. data/lib/mongoid/contextual/atomic.rb +1 -1
  82. data/lib/mongoid/contextual/geo_near.rb +1 -1
  83. data/lib/mongoid/contextual/map_reduce.rb +4 -4
  84. data/lib/mongoid/contextual/memory.rb +25 -7
  85. data/lib/mongoid/contextual/mongo.rb +13 -11
  86. data/lib/mongoid/copyable.rb +6 -6
  87. data/lib/mongoid/criteria/includable.rb +14 -14
  88. data/lib/mongoid/criteria/modifiable.rb +8 -14
  89. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  91. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  92. data/lib/mongoid/criteria.rb +2 -2
  93. data/lib/mongoid/document.rb +6 -6
  94. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  95. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  96. data/lib/mongoid/errors/unknown_model.rb +25 -0
  97. data/lib/mongoid/errors.rb +3 -0
  98. data/lib/mongoid/extensions/array.rb +5 -5
  99. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  100. data/lib/mongoid/extensions/hash.rb +5 -2
  101. data/lib/mongoid/extensions/object.rb +4 -4
  102. data/lib/mongoid/extensions/range.rb +1 -0
  103. data/lib/mongoid/extensions/regexp.rb +0 -1
  104. data/lib/mongoid/extensions/string.rb +1 -3
  105. data/lib/mongoid/extensions.rb +0 -4
  106. data/lib/mongoid/factory.rb +13 -3
  107. data/lib/mongoid/fields/foreign_key.rb +5 -5
  108. data/lib/mongoid/fields/standard.rb +2 -14
  109. data/lib/mongoid/fields/validators/macro.rb +1 -1
  110. data/lib/mongoid/fields.rb +3 -3
  111. data/lib/mongoid/indexable.rb +8 -5
  112. data/lib/mongoid/interceptable.rb +5 -5
  113. data/lib/mongoid/matchable/and.rb +1 -1
  114. data/lib/mongoid/matchable/elem_match.rb +9 -3
  115. data/lib/mongoid/matchable.rb +0 -3
  116. data/lib/mongoid/persistable/creatable.rb +2 -2
  117. data/lib/mongoid/persistable/deletable.rb +9 -8
  118. data/lib/mongoid/persistable/incrementable.rb +1 -1
  119. data/lib/mongoid/persistable/logical.rb +1 -1
  120. data/lib/mongoid/persistable/settable.rb +5 -5
  121. data/lib/mongoid/persistable/updatable.rb +2 -2
  122. data/lib/mongoid/persistable/upsertable.rb +1 -1
  123. data/lib/mongoid/persistable.rb +5 -6
  124. data/lib/mongoid/persistence_context.rb +1 -5
  125. data/lib/mongoid/query_cache.rb +19 -64
  126. data/lib/mongoid/railtie.rb +0 -17
  127. data/lib/mongoid/reloadable.rb +1 -1
  128. data/lib/mongoid/scopable.rb +3 -3
  129. data/lib/mongoid/serializable.rb +4 -4
  130. data/lib/mongoid/shardable.rb +1 -1
  131. data/lib/mongoid/tasks/database.rb +2 -2
  132. data/lib/mongoid/threaded.rb +0 -36
  133. data/lib/mongoid/traversable.rb +3 -3
  134. data/lib/mongoid/validatable/presence.rb +2 -2
  135. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  136. data/lib/mongoid/validatable.rb +8 -8
  137. data/lib/mongoid/version.rb +1 -1
  138. data/lib/mongoid.rb +1 -1
  139. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  140. data/spec/app/models/animal.rb +2 -1
  141. data/spec/app/models/bomb.rb +1 -1
  142. data/spec/app/models/message.rb +1 -1
  143. data/spec/app/models/person.rb +5 -2
  144. data/spec/app/models/shipment_address.rb +1 -0
  145. data/spec/app/models/vertex.rb +6 -0
  146. data/spec/app/models/wiki_page.rb +1 -1
  147. data/spec/config/mongoid.yml +1 -0
  148. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  149. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  150. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  151. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  152. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  153. data/spec/mongoid/association/depending_spec.rb +613 -0
  154. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  155. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  156. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  157. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  158. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  159. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  160. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  161. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  162. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  163. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  164. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  165. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  166. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  167. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  168. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  170. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  171. data/spec/mongoid/association/options_spec.rb +1321 -0
  172. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  173. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  174. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  175. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  176. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  177. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  178. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  180. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  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_spec.rb +1027 -0
  183. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  184. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  185. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  186. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  187. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  188. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  189. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  190. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  191. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  192. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  193. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  194. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  195. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  196. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  197. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  198. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  199. data/spec/mongoid/atomic_spec.rb +4 -4
  200. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  201. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  202. data/spec/mongoid/attributes_spec.rb +38 -2
  203. data/spec/mongoid/clients/factory_spec.rb +28 -52
  204. data/spec/mongoid/clients/options_spec.rb +65 -69
  205. data/spec/mongoid/clients/sessions_spec.rb +4 -13
  206. data/spec/mongoid/config_spec.rb +24 -0
  207. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  208. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  209. data/spec/mongoid/contextual/mongo_spec.rb +30 -5
  210. data/spec/mongoid/copyable_spec.rb +34 -0
  211. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  212. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  213. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  214. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  215. data/spec/mongoid/criteria/queryable/selectable_spec.rb +3 -42
  216. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  217. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  218. data/spec/mongoid/criteria_spec.rb +16 -19
  219. data/spec/mongoid/document_spec.rb +2 -56
  220. data/spec/mongoid/extensions/array_spec.rb +11 -15
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  222. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  223. data/spec/mongoid/extensions/object_spec.rb +7 -11
  224. data/spec/mongoid/extensions/range_spec.rb +7 -0
  225. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  226. data/spec/mongoid/extensions/string_spec.rb +7 -35
  227. data/spec/mongoid/factory_spec.rb +19 -1
  228. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  229. data/spec/mongoid/fields_spec.rb +2 -2
  230. data/spec/mongoid/findable_spec.rb +1 -1
  231. data/spec/mongoid/indexable_spec.rb +18 -8
  232. data/spec/mongoid/interceptable_spec.rb +22 -1
  233. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  234. data/spec/mongoid/matchable_spec.rb +1 -26
  235. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  236. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  237. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  238. data/spec/mongoid/persistable_spec.rb +21 -6
  239. data/spec/mongoid/query_cache_spec.rb +16 -99
  240. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  241. data/spec/mongoid/scopable_spec.rb +0 -13
  242. data/spec/mongoid/shardable_spec.rb +32 -12
  243. data/spec/mongoid/threaded_spec.rb +0 -68
  244. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  245. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  246. data/spec/mongoid/validatable_spec.rb +1 -1
  247. data/spec/spec_helper.rb +12 -14
  248. data.tar.gz.sig +1 -1
  249. metadata +192 -207
  250. metadata.gz.sig +0 -0
  251. data/lib/mongoid/matchable/nor.rb +0 -37
  252. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  253. data/lib/mongoid/relations/accessors.rb +0 -267
  254. data/lib/mongoid/relations/auto_save.rb +0 -94
  255. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  256. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  257. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  258. data/lib/mongoid/relations/bindings.rb +0 -9
  259. data/lib/mongoid/relations/builder.rb +0 -57
  260. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  261. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  262. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  263. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  264. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  265. data/lib/mongoid/relations/builders.rb +0 -106
  266. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  267. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  268. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  269. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  270. data/lib/mongoid/relations/cascading.rb +0 -56
  271. data/lib/mongoid/relations/conversions.rb +0 -34
  272. data/lib/mongoid/relations/counter_cache.rb +0 -160
  273. data/lib/mongoid/relations/cyclic.rb +0 -107
  274. data/lib/mongoid/relations/eager/base.rb +0 -153
  275. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  276. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  277. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  278. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  279. data/lib/mongoid/relations/embedded/in.rb +0 -241
  280. data/lib/mongoid/relations/embedded/many.rb +0 -683
  281. data/lib/mongoid/relations/embedded/one.rb +0 -235
  282. data/lib/mongoid/relations/macros.rb +0 -367
  283. data/lib/mongoid/relations/metadata.rb +0 -1179
  284. data/lib/mongoid/relations/nested_builder.rb +0 -74
  285. data/lib/mongoid/relations/options.rb +0 -49
  286. data/lib/mongoid/relations/polymorphic.rb +0 -39
  287. data/lib/mongoid/relations/referenced/in.rb +0 -304
  288. data/lib/mongoid/relations/referenced/many.rb +0 -812
  289. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  290. data/lib/mongoid/relations/referenced/one.rb +0 -290
  291. data/lib/mongoid/relations/synchronization.rb +0 -169
  292. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  293. data/lib/mongoid/relations/targets.rb +0 -2
  294. data/lib/mongoid/relations/touchable.rb +0 -97
  295. data/lib/mongoid/relations.rb +0 -148
  296. data/spec/app/models/array_field.rb +0 -7
  297. data/spec/app/models/delegating_patient.rb +0 -16
  298. data/spec/integration/document_spec.rb +0 -22
  299. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  300. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  301. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  302. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  303. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  304. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  305. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  306. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  307. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  308. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  309. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  310. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  311. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  312. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  313. data/spec/mongoid/relations/options_spec.rb +0 -35
  314. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  315. data/spec/support/cluster_config.rb +0 -158
  316. data/spec/support/constraints.rb +0 -101
  317. data/spec/support/macros.rb +0 -20
  318. data/spec/support/session_registry.rb +0 -50
  319. data/spec/support/spec_config.rb +0 -42
  320. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8c453904dce4061c6cd88c36e21f3514fb778b37976ffd12e985aaf80fc2b98
4
- data.tar.gz: d10421a146387851daa6a9c27184b48da1cc50d96a946bce0851aa69fd56c9a5
3
+ metadata.gz: 8d7943ffc77e9a6990cb063c1301476cd1d5b10cd8543f0e9861e96228ff8027
4
+ data.tar.gz: bc71866e339c29688dae94bdd8b4590b198ab25b503bc321802d6acea4af5c25
5
5
  SHA512:
6
- metadata.gz: 6c0e672470d68faab3afc70e65524baa771801b46bbbb51b831a5cc709baf6df4ed7f0d81aed2dd5d0c3e3cf6730166da9bc8345b33577298f4438ec6c11fca3
7
- data.tar.gz: 2008465437ba6eafe50235b22204df40b560b8e3bd27d064e97912c3249f5443af2ad1016c9a545d9d487abc6c1b38835624090a6d9165d06f9c4e676b561a23
6
+ metadata.gz: 51e00c706c33a552c148b768bf851042a2f5c46aecacd3aa6bed5105c8c9b002bf84f317b1d5d65ee209e153537af5fb7360560758aef34ca4cbc39ffa11b489
7
+ data.tar.gz: 81a21a9ee3e6aa381bb495eb098b7faba65f2fa32c304460ecb481356ab505bb1189c4850cf218680d93c269cb656360727d3ed3fd967de5525ff92bf510425d
checksums.yaml.gz.sig CHANGED
Binary file
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require "bundler"
2
- require "bundler/gem_tasks"
3
2
  Bundler.setup
4
3
 
5
4
  require "rake"
@@ -8,9 +7,6 @@ require "rspec/core/rake_task"
8
7
  $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
9
8
  require "mongoid/version"
10
9
 
11
- tasks = Rake.application.instance_variable_get('@tasks')
12
- tasks['release:do'] = tasks.delete('release')
13
-
14
10
  task :gem => :build
15
11
  task :build do
16
12
  system "gem build mongoid.gemspec"
@@ -37,25 +33,3 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
37
33
  end
38
34
 
39
35
  task :default => :spec
40
-
41
- desc "Generate all documentation"
42
- task :docs => 'docs:yard'
43
-
44
- namespace :docs do
45
- desc "Generate yard documention"
46
- task :yard do
47
- out = File.join('yard-docs', Mongoid::VERSION)
48
- FileUtils.rm_rf(out)
49
- system "yardoc -o #{out} --title mongoid-#{Mongoid::VERSION}"
50
- end
51
- end
52
-
53
- namespace :release do
54
- task :check_private_key do
55
- unless File.exist?('gem-private_key.pem')
56
- raise "No private key present, cannot release"
57
- end
58
- end
59
- end
60
-
61
- task :release => ['release:check_private_key', 'release:do']
@@ -91,6 +91,11 @@ en:
91
91
  expecting the option to be there, please consult the following page
92
92
  with repect to Mongoid's configuration:\n\n
93
93
  \_\_http://mongoid.org/en/mongoid/docs/installation.html"
94
+ invalid_dependent_strategy:
95
+ message: "Invalid dependent strategy: %{invalid_strategy}."
96
+ summary: "An invalid dependent strategy was defined for the association:
97
+ %{association}. The valid strategies are: %{valid_strategies}."
98
+ resolution: "Change the dependent strategy to one of the valid types."
94
99
  invalid_field:
95
100
  message: "Defining a field named '%{name}' is not allowed."
96
101
  summary: "Defining this field would override the method '%{name}',
@@ -196,6 +201,11 @@ en:
196
201
  allowed, and don't use these names. These include names that also
197
202
  conflict with core Ruby methods on Object, Module, Enumerable, or
198
203
  included gems that inject methods into these or Mongoid internals."
204
+ invalid_relation_option:
205
+ message: "Invalid relation option :%{option} for relation '%{name}' on class
206
+ %{klass}."
207
+ summary: "An invalid option was provided for a relation."
208
+ resolution: "Valid options are: %{valid_options}, make sure you use only those."
199
209
  invalid_scope:
200
210
  message: "Defining a scope of value %{value} on %{klass} is not
201
211
  allowed."
@@ -494,6 +504,13 @@ en:
494
504
  attributes hash, and is raised instead of getting a NoMethodError."
495
505
  resolution: "You can include Mongoid::Attributes::Dynamic if you
496
506
  expect to be writing values for undefined fields often."
507
+ unknown_model:
508
+ message: "Attempted to instantiate an object of the unknown Model '%{klass}'."
509
+ summary: "A document with the value '%{value}' at the key '_type' was used to
510
+ instantiate a model object but Mongoid cannot find this Class."
511
+ resolution: "The _type field is a reserved one used by Mongoid to determine the
512
+ class for instantiating an object. Please don't save data in this field or ensure
513
+ that any values in this field correspond to valid Models."
497
514
  unsaved_document:
498
515
  message: "Attempted to save %{document} before the parent %{base}."
499
516
  summary: "You cannot call create or create! through the
@@ -0,0 +1,339 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Association
4
+
5
+ # This module contains all the behaviour related to accessing relations
6
+ # through the getters and setters, and how to delegate to builders to
7
+ # create new ones.
8
+ module Accessors
9
+ extend ActiveSupport::Concern
10
+
11
+ # Builds the related document and creates the relation unless the
12
+ # document is nil, then sets the relation on this document.
13
+ #
14
+ # @example Build the relation.
15
+ # person.__build__(:addresses, { :_id => 1 }, association)
16
+ #
17
+ # @param [ String, Symbol ] name The name of the relation.
18
+ # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
19
+ # @param [ Association ] association The association metadata.
20
+ #
21
+ # @return [ Proxy ] The relation.
22
+ #
23
+ # @since 2.0.0.rc.1
24
+ def __build__(name, object, association)
25
+ relation = create_relation(object, association)
26
+ set_relation(name, relation)
27
+ end
28
+
29
+ # Create a relation from an object and association.
30
+ #
31
+ # @example Create the relation.
32
+ # person.create_relation(document, association)
33
+ #
34
+ # @param [ Document, Array<Document> ] object The relation target.
35
+ # @param [ Association ] association The association metadata.
36
+ #
37
+ # @return [ Proxy ] The relation.
38
+ #
39
+ # @since 2.0.0.rc.1
40
+ def create_relation(object, association)
41
+ type = @attributes[association.inverse_type]
42
+ target = association.build(self, object, type)
43
+ target ? association.create_relation(self, target) : nil
44
+ end
45
+
46
+ # Resets the criteria inside the relation proxy. Used by many-to-many
47
+ # relations to keep the underlying ids array in sync.
48
+ #
49
+ # @example Reset the relation criteria.
50
+ # person.reset_relation_criteria(:preferences)
51
+ #
52
+ # @param [ Symbol ] name The name of the relation.
53
+ #
54
+ # @since 3.0.14
55
+ def reset_relation_criteria(name)
56
+ if instance_variable_defined?("@_#{name}")
57
+ send(name).reset_unloaded
58
+ end
59
+ end
60
+
61
+ # Set the supplied relation to an instance variable on the class with the
62
+ # provided name. Used as a helper just for code cleanliness.
63
+ #
64
+ # @example Set the proxy on the document.
65
+ # person.set(:addresses, addresses)
66
+ #
67
+ # @param [ String, Symbol ] name The name of the relation.
68
+ # @param [ Proxy ] relation The relation to set.
69
+ #
70
+ # @return [ Proxy ] The relation.
71
+ #
72
+ # @since 2.0.0.rc.1
73
+ def set_relation(name, relation)
74
+ instance_variable_set("@_#{name}", relation)
75
+ end
76
+
77
+ private
78
+
79
+ # Get the relation. Extracted out from the getter method to avoid
80
+ # infinite recursion when overriding the getter.
81
+ #
82
+ # @api private
83
+ #
84
+ # @example Get the relation.
85
+ # document.get_relation(:name, association)
86
+ #
87
+ # @param [ Symbol ] name The name of the relation.
88
+ # @param [ Association ] association The association metadata.
89
+ # @param [ Object ] object The object used to build the relation.
90
+ # @param [ true, false ] reload If the relation is to be reloaded.
91
+ #
92
+ # @return [ Proxy ] The relation.
93
+ #
94
+ # @since 3.0.16
95
+ def get_relation(name, association, object, reload = false)
96
+ if !reload && (value = ivar(name)) != false
97
+ value
98
+ else
99
+ _building do
100
+ _loading do
101
+ if object && needs_no_database_query?(object, association)
102
+ __build__(name, object, association)
103
+ else
104
+ __build__(name, attributes[association.key], association)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ def needs_no_database_query?(object, association)
112
+ object.is_a?(Document) && !object.embedded? &&
113
+ object._id == attributes[association.key]
114
+ end
115
+
116
+ # Is the current code executing without autobuild functionality?
117
+ #
118
+ # @example Is autobuild disabled?
119
+ # document.without_autobuild?
120
+ #
121
+ # @return [ true, false ] If autobuild is disabled.
122
+ #
123
+ # @since 3.0.0
124
+ def without_autobuild?
125
+ Threaded.executing?(:without_autobuild)
126
+ end
127
+
128
+ # Yield to the block with autobuild functionality turned off.
129
+ #
130
+ # @example Execute without autobuild.
131
+ # document.without_autobuild do
132
+ # document.name
133
+ # end
134
+ #
135
+ # @return [ Object ] The result of the yield.
136
+ #
137
+ # @since 3.0.0
138
+ def without_autobuild
139
+ Threaded.begin_execution("without_autobuild")
140
+ yield
141
+ ensure
142
+ Threaded.exit_execution("without_autobuild")
143
+ end
144
+
145
+ # Parse out the attributes and the options from the args passed to a
146
+ # build_ or create_ methods.
147
+ #
148
+ # @example Parse the args.
149
+ # doc.parse_args(:name => "Joe")
150
+ #
151
+ # @param [ Array ] args The arguments.
152
+ #
153
+ # @return [ Array<Hash> ] The attributes and options.
154
+ #
155
+ # @since 2.3.4
156
+ def parse_args(*args)
157
+ [args.first || {}, args.size > 1 ? args[1] : {}]
158
+ end
159
+
160
+ # Adds the existence check for relations.
161
+ #
162
+ # @example Add the existence check.
163
+ # Person.define_existence_check!(association)
164
+ #
165
+ # @example Check if a relation exists.
166
+ # person = Person.new
167
+ # person.has_game?
168
+ # person.game?
169
+ #
170
+ # @param [ Association ] association The association.
171
+ #
172
+ # @return [ Class ] The model being set up.
173
+ #
174
+ # @since 3.0.0
175
+ def self.define_existence_check!(association)
176
+ name = association.name
177
+ association.inverse_class.tap do |klass|
178
+ klass.module_eval <<-END, __FILE__, __LINE__ + 1
179
+ def #{name}?
180
+ without_autobuild { !__send__(:#{name}).blank? }
181
+ end
182
+ alias :has_#{name}? :#{name}?
183
+ END
184
+ end
185
+ end
186
+
187
+ # Defines the getter for the relation. Nothing too special here: just
188
+ # return the instance variable for the relation if it exists or build
189
+ # the thing.
190
+ #
191
+ # @example Set up the getter for the relation.
192
+ # Person.define_getter!(association)
193
+ #
194
+ # @param [ Association ] association The association metadata for the relation.
195
+ #
196
+ # @return [ Class ] The class being set up.
197
+ #
198
+ # @since 2.0.0.rc.1
199
+ def self.define_getter!(association)
200
+ name = association.name
201
+ association.inverse_class.tap do |klass|
202
+ klass.re_define_method(name) do |reload = false|
203
+ value = get_relation(name, association, nil, reload)
204
+ if value.nil? && association.autobuilding? && !without_autobuild?
205
+ value = send("build_#{name}")
206
+ end
207
+ value
208
+ end
209
+ end
210
+ end
211
+
212
+ # Defines the getter for the ids of documents in the relation. Should
213
+ # be specify only for referenced many relations.
214
+ #
215
+ # @example Set up the ids getter for the relation.
216
+ # Person.define_ids_getter!(association)
217
+ #
218
+ # @param [ Association ] association The association metadata for the relation.
219
+ #
220
+ # @return [ Class ] The class being set up.
221
+ def self.define_ids_getter!(association)
222
+ ids_method = "#{association.name.to_s.singularize}_ids"
223
+ association.inverse_class.tap do |klass|
224
+ klass.re_define_method(ids_method) do
225
+ send(association.name).only(:id).map(&:id)
226
+ end
227
+ end
228
+ end
229
+
230
+ # Defines the setter for the relation. This does a few things based on
231
+ # some conditions. If there is an existing association, a target
232
+ # substitution will take place, otherwise a new relation will be
233
+ # created with the supplied target.
234
+ #
235
+ # @example Set up the setter for the relation.
236
+ # Person.define_setter!(association)
237
+ #
238
+ # @param [ Association ] association The association metadata for the relation.
239
+ #
240
+ # @return [ Class ] The class being set up.
241
+ #
242
+ # @since 2.0.0.rc.1
243
+ def self.define_setter!(association)
244
+ name = association.name
245
+ association.inverse_class.tap do |klass|
246
+ klass.re_define_method("#{name}=") do |object|
247
+ without_autobuild do
248
+ if value = get_relation(name, association, object)
249
+ if value.respond_to?(:substitute)
250
+ set_relation(name, value.substitute(object.substitutable))
251
+ else
252
+ value = __build__(name, value, association)
253
+ set_relation(name, value.substitute(object.substitutable))
254
+ end
255
+ else
256
+ __build__(name, object.substitutable, association)
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ # Defines the setter method that allows you to set documents
264
+ # in this relation by their ids. The defined setter, finds
265
+ # documents with given ids and invokes regular relation setter
266
+ # with found documents. Ids setters should be defined only for
267
+ # referenced many relations.
268
+ #
269
+ # @example Set up the id_setter for the relation.
270
+ # Person.define_ids_setter!(association)
271
+ #
272
+ # @param [ Association ] association The association for the relation.
273
+ #
274
+ # @return [ Class ] The class being set up.
275
+ def self.define_ids_setter!(association)
276
+ ids_method = "#{association.name.to_s.singularize}_ids="
277
+ association.inverse_class.tap do |klass|
278
+ klass.re_define_method(ids_method) do |ids|
279
+ send(association.setter, association.relation_class.find(ids.reject(&:blank?)))
280
+ end
281
+ end
282
+ end
283
+
284
+ # Defines a builder method for an embeds_one relation. This is
285
+ # defined as #build_name.
286
+ #
287
+ # @example
288
+ # Person.define_builder!(association)
289
+ #
290
+ # @param [ Association ] association The association for the relation.
291
+ #
292
+ # @return [ Class ] The class being set up.
293
+ #
294
+ # @since 2.0.0.rc.1
295
+ def self.define_builder!(association)
296
+ name = association.name
297
+ association.inverse_class.tap do |klass|
298
+ klass.re_define_method("build_#{name}") do |*args|
299
+ attributes, _options = parse_args(*args)
300
+ document = Factory.build(association.relation_class, attributes)
301
+ _building do
302
+ child = send("#{name}=", document)
303
+ child.run_callbacks(:build)
304
+ child
305
+ end
306
+ end
307
+ end
308
+ end
309
+
310
+ # Defines a creator method for an embeds_one relation. This is
311
+ # defined as #create_name. After the object is built it will
312
+ # immediately save.
313
+ #
314
+ # @example
315
+ # Person.define_creator!(association)
316
+ #
317
+ # @param [ Association ] association The association for the relation.
318
+ #
319
+ # @return [ Class ] The class being set up.
320
+ #
321
+ # @since 2.0.0.rc.1
322
+ def self.define_creator!(association)
323
+ name = association.name
324
+ association.inverse_class.tap do |klass|
325
+ klass.re_define_method("create_#{name}") do |*args|
326
+ attributes, _options = parse_args(*args)
327
+ document = Factory.build(association.klass, attributes)
328
+ doc = _assigning do
329
+ send("#{name}=", document)
330
+ end
331
+ doc.save
332
+ save if new_record? && association.stores_foreign_key?
333
+ doc
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
@@ -1,25 +1,25 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Relations
3
+ module Association
4
4
 
5
5
  # Superclass for all objects that bind relations together.
6
- class Binding
6
+ module Bindable
7
7
  include Threaded::Lifecycle
8
8
 
9
- attr_reader :base, :target, :metadata
9
+ attr_reader :_base, :_target, :_association
10
10
 
11
11
  # Create the new binding.
12
12
  #
13
13
  # @example Initialize a binding.
14
- # Binding.new(base, target, metadata)
14
+ # Binding.new(base, target, association)
15
15
  #
16
16
  # @param [ Document ] base The base of the binding.
17
17
  # @param [ Document, Array<Document> ] target The target of the binding.
18
- # @param [ Metadata ] metadata The relation's metadata.
18
+ # @param [ Association ] association The association metadata.
19
19
  #
20
20
  # @since 2.0.0.rc.1
21
- def initialize(base, target, metadata)
22
- @base, @target, @metadata = base, target, metadata
21
+ def initialize(base, target, association)
22
+ @_base, @_target, @_association = base, target, association
23
23
  end
24
24
 
25
25
  # Execute the provided block inside a binding.
@@ -55,32 +55,12 @@ module Mongoid
55
55
  #
56
56
  # @since 3.0.0
57
57
  def check_inverse!(doc)
58
- if !metadata.forced_nil_inverse? &&
59
- !doc.respond_to?(metadata.foreign_key_setter)
58
+ unless _association.bindable?(doc)
60
59
  raise Errors::InverseNotFound.new(
61
- base.class,
62
- metadata.name,
63
- doc.class,
64
- metadata.foreign_key
65
- )
66
- end
67
- end
68
-
69
- # Check for problems with multiple inverse definitions.
70
- #
71
- # @api private
72
- #
73
- # @example Check for inverses errors.
74
- # binding.check_inverses!(doc)
75
- #
76
- # @param [ Document ] doc The document to check.
77
- #
78
- # @since 3.0.0
79
- def check_inverses!(doc)
80
- inverses = metadata.inverses(doc)
81
- if inverses.count > 1 && base.send(metadata.foreign_key).nil?
82
- raise Errors::InvalidSetPolymorphicRelation.new(
83
- metadata.name, base.class.name, target.class.name
60
+ _base.class,
61
+ _association.name,
62
+ doc.class,
63
+ _association.foreign_key
84
64
  )
85
65
  end
86
66
  end
@@ -99,7 +79,7 @@ module Mongoid
99
79
  # @since 3.0.0
100
80
  def bind_foreign_key(keyed, id)
101
81
  unless keyed.frozen?
102
- keyed.you_must(metadata.foreign_key_setter, id)
82
+ keyed.you_must(_association.foreign_key_setter, id)
103
83
  end
104
84
  end
105
85
 
@@ -116,8 +96,8 @@ module Mongoid
116
96
  #
117
97
  # @since 3.0.0
118
98
  def bind_polymorphic_type(typed, name)
119
- if metadata.type
120
- typed.you_must(metadata.type_setter, name)
99
+ if _association.type
100
+ typed.you_must(_association.type_setter, name)
121
101
  end
122
102
  end
123
103
 
@@ -134,8 +114,8 @@ module Mongoid
134
114
  #
135
115
  # @since 3.0.0
136
116
  def bind_polymorphic_inverse_type(typed, name)
137
- if metadata.inverse_type
138
- typed.you_must(metadata.inverse_type_setter, name)
117
+ if _association.inverse_type
118
+ typed.you_must(_association.inverse_type_setter, name)
139
119
  end
140
120
  end
141
121
 
@@ -152,8 +132,8 @@ module Mongoid
152
132
  #
153
133
  # @since 3.0.0
154
134
  def bind_inverse(doc, inverse)
155
- if doc.respond_to?(metadata.inverse_setter)
156
- doc.you_must(metadata.inverse_setter, inverse)
135
+ if doc.respond_to?(_association.inverse_setter)
136
+ doc.you_must(_association.inverse_setter, inverse)
157
137
  end
158
138
  end
159
139
 
@@ -169,31 +149,31 @@ module Mongoid
169
149
  # @since 3.0.0
170
150
  def bind_from_relational_parent(doc)
171
151
  check_inverse!(doc)
172
- bind_foreign_key(doc, record_id(base))
173
- bind_polymorphic_type(doc, base.class.name)
174
- bind_inverse(doc, base)
152
+ bind_foreign_key(doc, record_id(_base))
153
+ bind_polymorphic_type(doc, _base.class.name)
154
+ bind_inverse(doc, _base)
175
155
  end
176
156
 
177
- def record_id(base)
178
- base.__send__(metadata.primary_key)
157
+ def record_id(_base)
158
+ _base.__send__(_association.primary_key)
179
159
  end
180
160
 
181
- # Ensure that the metadata on the base is correct, for the cases
161
+ # Ensure that the association on the base is correct, for the cases
182
162
  # where we have multiple belongs to definitions and were are setting
183
163
  # different parents in memory in order.
184
164
  #
185
165
  # @api private
186
166
  #
187
- # @example Set the base metadata.
188
- # binding.set_base_metadata
167
+ # @example Set the base association.
168
+ # binding.set_base_association
189
169
  #
190
- # @return [ true, false ] If the metadata changed.
170
+ # @return [ true, false ] If the association changed.
191
171
  #
192
172
  # @since 2.4.4
193
- def set_base_metadata
194
- inverse_metadata = metadata.inverse_metadata(target)
195
- if inverse_metadata != metadata && !inverse_metadata.nil?
196
- base.__metadata = inverse_metadata
173
+ def set_base_association
174
+ inverse_association = _association.inverse_association(_target)
175
+ if inverse_association != _association && !inverse_association.nil?
176
+ _base._association = inverse_association
197
177
  end
198
178
  end
199
179
 
@@ -0,0 +1,92 @@
1
+ # encoding: utf-8
2
+
3
+ module Mongoid
4
+ module Association
5
+
6
+ # This module is responsible for defining the build and create methods used
7
+ # in one to one relations.
8
+ #
9
+ # @example Methods that get created.
10
+ #
11
+ # class Person
12
+ # include Mongoid::Document
13
+ # embeds_one :name
14
+ # end
15
+ #
16
+ # # The following methods get created:
17
+ # person.build_name({ :first_name => "Durran" })
18
+ # person.create_name({ :first_name => "Durran" })
19
+ #
20
+ # @since 2.0.0.rc.1
21
+ module Builders
22
+ extend ActiveSupport::Concern
23
+
24
+ private
25
+
26
+ # Parse out the attributes and the options from the args passed to a
27
+ # build_ or create_ methods.
28
+ #
29
+ # @example Parse the args.
30
+ # doc.parse_args(:name => "Joe")
31
+ #
32
+ # @param [ Array ] args The arguments.
33
+ #
34
+ # @return [ Array<Hash> ] The attributes and options.
35
+ #
36
+ # @since 2.3.4
37
+ def parse_args(*args)
38
+ [ args.first || {}, args.size > 1 ? args[1] : {} ]
39
+ end
40
+
41
+ # Defines a builder method. This is defined as #build_name.
42
+ #
43
+ # @example
44
+ # Person.define_builder!(association)
45
+ #
46
+ # @param [ Association ] association The association metadata for the relation.
47
+ #
48
+ # @return [ Class ] The class being set up.
49
+ #
50
+ # @since 2.0.0.rc.1
51
+ def self.define_builder!(association)
52
+ association.inverse_class.tap do |klass|
53
+ klass.re_define_method("build_#{association.name}") do |*args|
54
+ attributes, _options = parse_args(*args)
55
+ document = Factory.build(association.relation_class, attributes)
56
+ _building do
57
+ child = send("#{association.name}=", document)
58
+ child.run_callbacks(:build)
59
+ child
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ # Defines a creator method. This is defined as #create_name.
66
+ # After the object is built it will immediately save.
67
+ #
68
+ # @example
69
+ # Person.define_creator!(association)
70
+ #
71
+ # @param [ Association ] association The association metadata for the relation.
72
+ #
73
+ # @return [ Class ] The class being set up.
74
+ #
75
+ # @since 2.0.0.rc.1
76
+ def self.define_creator!(association)
77
+ association.inverse_class.tap do |klass|
78
+ klass.re_define_method("create_#{association.name}") do |*args|
79
+ attributes, _options = parse_args(*args)
80
+ document = Factory.build(association.relation_class, attributes)
81
+ doc = _assigning do
82
+ send("#{association.name}=", document)
83
+ end
84
+ doc.save
85
+ save if new_record? && association.stores_foreign_key?
86
+ doc
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end