mongoid 6.4.8 → 7.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (315) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +0 -26
  5. data/lib/config/locales/en.yml +17 -21
  6. data/lib/mongoid.rb +2 -2
  7. data/lib/mongoid/association.rb +150 -0
  8. data/lib/mongoid/association/accessors.rb +339 -0
  9. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  10. data/lib/mongoid/association/builders.rb +92 -0
  11. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  12. data/lib/mongoid/association/depending.rb +116 -0
  13. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  14. data/lib/mongoid/association/embedded.rb +4 -0
  15. data/lib/mongoid/{relations → association}/embedded/batchable.rb +27 -53
  16. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  17. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  19. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  21. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  22. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  23. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  25. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  26. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  27. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  29. data/lib/mongoid/association/macros.rb +204 -0
  30. data/lib/mongoid/{relations → association}/many.rb +18 -52
  31. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/association/nested/many.rb +200 -0
  34. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  35. data/lib/mongoid/association/nested/one.rb +127 -0
  36. data/lib/mongoid/{relations → association}/one.rb +6 -6
  37. data/lib/mongoid/association/options.rb +152 -0
  38. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  39. data/lib/mongoid/association/referenced.rb +7 -0
  40. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  46. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  47. data/lib/mongoid/association/referenced/eager.rb +159 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +273 -0
  54. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  55. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  56. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  57. data/lib/mongoid/association/referenced/has_many/enumerable.rb +479 -0
  58. data/lib/mongoid/association/referenced/has_many/proxy.rb +577 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  61. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  62. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  63. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  64. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  65. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  66. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  67. data/lib/mongoid/association/relatable.rb +415 -0
  68. data/lib/mongoid/association/touchable.rb +97 -0
  69. data/lib/mongoid/atomic.rb +6 -6
  70. data/lib/mongoid/atomic/modifiers.rb +8 -12
  71. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  72. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  73. data/lib/mongoid/attributes.rb +2 -1
  74. data/lib/mongoid/attributes/nested.rb +10 -10
  75. data/lib/mongoid/attributes/processing.rb +2 -2
  76. data/lib/mongoid/attributes/readonly.rb +2 -4
  77. data/lib/mongoid/clients.rb +0 -2
  78. data/lib/mongoid/clients/options.rb +1 -1
  79. data/lib/mongoid/clients/storage_options.rb +0 -1
  80. data/lib/mongoid/composable.rb +3 -4
  81. data/lib/mongoid/config.rb +1 -0
  82. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  83. data/lib/mongoid/contextual/atomic.rb +3 -6
  84. data/lib/mongoid/contextual/map_reduce.rb +3 -7
  85. data/lib/mongoid/contextual/memory.rb +5 -10
  86. data/lib/mongoid/contextual/mongo.rb +10 -27
  87. data/lib/mongoid/copyable.rb +6 -6
  88. data/lib/mongoid/criteria.rb +1 -2
  89. data/lib/mongoid/criteria/includable.rb +14 -14
  90. data/lib/mongoid/criteria/modifiable.rb +8 -14
  91. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -3
  92. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  93. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  94. data/lib/mongoid/document.rb +6 -6
  95. data/lib/mongoid/errors.rb +3 -1
  96. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  97. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  98. data/lib/mongoid/errors/unknown_model.rb +25 -0
  99. data/lib/mongoid/extensions/array.rb +5 -5
  100. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  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/factory.rb +4 -3
  106. data/lib/mongoid/fields.rb +1 -1
  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/indexable.rb +8 -5
  111. data/lib/mongoid/interceptable.rb +5 -5
  112. data/lib/mongoid/matchable.rb +0 -3
  113. data/lib/mongoid/persistable.rb +4 -5
  114. data/lib/mongoid/persistable/creatable.rb +2 -4
  115. data/lib/mongoid/persistable/deletable.rb +9 -10
  116. data/lib/mongoid/persistable/destroyable.rb +5 -1
  117. data/lib/mongoid/persistable/incrementable.rb +1 -1
  118. data/lib/mongoid/persistable/logical.rb +1 -1
  119. data/lib/mongoid/persistable/settable.rb +5 -5
  120. data/lib/mongoid/persistable/updatable.rb +2 -2
  121. data/lib/mongoid/persistable/upsertable.rb +1 -2
  122. data/lib/mongoid/persistence_context.rb +4 -9
  123. data/lib/mongoid/query_cache.rb +18 -65
  124. data/lib/mongoid/railtie.rb +0 -17
  125. data/lib/mongoid/reloadable.rb +1 -1
  126. data/lib/mongoid/scopable.rb +3 -3
  127. data/lib/mongoid/serializable.rb +3 -3
  128. data/lib/mongoid/tasks/database.rb +2 -3
  129. data/lib/mongoid/threaded.rb +0 -74
  130. data/lib/mongoid/traversable.rb +2 -2
  131. data/lib/mongoid/validatable.rb +8 -8
  132. data/lib/mongoid/validatable/presence.rb +2 -2
  133. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  134. data/lib/mongoid/version.rb +1 -1
  135. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -4
  136. data/spec/app/models/animal.rb +2 -1
  137. data/spec/app/models/band.rb +0 -1
  138. data/spec/app/models/bomb.rb +1 -1
  139. data/spec/app/models/message.rb +1 -1
  140. data/spec/app/models/person.rb +5 -2
  141. data/spec/app/models/vertex.rb +6 -0
  142. data/spec/app/models/wiki_page.rb +1 -1
  143. data/spec/config/mongoid.yml +1 -0
  144. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  145. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  146. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  147. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  148. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  149. data/spec/mongoid/association/depending_spec.rb +613 -0
  150. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  151. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  152. data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
  153. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  154. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  155. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  156. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  157. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  158. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  159. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  161. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  162. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  163. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  164. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  165. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -93
  166. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  167. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  168. data/spec/mongoid/association/options_spec.rb +1321 -0
  169. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  170. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  171. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  172. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  173. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  174. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  175. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  176. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  177. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  178. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  180. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  181. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  182. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +11 -11
  183. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +1 -109
  184. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  185. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  186. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  187. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  188. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  189. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  190. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  191. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  192. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  193. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  194. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  195. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  196. data/spec/mongoid/atomic_spec.rb +17 -17
  197. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  198. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  199. data/spec/mongoid/clients/factory_spec.rb +28 -52
  200. data/spec/mongoid/clients/options_spec.rb +65 -69
  201. data/spec/mongoid/config_spec.rb +24 -0
  202. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  203. data/spec/mongoid/contextual/mongo_spec.rb +4 -112
  204. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  205. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  206. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  207. data/spec/mongoid/criteria/queryable/selectable_spec.rb +6 -74
  208. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  209. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  210. data/spec/mongoid/criteria_spec.rb +16 -19
  211. data/spec/mongoid/document_spec.rb +2 -56
  212. data/spec/mongoid/extensions/array_spec.rb +11 -15
  213. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  214. data/spec/mongoid/extensions/object_spec.rb +7 -11
  215. data/spec/mongoid/extensions/range_spec.rb +7 -0
  216. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  217. data/spec/mongoid/extensions/string_spec.rb +7 -35
  218. data/spec/mongoid/factory_spec.rb +18 -11
  219. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  220. data/spec/mongoid/fields_spec.rb +2 -2
  221. data/spec/mongoid/findable_spec.rb +1 -1
  222. data/spec/mongoid/indexable_spec.rb +18 -8
  223. data/spec/mongoid/interceptable_spec.rb +21 -2
  224. data/spec/mongoid/matchable_spec.rb +1 -26
  225. data/spec/mongoid/persistable/deletable_spec.rb +0 -19
  226. data/spec/mongoid/persistable/destroyable_spec.rb +0 -19
  227. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  228. data/spec/mongoid/persistable/savable_spec.rb +3 -3
  229. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  230. data/spec/mongoid/persistable/updatable_spec.rb +2 -2
  231. data/spec/mongoid/persistable_spec.rb +16 -16
  232. data/spec/mongoid/persistence_context_spec.rb +0 -14
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +18 -87
  235. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  236. data/spec/mongoid/scopable_spec.rb +0 -13
  237. data/spec/mongoid/threaded_spec.rb +0 -68
  238. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  239. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  240. data/spec/mongoid/validatable_spec.rb +1 -1
  241. data/spec/spec_helper.rb +7 -83
  242. metadata +586 -611
  243. metadata.gz.sig +2 -5
  244. data/lib/mongoid/clients/sessions.rb +0 -113
  245. data/lib/mongoid/errors/invalid_session_use.rb +0 -24
  246. data/lib/mongoid/matchable/nor.rb +0 -37
  247. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  248. data/lib/mongoid/relations.rb +0 -148
  249. data/lib/mongoid/relations/accessors.rb +0 -267
  250. data/lib/mongoid/relations/auto_save.rb +0 -94
  251. data/lib/mongoid/relations/bindings.rb +0 -9
  252. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  253. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  254. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  255. data/lib/mongoid/relations/builder.rb +0 -57
  256. data/lib/mongoid/relations/builders.rb +0 -106
  257. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  258. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  259. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  260. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  261. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  262. data/lib/mongoid/relations/cascading.rb +0 -56
  263. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  264. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  265. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  266. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  267. data/lib/mongoid/relations/conversions.rb +0 -34
  268. data/lib/mongoid/relations/counter_cache.rb +0 -160
  269. data/lib/mongoid/relations/cyclic.rb +0 -107
  270. data/lib/mongoid/relations/eager/base.rb +0 -153
  271. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  272. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  273. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  274. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  275. data/lib/mongoid/relations/embedded/in.rb +0 -241
  276. data/lib/mongoid/relations/embedded/many.rb +0 -683
  277. data/lib/mongoid/relations/embedded/one.rb +0 -235
  278. data/lib/mongoid/relations/macros.rb +0 -367
  279. data/lib/mongoid/relations/metadata.rb +0 -1179
  280. data/lib/mongoid/relations/nested_builder.rb +0 -74
  281. data/lib/mongoid/relations/options.rb +0 -49
  282. data/lib/mongoid/relations/polymorphic.rb +0 -39
  283. data/lib/mongoid/relations/referenced/in.rb +0 -304
  284. data/lib/mongoid/relations/referenced/many.rb +0 -812
  285. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  286. data/lib/mongoid/relations/referenced/one.rb +0 -290
  287. data/lib/mongoid/relations/synchronization.rb +0 -169
  288. data/lib/mongoid/relations/targets.rb +0 -2
  289. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  290. data/lib/mongoid/relations/touchable.rb +0 -97
  291. data/spec/app/models/array_field.rb +0 -7
  292. data/spec/app/models/delegating_patient.rb +0 -16
  293. data/spec/integration/document_spec.rb +0 -22
  294. data/spec/mongoid/clients/sessions_spec.rb +0 -334
  295. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  296. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  297. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  298. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  299. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  300. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  301. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  302. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  303. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  304. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  305. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  306. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  307. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  308. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  309. data/spec/mongoid/relations/options_spec.rb +0 -35
  310. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  311. data/spec/support/cluster_config.rb +0 -158
  312. data/spec/support/constraints.rb +0 -101
  313. data/spec/support/macros.rb +0 -20
  314. data/spec/support/session_registry.rb +0 -50
  315. data/spec/support/spec_config.rb +0 -42
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: b8c453904dce4061c6cd88c36e21f3514fb778b37976ffd12e985aaf80fc2b98
4
- data.tar.gz: d10421a146387851daa6a9c27184b48da1cc50d96a946bce0851aa69fd56c9a5
2
+ SHA1:
3
+ metadata.gz: 6f483fd6267d4f9d7cdd88cd53e8fda43b3266d5
4
+ data.tar.gz: a9dc77a3e44b2e719b5bc5e74c918c0d20dc964d
5
5
  SHA512:
6
- metadata.gz: 6c0e672470d68faab3afc70e65524baa771801b46bbbb51b831a5cc709baf6df4ed7f0d81aed2dd5d0c3e3cf6730166da9bc8345b33577298f4438ec6c11fca3
7
- data.tar.gz: 2008465437ba6eafe50235b22204df40b560b8e3bd27d064e97912c3249f5443af2ad1016c9a545d9d487abc6c1b38835624090a6d9165d06f9c4e676b561a23
6
+ metadata.gz: 5404ab3c5ee259a29c80848cdf90f5709cb4665945c41edbaab5c329a9bd28b5350dedc115e3e41d537043f730f1b90db8646a5d8b075c26f324c0a94f4e6b35
7
+ data.tar.gz: f14bad6291f3628cf3c767c55b7707d32f9fe0bb001e34bd466c66d483378752f0550666359a206afbd1f0bf3409b6fb4eb12f4b2fea0cc4cc0e83f737a50da6
Binary file
data.tar.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."
@@ -206,20 +216,6 @@ en:
206
216
  \_\_\_\_include Mongoid::Document\n
207
217
  \_\_\_\_scope :inactive, ->{ where(active: false) }\n
208
218
  \_\_end\n\n"
209
- invalid_session_use:
210
- message: "A session was attempted to be used with a model whose client cannot use
211
- that session."
212
- summary: "Sessions are started via driver clients (Model#mongo_client) and, in most cases, driver
213
- clients are shared across models. When different models have their own clients, a session cannot
214
- be obtained via one model and used for operations on another model."
215
- resolution: "Only execute operations on the model class or instances of the model through which
216
- the session was created. Otherwise, ensure that all models on which operations are executed
217
- in the session block share the same driver client. For example, a model may have a different
218
- client specified in its 'store_in' options.\n\n"
219
- invalid_session_nesting:
220
- message: "A session was started while another session was being used."
221
- summary: "Sessions cannot be nested. Only one session can be used in a thread at once."
222
- resolution: "Only use one session at a time; sessions cannot be nested."
223
219
  invalid_storage_options:
224
220
  message: "Invalid options passed to %{klass}.store_in: %{options}."
225
221
  summary: "The :store_in macro takes only a hash of parameters with
@@ -466,13 +462,6 @@ en:
466
462
  with the already defined method %{model_name}, or set the
467
463
  configuration option Mongoid.scope_overwrite_exception to false,
468
464
  which is its default. In this case a warning will be logged."
469
- sessions_not_supported:
470
- message: "Sessions are not supported by the connected server(s)."
471
- summary: "A session was attempted to be used with a MongoDB server version
472
- that doesn't support sessions. Sessions are supported in MongoDB
473
- server versions 3.6 and higher."
474
- resolution: "Verify that all servers in your deployment are at least
475
- version 3.6 or don't attempt to use sessions with older server versions."
476
465
  taken:
477
466
  "is already taken"
478
467
  too_many_nested_attribute_records:
@@ -494,6 +483,13 @@ en:
494
483
  attributes hash, and is raised instead of getting a NoMethodError."
495
484
  resolution: "You can include Mongoid::Attributes::Dynamic if you
496
485
  expect to be writing values for undefined fields often."
486
+ unknown_model:
487
+ message: "Attempted to instantiate an object of the unknown Model '%{klass}'."
488
+ summary: "A document with the value '%{value}' at the key '_type' was used to
489
+ instantiate a model object but Mongoid cannot find this Class."
490
+ resolution: "The _type field is a reserved one used by Mongoid to determine the
491
+ class for instantiating an object. Please don't save data in this field or ensure
492
+ that any values in this field correspond to valid Models."
497
493
  unsaved_document:
498
494
  message: "Attempted to save %{document} before the parent %{base}."
499
495
  summary: "You cannot call create or create! through the
@@ -42,7 +42,7 @@ module Mongoid
42
42
  PLATFORM_DETAILS = "mongoid-#{VERSION}".freeze
43
43
 
44
44
  # The minimum MongoDB version supported.
45
- MONGODB_VERSION = "2.6.0"
45
+ MONGODB_VERSION = "2.4.0"
46
46
 
47
47
  # Sets the Mongoid configuration options. Best used by passing a block.
48
48
  #
@@ -101,5 +101,5 @@ module Mongoid
101
101
  # Mongoid.database = Mongo::Connection.new.db("test")
102
102
  #
103
103
  # @since 1.0.0
104
- delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ]), to: Config)
104
+ delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
105
105
  end
@@ -0,0 +1,150 @@
1
+ require 'mongoid/association/accessors'
2
+ require 'mongoid/association/builders'
3
+ require 'mongoid/association/bindable'
4
+ require 'mongoid/association/depending'
5
+ require 'mongoid/association/proxy'
6
+ require 'mongoid/association/touchable'
7
+
8
+ require 'mongoid/association/many'
9
+ require 'mongoid/association/one'
10
+ require 'mongoid/association/relatable'
11
+ require 'mongoid/association/nested'
12
+ require 'mongoid/association/referenced'
13
+ require 'mongoid/association/embedded'
14
+ require 'mongoid/association/macros'
15
+
16
+ require 'mongoid/association/reflections'
17
+ require 'mongoid/association/eager_loadable'
18
+
19
+ module Mongoid
20
+ module Association
21
+ extend ActiveSupport::Concern
22
+ include Embedded::Cyclic
23
+ include Referenced::AutoSave
24
+ include Referenced::CounterCache
25
+ include Referenced::Syncable
26
+ include Accessors
27
+ include Depending
28
+ include Builders
29
+ include Macros
30
+ include Reflections
31
+
32
+ # Map the macros to their corresponding Association classes.
33
+ #
34
+ # @return [ Hash ] The mapping from macros to their Association class.
35
+ #
36
+ # @since 7.0
37
+ MACRO_MAPPING = {
38
+ embeds_one: Association::Embedded::EmbedsOne,
39
+ embeds_many: Association::Embedded::EmbedsMany,
40
+ embedded_in: Association::Embedded::EmbeddedIn,
41
+ has_one: Association::Referenced::HasOne,
42
+ has_many: Association::Referenced::HasMany,
43
+ has_and_belongs_to_many: Association::Referenced::HasAndBelongsToMany,
44
+ belongs_to: Association::Referenced::BelongsTo,
45
+ }.freeze
46
+
47
+ attr_accessor :_association
48
+
49
+ included do
50
+ class_attribute :polymorphic
51
+ self.polymorphic = false
52
+ end
53
+
54
+ # Determine if the document itself is embedded in another document via the
55
+ # proper channels. (If it has a parent document.)
56
+ #
57
+ # @example Is the document embedded?
58
+ # address.embedded?
59
+ #
60
+ # @return [ true, false ] True if the document has a parent document.
61
+ #
62
+ # @since 2.0.0.rc.1
63
+ def embedded?
64
+ @embedded ||= (cyclic ? _parent.present? : self.class.embedded?)
65
+ end
66
+
67
+ # Determine if the document is part of an embeds_many relation.
68
+ #
69
+ # @example Is the document in an embeds many?
70
+ # address.embedded_many?
71
+ #
72
+ # @return [ true, false ] True if in an embeds many.
73
+ #
74
+ # @since 2.0.0.rc.1
75
+ def embedded_many?
76
+ _association && _association.is_a?(Association::Embedded::EmbedsMany)
77
+ end
78
+
79
+ # Determine if the document is part of an embeds_one relation.
80
+ #
81
+ # @example Is the document in an embeds one?
82
+ # address.embedded_one?
83
+ #
84
+ # @return [ true, false ] True if in an embeds one.
85
+ #
86
+ # @since 2.0.0.rc.1
87
+ def embedded_one?
88
+ _association && _association.is_a?(Association::Embedded::EmbedsOne)
89
+ end
90
+
91
+ # Get the association name for this document. If no association was defined
92
+ # an error will be raised.
93
+ #
94
+ # @example Get the association name.
95
+ # document.association_name
96
+ #
97
+ # @raise [ Errors::NoMetadata ] If no association metadata is present.
98
+ #
99
+ # @return [ Symbol ] The association name.
100
+ #
101
+ # @since 3.0.0
102
+ def association_name
103
+ raise Errors::NoMetadata.new(self.class.name) unless _association
104
+ _association.name
105
+ end
106
+
107
+ # Determine if the document is part of an references_many relation.
108
+ #
109
+ # @example Is the document in a references many?
110
+ # post.referenced_many?
111
+ #
112
+ # @return [ true, false ] True if in a references many.
113
+ #
114
+ # @since 2.0.0.rc.1
115
+ def referenced_many?
116
+ _association && _association.is_a?(Association::Referenced::HasMany)
117
+ end
118
+
119
+ # Determine if the document is part of an references_one relation.
120
+ #
121
+ # @example Is the document in a references one?
122
+ # address.referenced_one?
123
+ #
124
+ # @return [ true, false ] True if in a references one.
125
+ #
126
+ # @since 2.0.0.rc.1
127
+ def referenced_one?
128
+ _association && _association.is_a?(Association::Referenced::HasOne)
129
+ end
130
+
131
+ # Convenience method for iterating through the loaded relations and
132
+ # reloading them.
133
+ #
134
+ # @example Reload the relations.
135
+ # document.reload_relations
136
+ #
137
+ # @return [ Hash ] The association metadata.
138
+ #
139
+ # @since 2.1.6
140
+ def reload_relations
141
+ relations.each_pair do |name, meta|
142
+ if instance_variable_defined?("@_#{name}")
143
+ if _parent.nil? || instance_variable_get("@_#{name}") != _parent
144
+ remove_instance_variable("@_#{name}")
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -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