mongoid 8.1.12 → 9.0.0

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 (1024) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -9
  5. data/Rakefile +62 -44
  6. data/lib/config/locales/en.yml +66 -5
  7. data/lib/mongoid/association/accessors.rb +16 -20
  8. data/lib/mongoid/association/bindable.rb +27 -8
  9. data/lib/mongoid/association/builders.rb +3 -2
  10. data/lib/mongoid/association/constrainable.rb +1 -0
  11. data/lib/mongoid/association/depending.rb +16 -1
  12. data/lib/mongoid/association/eager.rb +160 -0
  13. data/lib/mongoid/association/eager_loadable.rb +15 -7
  14. data/lib/mongoid/association/embedded/batchable.rb +16 -18
  15. data/lib/mongoid/association/embedded/cyclic.rb +1 -0
  16. data/lib/mongoid/association/embedded/eager.rb +23 -0
  17. data/lib/mongoid/association/embedded/embedded_in/binding.rb +5 -4
  18. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +1 -0
  19. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +21 -7
  20. data/lib/mongoid/association/embedded/embedded_in.rb +7 -0
  21. data/lib/mongoid/association/embedded/embeds_many/binding.rb +3 -2
  22. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -0
  23. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +134 -205
  24. data/lib/mongoid/association/embedded/embeds_many.rb +1 -0
  25. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -2
  26. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -0
  27. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +113 -55
  28. data/lib/mongoid/association/embedded/embeds_one.rb +1 -0
  29. data/lib/mongoid/association/embedded.rb +2 -0
  30. data/lib/mongoid/association/macros.rb +17 -14
  31. data/lib/mongoid/association/many.rb +1 -0
  32. data/lib/mongoid/association/marshalable.rb +4 -0
  33. data/lib/mongoid/association/nested/many.rb +8 -3
  34. data/lib/mongoid/association/nested/nested_buildable.rb +32 -0
  35. data/lib/mongoid/association/nested/one.rb +6 -3
  36. data/lib/mongoid/association/nested.rb +1 -0
  37. data/lib/mongoid/association/one.rb +1 -0
  38. data/lib/mongoid/association/options.rb +9 -2
  39. data/lib/mongoid/association/proxy.rb +30 -18
  40. data/lib/mongoid/association/referenced/auto_save.rb +6 -2
  41. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  42. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -0
  43. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -1
  44. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -14
  45. data/lib/mongoid/association/referenced/belongs_to.rb +2 -1
  46. data/lib/mongoid/association/referenced/counter_cache.rb +7 -2
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +132 -94
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +8 -3
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +43 -27
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +131 -104
  57. data/lib/mongoid/association/referenced/has_many.rb +2 -1
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -3
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +37 -28
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -1
  63. data/lib/mongoid/association/referenced/syncable.rb +7 -6
  64. data/lib/mongoid/association/referenced.rb +1 -0
  65. data/lib/mongoid/association/reflections.rb +5 -4
  66. data/lib/mongoid/association/relatable.rb +10 -4
  67. data/lib/mongoid/association.rb +5 -0
  68. data/lib/mongoid/atomic/modifiers.rb +1 -0
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +2 -1
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -0
  71. data/lib/mongoid/atomic/paths/embedded.rb +1 -0
  72. data/lib/mongoid/atomic/paths/root.rb +1 -0
  73. data/lib/mongoid/atomic/paths.rb +1 -0
  74. data/lib/mongoid/atomic.rb +23 -62
  75. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  76. data/lib/mongoid/attributes/dynamic.rb +1 -0
  77. data/lib/mongoid/attributes/embedded.rb +34 -0
  78. data/lib/mongoid/attributes/nested.rb +3 -2
  79. data/lib/mongoid/attributes/processing.rb +11 -10
  80. data/lib/mongoid/attributes/projector.rb +1 -0
  81. data/lib/mongoid/attributes/readonly.rb +4 -8
  82. data/lib/mongoid/attributes.rb +6 -4
  83. data/lib/mongoid/cacheable.rb +2 -1
  84. data/lib/mongoid/changeable.rb +58 -49
  85. data/lib/mongoid/clients/factory.rb +37 -5
  86. data/lib/mongoid/clients/options.rb +113 -3
  87. data/lib/mongoid/clients/sessions.rb +245 -64
  88. data/lib/mongoid/clients/storage_options.rb +37 -1
  89. data/lib/mongoid/clients/validators/storage.rb +1 -0
  90. data/lib/mongoid/clients/validators.rb +1 -0
  91. data/lib/mongoid/clients.rb +36 -4
  92. data/lib/mongoid/collection_configurable.rb +1 -0
  93. data/lib/mongoid/composable.rb +5 -0
  94. data/lib/mongoid/config/defaults.rb +16 -36
  95. data/lib/mongoid/config/encryption.rb +213 -0
  96. data/lib/mongoid/config/environment.rb +2 -5
  97. data/lib/mongoid/config/introspection.rb +152 -0
  98. data/lib/mongoid/config/options.rb +8 -3
  99. data/lib/mongoid/config/validators/async_query_executor.rb +12 -2
  100. data/lib/mongoid/config/validators/client.rb +1 -0
  101. data/lib/mongoid/config/validators/option.rb +1 -0
  102. data/lib/mongoid/config/validators.rb +1 -0
  103. data/lib/mongoid/config.rb +57 -91
  104. data/lib/mongoid/contextual/aggregable/memory.rb +1 -0
  105. data/lib/mongoid/contextual/aggregable/mongo.rb +2 -5
  106. data/lib/mongoid/contextual/aggregable/none.rb +1 -0
  107. data/lib/mongoid/contextual/aggregable.rb +1 -0
  108. data/lib/mongoid/contextual/atomic.rb +98 -11
  109. data/lib/mongoid/contextual/command.rb +3 -0
  110. data/lib/mongoid/contextual/map_reduce.rb +6 -0
  111. data/lib/mongoid/contextual/memory.rb +45 -42
  112. data/lib/mongoid/contextual/mongo/documents_loader.rb +3 -2
  113. data/lib/mongoid/contextual/mongo.rb +33 -61
  114. data/lib/mongoid/contextual/none.rb +15 -32
  115. data/lib/mongoid/contextual/queryable.rb +4 -0
  116. data/lib/mongoid/contextual.rb +4 -0
  117. data/lib/mongoid/copyable.rb +3 -2
  118. data/lib/mongoid/criteria/findable.rb +44 -4
  119. data/lib/mongoid/criteria/includable.rb +5 -4
  120. data/lib/mongoid/criteria/inspectable.rb +4 -0
  121. data/lib/mongoid/criteria/marshalable.rb +4 -0
  122. data/lib/mongoid/criteria/modifiable.rb +5 -0
  123. data/lib/mongoid/criteria/options.rb +1 -0
  124. data/lib/mongoid/criteria/permission.rb +5 -0
  125. data/lib/mongoid/criteria/queryable/aggregable.rb +1 -0
  126. data/lib/mongoid/criteria/queryable/expandable.rb +1 -0
  127. data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -1
  128. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -5
  129. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -1
  130. data/lib/mongoid/criteria/queryable/extensions/date.rb +4 -3
  131. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +2 -1
  132. data/lib/mongoid/criteria/queryable/extensions/hash.rb +2 -1
  133. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -1
  134. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -16
  135. data/lib/mongoid/criteria/queryable/extensions/object.rb +4 -1
  136. data/lib/mongoid/criteria/queryable/extensions/range.rb +2 -1
  137. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -1
  138. data/lib/mongoid/criteria/queryable/extensions/set.rb +2 -1
  139. data/lib/mongoid/criteria/queryable/extensions/string.rb +15 -3
  140. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +2 -1
  141. data/lib/mongoid/criteria/queryable/extensions/time.rb +2 -1
  142. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  143. data/lib/mongoid/criteria/queryable/extensions.rb +1 -0
  144. data/lib/mongoid/criteria/queryable/key.rb +10 -0
  145. data/lib/mongoid/criteria/queryable/macroable.rb +1 -0
  146. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -0
  147. data/lib/mongoid/criteria/queryable/optional.rb +1 -0
  148. data/lib/mongoid/criteria/queryable/options.rb +1 -0
  149. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -0
  150. data/lib/mongoid/criteria/queryable/selectable.rb +12 -27
  151. data/lib/mongoid/criteria/queryable/selector.rb +5 -2
  152. data/lib/mongoid/criteria/queryable/smash.rb +1 -0
  153. data/lib/mongoid/criteria/queryable/storable.rb +4 -3
  154. data/lib/mongoid/criteria/queryable.rb +1 -0
  155. data/lib/mongoid/criteria/scopable.rb +5 -0
  156. data/lib/mongoid/criteria/translator.rb +1 -0
  157. data/lib/mongoid/criteria.rb +37 -10
  158. data/lib/mongoid/deprecable.rb +1 -0
  159. data/lib/mongoid/deprecation.rb +8 -4
  160. data/lib/mongoid/document.rb +171 -125
  161. data/lib/mongoid/encryptable.rb +53 -0
  162. data/lib/mongoid/equality.rb +2 -22
  163. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -0
  164. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  165. data/lib/mongoid/errors/callback.rb +1 -0
  166. data/lib/mongoid/errors/create_collection_failure.rb +1 -0
  167. data/lib/mongoid/errors/criteria_argument_required.rb +1 -0
  168. data/lib/mongoid/errors/delete_restriction.rb +1 -0
  169. data/lib/mongoid/errors/document_not_destroyed.rb +1 -0
  170. data/lib/mongoid/errors/document_not_found.rb +1 -0
  171. data/lib/mongoid/errors/drop_collection_failure.rb +1 -0
  172. data/lib/mongoid/errors/empty_config_file.rb +1 -0
  173. data/lib/mongoid/errors/immutable_attribute.rb +1 -0
  174. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -0
  175. data/lib/mongoid/errors/invalid_async_query_executor.rb +1 -0
  176. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  177. data/lib/mongoid/errors/invalid_collection.rb +1 -0
  178. data/lib/mongoid/errors/invalid_config_file.rb +1 -0
  179. data/lib/mongoid/errors/invalid_config_option.rb +1 -0
  180. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -0
  181. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -0
  182. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +1 -0
  183. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -0
  184. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -4
  185. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  186. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -0
  187. data/lib/mongoid/errors/invalid_field.rb +1 -0
  188. data/lib/mongoid/errors/invalid_field_operator.rb +1 -0
  189. data/lib/mongoid/errors/invalid_field_option.rb +1 -0
  190. data/lib/mongoid/errors/invalid_field_type.rb +1 -0
  191. data/lib/mongoid/errors/invalid_find.rb +1 -0
  192. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +1 -0
  193. data/lib/mongoid/errors/invalid_includes.rb +1 -0
  194. data/lib/mongoid/errors/invalid_index.rb +1 -0
  195. data/lib/mongoid/errors/invalid_options.rb +1 -0
  196. data/lib/mongoid/errors/invalid_path.rb +1 -0
  197. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -0
  198. data/lib/mongoid/errors/invalid_query.rb +1 -0
  199. data/lib/mongoid/errors/invalid_relation.rb +1 -0
  200. data/lib/mongoid/errors/invalid_relation_option.rb +1 -0
  201. data/lib/mongoid/errors/invalid_scope.rb +1 -0
  202. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  203. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -1
  204. data/lib/mongoid/errors/invalid_storage_options.rb +1 -0
  205. data/lib/mongoid/errors/invalid_time.rb +1 -0
  206. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  207. data/lib/mongoid/errors/inverse_not_found.rb +1 -0
  208. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -0
  209. data/lib/mongoid/errors/mixed_relations.rb +1 -0
  210. data/lib/mongoid/errors/mongoid_error.rb +4 -3
  211. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -0
  212. data/lib/mongoid/errors/no_client_config.rb +1 -0
  213. data/lib/mongoid/errors/no_client_database.rb +1 -0
  214. data/lib/mongoid/errors/no_client_hosts.rb +1 -0
  215. data/lib/mongoid/errors/no_clients_config.rb +1 -0
  216. data/lib/mongoid/errors/no_default_client.rb +1 -0
  217. data/lib/mongoid/errors/no_environment.rb +1 -0
  218. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -0
  219. data/lib/mongoid/errors/no_metadata.rb +1 -0
  220. data/lib/mongoid/errors/no_parent.rb +1 -0
  221. data/lib/mongoid/errors/readonly_attribute.rb +1 -0
  222. data/lib/mongoid/errors/readonly_document.rb +1 -0
  223. data/lib/mongoid/errors/rollback.rb +15 -0
  224. data/lib/mongoid/errors/scope_overwrite.rb +1 -0
  225. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  226. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -0
  227. data/lib/mongoid/errors/transaction_error.rb +25 -0
  228. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  229. data/lib/mongoid/errors/unknown_attribute.rb +1 -0
  230. data/lib/mongoid/errors/unknown_model.rb +1 -0
  231. data/lib/mongoid/errors/unsaved_document.rb +1 -0
  232. data/lib/mongoid/errors/unsupported_javascript.rb +1 -0
  233. data/lib/mongoid/errors/validations.rb +1 -0
  234. data/lib/mongoid/errors.rb +10 -1
  235. data/lib/mongoid/evolvable.rb +1 -0
  236. data/lib/mongoid/extensions/array.rb +10 -24
  237. data/lib/mongoid/extensions/big_decimal.rb +14 -6
  238. data/lib/mongoid/extensions/binary.rb +3 -0
  239. data/lib/mongoid/extensions/boolean.rb +3 -0
  240. data/lib/mongoid/extensions/date.rb +7 -2
  241. data/lib/mongoid/extensions/date_time.rb +4 -6
  242. data/lib/mongoid/extensions/decimal128.rb +3 -0
  243. data/lib/mongoid/extensions/false_class.rb +5 -2
  244. data/lib/mongoid/extensions/float.rb +4 -1
  245. data/lib/mongoid/extensions/hash.rb +21 -169
  246. data/lib/mongoid/extensions/integer.rb +6 -1
  247. data/lib/mongoid/extensions/module.rb +4 -1
  248. data/lib/mongoid/extensions/nil_class.rb +5 -2
  249. data/lib/mongoid/extensions/object.rb +23 -35
  250. data/lib/mongoid/extensions/object_id.rb +3 -0
  251. data/lib/mongoid/extensions/range.rb +9 -6
  252. data/lib/mongoid/extensions/raw_value.rb +34 -0
  253. data/lib/mongoid/extensions/regexp.rb +3 -0
  254. data/lib/mongoid/extensions/set.rb +13 -2
  255. data/lib/mongoid/extensions/string.rb +18 -10
  256. data/lib/mongoid/extensions/symbol.rb +5 -0
  257. data/lib/mongoid/extensions/time.rb +7 -19
  258. data/lib/mongoid/extensions/time_with_zone.rb +6 -2
  259. data/lib/mongoid/extensions/true_class.rb +5 -2
  260. data/lib/mongoid/extensions.rb +2 -32
  261. data/lib/mongoid/factory.rb +134 -40
  262. data/lib/mongoid/fields/encrypted.rb +48 -0
  263. data/lib/mongoid/fields/foreign_key.rb +29 -3
  264. data/lib/mongoid/fields/localized.rb +6 -0
  265. data/lib/mongoid/fields/standard.rb +5 -0
  266. data/lib/mongoid/fields/validators/macro.rb +3 -1
  267. data/lib/mongoid/fields/validators.rb +1 -0
  268. data/lib/mongoid/fields.rb +41 -46
  269. data/lib/mongoid/findable.rb +2 -2
  270. data/lib/mongoid/indexable/specification.rb +55 -19
  271. data/lib/mongoid/indexable/validators/options.rb +1 -0
  272. data/lib/mongoid/indexable.rb +1 -0
  273. data/lib/mongoid/inspectable.rb +32 -0
  274. data/lib/mongoid/interceptable.rb +18 -8
  275. data/lib/mongoid/loadable.rb +83 -0
  276. data/lib/mongoid/loggable.rb +1 -0
  277. data/lib/mongoid/matchable.rb +1 -0
  278. data/lib/mongoid/matcher/all.rb +15 -0
  279. data/lib/mongoid/matcher/and.rb +14 -0
  280. data/lib/mongoid/matcher/bits.rb +19 -0
  281. data/lib/mongoid/matcher/bits_all_clear.rb +21 -0
  282. data/lib/mongoid/matcher/bits_all_set.rb +21 -0
  283. data/lib/mongoid/matcher/bits_any_clear.rb +21 -0
  284. data/lib/mongoid/matcher/bits_any_set.rb +21 -0
  285. data/lib/mongoid/matcher/elem_match.rb +15 -0
  286. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  287. data/lib/mongoid/matcher/eq.rb +15 -0
  288. data/lib/mongoid/matcher/eq_impl.rb +33 -16
  289. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +14 -2
  290. data/lib/mongoid/matcher/exists.rb +15 -0
  291. data/lib/mongoid/matcher/expression.rb +13 -0
  292. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  293. data/lib/mongoid/matcher/field_expression.rb +15 -0
  294. data/lib/mongoid/matcher/field_operator.rb +24 -0
  295. data/lib/mongoid/matcher/gt.rb +15 -0
  296. data/lib/mongoid/matcher/gte.rb +15 -0
  297. data/lib/mongoid/matcher/in.rb +15 -0
  298. data/lib/mongoid/matcher/lt.rb +15 -0
  299. data/lib/mongoid/matcher/lte.rb +15 -0
  300. data/lib/mongoid/matcher/mod.rb +16 -0
  301. data/lib/mongoid/matcher/ne.rb +15 -0
  302. data/lib/mongoid/matcher/nin.rb +15 -0
  303. data/lib/mongoid/matcher/nor.rb +14 -0
  304. data/lib/mongoid/matcher/not.rb +16 -0
  305. data/lib/mongoid/matcher/or.rb +14 -0
  306. data/lib/mongoid/matcher/regex.rb +24 -0
  307. data/lib/mongoid/matcher/size.rb +16 -0
  308. data/lib/mongoid/matcher/type.rb +25 -0
  309. data/lib/mongoid/matcher.rb +5 -15
  310. data/lib/mongoid/persistable/creatable.rb +14 -9
  311. data/lib/mongoid/persistable/deletable.rb +7 -2
  312. data/lib/mongoid/persistable/destroyable.rb +34 -7
  313. data/lib/mongoid/persistable/incrementable.rb +2 -1
  314. data/lib/mongoid/persistable/logical.rb +1 -0
  315. data/lib/mongoid/persistable/maxable.rb +37 -0
  316. data/lib/mongoid/persistable/minable.rb +37 -0
  317. data/lib/mongoid/persistable/multipliable.rb +36 -0
  318. data/lib/mongoid/persistable/poppable.rb +1 -0
  319. data/lib/mongoid/persistable/pullable.rb +1 -0
  320. data/lib/mongoid/persistable/pushable.rb +1 -0
  321. data/lib/mongoid/persistable/renamable.rb +1 -0
  322. data/lib/mongoid/persistable/savable.rb +1 -0
  323. data/lib/mongoid/persistable/settable.rb +1 -0
  324. data/lib/mongoid/persistable/unsettable.rb +1 -0
  325. data/lib/mongoid/persistable/updatable.rb +37 -18
  326. data/lib/mongoid/persistable/upsertable.rb +20 -7
  327. data/lib/mongoid/persistable.rb +11 -1
  328. data/lib/mongoid/persistence_context.rb +46 -6
  329. data/lib/mongoid/positional.rb +1 -0
  330. data/lib/mongoid/railtie.rb +24 -1
  331. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  332. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  333. data/lib/mongoid/railties/controller_runtime.rb +20 -4
  334. data/lib/mongoid/railties/database.rake +12 -0
  335. data/lib/mongoid/reloadable.rb +38 -30
  336. data/lib/mongoid/scopable.rb +19 -23
  337. data/lib/mongoid/search_indexable.rb +167 -0
  338. data/lib/mongoid/selectable.rb +1 -0
  339. data/lib/mongoid/serializable.rb +8 -7
  340. data/lib/mongoid/shardable.rb +1 -0
  341. data/lib/mongoid/stateful.rb +9 -3
  342. data/lib/mongoid/stringified_symbol.rb +19 -6
  343. data/lib/mongoid/tasks/database.rake +13 -0
  344. data/lib/mongoid/tasks/database.rb +63 -0
  345. data/lib/mongoid/tasks/encryption.rake +59 -0
  346. data/lib/mongoid/tasks/encryption.rb +108 -0
  347. data/lib/mongoid/threaded/lifecycle.rb +1 -0
  348. data/lib/mongoid/threaded.rb +94 -30
  349. data/lib/mongoid/timestamps/created/short.rb +1 -0
  350. data/lib/mongoid/timestamps/created.rb +5 -11
  351. data/lib/mongoid/timestamps/short.rb +1 -0
  352. data/lib/mongoid/timestamps/timeless.rb +29 -0
  353. data/lib/mongoid/timestamps/updated/short.rb +1 -0
  354. data/lib/mongoid/timestamps/updated.rb +2 -1
  355. data/lib/mongoid/timestamps.rb +1 -0
  356. data/lib/mongoid/touchable.rb +154 -49
  357. data/lib/mongoid/traversable.rb +127 -122
  358. data/lib/mongoid/utils.rb +32 -2
  359. data/lib/mongoid/validatable/associated.rb +3 -5
  360. data/lib/mongoid/validatable/format.rb +1 -0
  361. data/lib/mongoid/validatable/length.rb +1 -0
  362. data/lib/mongoid/validatable/localizable.rb +1 -0
  363. data/lib/mongoid/validatable/macros.rb +5 -15
  364. data/lib/mongoid/validatable/presence.rb +1 -0
  365. data/lib/mongoid/validatable/queryable.rb +9 -0
  366. data/lib/mongoid/validatable/uniqueness.rb +2 -1
  367. data/lib/mongoid/validatable.rb +3 -3
  368. data/lib/mongoid/version.rb +2 -5
  369. data/lib/mongoid/warnings.rb +9 -16
  370. data/lib/mongoid.rb +38 -5
  371. data/lib/rails/generators/mongoid/config/config_generator.rb +17 -3
  372. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +36 -62
  374. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -0
  375. data/lib/rails/generators/mongoid_generator.rb +13 -0
  376. data/lib/rails/mongoid.rb +4 -29
  377. data/spec/config/mongoid.yml +0 -1
  378. data/spec/integration/active_job_spec.rb +32 -0
  379. data/spec/integration/app_spec.rb +72 -58
  380. data/spec/integration/associations/belongs_to_spec.rb +1 -0
  381. data/spec/integration/associations/embedded_dirty_spec.rb +1 -0
  382. data/spec/integration/associations/embedded_spec.rb +75 -6
  383. data/spec/integration/associations/embeds_many_spec.rb +1 -41
  384. data/spec/integration/associations/embeds_one_spec.rb +6 -25
  385. data/spec/integration/associations/foreign_key_spec.rb +1 -0
  386. data/spec/integration/associations/foreign_key_spec_models.rb +1 -0
  387. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +1 -0
  388. data/spec/integration/associations/has_many_spec.rb +1 -0
  389. data/spec/integration/associations/has_one_spec.rb +1 -0
  390. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -0
  391. data/spec/integration/associations/reverse_population_spec.rb +1 -0
  392. data/spec/integration/associations/reverse_population_spec_models.rb +1 -0
  393. data/spec/integration/associations/scope_option_spec.rb +1 -0
  394. data/spec/integration/atomic/modifiers_spec.rb +1 -0
  395. data/spec/integration/bson_regexp_raw_spec.rb +1 -0
  396. data/spec/integration/callbacks_models.rb +3 -2
  397. data/spec/integration/callbacks_spec.rb +2 -1
  398. data/spec/integration/contextual/empty_spec.rb +1 -0
  399. data/spec/integration/criteria/alias_query_spec.rb +25 -88
  400. data/spec/integration/criteria/date_field_spec.rb +1 -0
  401. data/spec/integration/criteria/default_scope_spec.rb +1 -0
  402. data/spec/integration/criteria/logical_spec.rb +10 -28
  403. data/spec/integration/criteria/range_spec.rb +1 -2
  404. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  405. data/spec/integration/criteria/time_with_zone_spec.rb +1 -0
  406. data/spec/integration/discriminator_key_spec.rb +1 -0
  407. data/spec/integration/discriminator_value_spec.rb +1 -0
  408. data/spec/integration/document_spec.rb +1 -0
  409. data/spec/integration/dots_and_dollars_spec.rb +1 -0
  410. data/spec/integration/encryption_spec.rb +100 -0
  411. data/spec/integration/i18n_fallbacks_spec.rb +7 -33
  412. data/spec/integration/matcher_examples_spec.rb +1 -0
  413. data/spec/integration/matcher_operator_data/bits_all_clear.yml +0 -15
  414. data/spec/integration/matcher_operator_data/bits_all_set.yml +0 -15
  415. data/spec/integration/matcher_operator_data/bits_any_clear.yml +0 -15
  416. data/spec/integration/matcher_operator_data/bits_any_set.yml +0 -15
  417. data/spec/integration/matcher_operator_data/size.yml +0 -3
  418. data/spec/integration/matcher_operator_data/type.yml +0 -6
  419. data/spec/integration/matcher_operator_data/type_array.yml +0 -1
  420. data/spec/integration/matcher_operator_data/type_decimal.yml +0 -4
  421. data/spec/integration/matcher_operator_spec.rb +1 -0
  422. data/spec/integration/matcher_spec.rb +21 -66
  423. data/spec/integration/persistence/range_field_spec.rb +1 -0
  424. data/spec/integration/server_query_spec.rb +1 -0
  425. data/spec/integration/shardable_spec.rb +1 -0
  426. data/spec/integration/stringified_symbol_field_spec.rb +1 -0
  427. data/spec/lite_spec_helper.rb +36 -10
  428. data/spec/mongoid/association/accessors_spec.rb +11 -28
  429. data/spec/mongoid/association/auto_save_spec.rb +1 -0
  430. data/spec/mongoid/association/builders_spec.rb +1 -0
  431. data/spec/mongoid/association/constrainable_spec.rb +1 -0
  432. data/spec/mongoid/association/counter_cache_spec.rb +1 -0
  433. data/spec/mongoid/association/depending_spec.rb +1 -0
  434. data/spec/mongoid/association/eager_spec.rb +52 -24
  435. data/spec/mongoid/association/embedded/cyclic_spec.rb +1 -0
  436. data/spec/mongoid/association/embedded/dirty_spec.rb +1 -0
  437. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +1 -0
  438. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +1 -0
  439. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +1 -0
  440. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -7
  441. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -0
  442. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +1 -0
  443. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +1 -0
  444. data/spec/mongoid/association/embedded/embeds_many_models.rb +17 -2
  445. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +4 -7
  446. data/spec/mongoid/association/embedded/embeds_many_spec.rb +1 -0
  447. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -0
  448. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +1 -0
  449. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1 -0
  450. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -0
  451. data/spec/mongoid/association/embedded/embeds_one_models.rb +6 -1
  452. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -1
  453. data/spec/mongoid/association/embedded/embeds_one_spec.rb +1 -0
  454. data/spec/mongoid/association/macros_spec.rb +1 -0
  455. data/spec/mongoid/association/nested/many_spec.rb +1 -0
  456. data/spec/mongoid/association/nested/one_spec.rb +1 -0
  457. data/spec/mongoid/association/options_spec.rb +1 -0
  458. data/spec/mongoid/association/polymorphic_spec.rb +1 -0
  459. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +1 -0
  460. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +1 -0
  461. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +1 -0
  462. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1 -4
  463. data/spec/mongoid/association/referenced/belongs_to_models.rb +1 -0
  464. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +2 -1
  465. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1 -0
  466. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +2 -1
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +1 -0
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -31
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +1 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -1
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1 -0
  474. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -0
  475. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +1 -0
  476. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +1 -0
  477. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -0
  478. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1085 -2002
  480. data/spec/mongoid/association/referenced/has_many_models.rb +1 -0
  481. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -1
  482. data/spec/mongoid/association/referenced/has_many_spec.rb +1 -0
  483. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -0
  484. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +1 -0
  485. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +1 -0
  486. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1 -0
  487. data/spec/mongoid/association/referenced/has_one_models.rb +1 -0
  488. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -1
  489. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -0
  490. data/spec/mongoid/association/reflections_spec.rb +1 -0
  491. data/spec/mongoid/association/syncable_spec.rb +1 -0
  492. data/spec/mongoid/association_spec.rb +1 -0
  493. data/spec/mongoid/atomic/modifiers_spec.rb +1 -0
  494. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -0
  495. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -0
  496. data/spec/mongoid/atomic/paths/root_spec.rb +1 -0
  497. data/spec/mongoid/atomic/paths_spec.rb +1 -0
  498. data/spec/mongoid/atomic_spec.rb +1 -0
  499. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  500. data/spec/mongoid/attributes/dynamic_spec.rb +1 -0
  501. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  502. data/spec/mongoid/attributes/nested_spec.rb +1 -0
  503. data/spec/mongoid/attributes/nested_spec_models.rb +1 -0
  504. data/spec/mongoid/attributes/projector_spec.rb +1 -0
  505. data/spec/mongoid/attributes/readonly_spec.rb +1 -19
  506. data/spec/mongoid/attributes_spec.rb +18 -35
  507. data/spec/mongoid/cacheable_spec.rb +1 -0
  508. data/spec/mongoid/changeable_spec.rb +4 -3
  509. data/spec/mongoid/clients/factory_spec.rb +77 -30
  510. data/spec/mongoid/clients/options_spec.rb +9 -5
  511. data/spec/mongoid/clients/sessions_spec.rb +27 -10
  512. data/spec/mongoid/clients/transactions_spec.rb +958 -185
  513. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  514. data/spec/mongoid/clients_spec.rb +47 -2
  515. data/spec/mongoid/collection_configurable_spec.rb +1 -0
  516. data/spec/mongoid/composable_spec.rb +1 -0
  517. data/spec/mongoid/config/defaults_spec.rb +31 -92
  518. data/spec/mongoid/config/encryption_spec.rb +152 -0
  519. data/spec/mongoid/config/environment_spec.rb +13 -41
  520. data/spec/mongoid/config/introspection_spec.rb +114 -0
  521. data/spec/mongoid/config/options_spec.rb +1 -0
  522. data/spec/mongoid/config_spec.rb +20 -133
  523. data/spec/mongoid/contextual/aggregable/memory_spec.rb +1 -0
  524. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +1 -0
  525. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +5 -29
  526. data/spec/mongoid/contextual/aggregable/none_spec.rb +3 -14
  527. data/spec/mongoid/contextual/atomic_spec.rb +203 -12
  528. data/spec/mongoid/contextual/map_reduce_spec.rb +1 -0
  529. data/spec/mongoid/contextual/memory_spec.rb +364 -534
  530. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +10 -3
  531. data/spec/mongoid/contextual/mongo_spec.rb +101 -283
  532. data/spec/mongoid/contextual/none_spec.rb +1 -0
  533. data/spec/mongoid/copyable_spec.rb +1 -0
  534. data/spec/mongoid/copyable_spec_models.rb +1 -0
  535. data/spec/mongoid/criteria/findable_spec.rb +191 -0
  536. data/spec/mongoid/criteria/includable_spec.rb +1 -0
  537. data/spec/mongoid/criteria/includable_spec_models.rb +1 -0
  538. data/spec/mongoid/criteria/inspectable_spec.rb +1 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +3 -2
  540. data/spec/mongoid/criteria/modifiable_spec.rb +1 -0
  541. data/spec/mongoid/criteria/options_spec.rb +1 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +1 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +8 -7
  546. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -0
  547. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +21 -11
  548. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +1 -0
  549. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -0
  550. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -0
  551. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -0
  552. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -0
  553. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +1 -0
  554. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -0
  555. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +1 -0
  556. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -11
  557. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -11
  558. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -0
  559. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -66
  560. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -0
  561. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +1 -0
  562. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +1 -0
  563. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -0
  564. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +1 -0
  565. data/spec/mongoid/criteria/queryable/optional_spec.rb +1 -0
  566. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -0
  567. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -0
  568. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -0
  569. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +4 -3
  570. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +1 -0
  571. data/spec/mongoid/criteria/queryable/selectable_spec.rb +51 -214
  572. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +1 -0
  573. data/spec/mongoid/criteria/queryable/selector_spec.rb +96 -0
  574. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -0
  575. data/spec/mongoid/criteria/queryable/storable_spec.rb +10 -32
  576. data/spec/mongoid/criteria/scopable_spec.rb +1 -0
  577. data/spec/mongoid/criteria/translator_spec.rb +1 -0
  578. data/spec/mongoid/criteria_projection_spec.rb +6 -5
  579. data/spec/mongoid/criteria_spec.rb +221 -359
  580. data/spec/mongoid/document_fields_spec.rb +1 -0
  581. data/spec/mongoid/document_persistence_context_spec.rb +77 -0
  582. data/spec/mongoid/document_query_spec.rb +5 -4
  583. data/spec/mongoid/document_spec.rb +3 -148
  584. data/spec/mongoid/equality_spec.rb +41 -149
  585. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -0
  586. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  587. data/spec/mongoid/errors/callback_spec.rb +1 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -0
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +1 -0
  591. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -0
  592. data/spec/mongoid/errors/invalid_config_file_spec.rb +1 -0
  593. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -0
  594. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -0
  595. data/spec/mongoid/errors/invalid_field_spec.rb +1 -0
  596. data/spec/mongoid/errors/invalid_field_type_spec.rb +1 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +1 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +1 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +1 -0
  601. data/spec/mongoid/errors/invalid_path_spec.rb +1 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -0
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +1 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -0
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +9 -22
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -0
  612. data/spec/mongoid/errors/no_client_config_spec.rb +1 -0
  613. data/spec/mongoid/errors/no_client_database_spec.rb +1 -0
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -0
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +1 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +1 -0
  619. data/spec/mongoid/errors/no_parent_spec.rb +1 -0
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +1 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +1 -0
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -0
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -0
  627. data/spec/mongoid/errors/validations_spec.rb +1 -0
  628. data/spec/mongoid/extensions/array_spec.rb +3 -262
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +5 -4
  630. data/spec/mongoid/extensions/binary_spec.rb +1 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +1 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +8 -7
  633. data/spec/mongoid/extensions/date_spec.rb +3 -20
  634. data/spec/mongoid/extensions/date_time_spec.rb +3 -9
  635. data/spec/mongoid/extensions/decimal128_spec.rb +1 -0
  636. data/spec/mongoid/extensions/false_class_spec.rb +1 -7
  637. data/spec/mongoid/extensions/float_spec.rb +3 -9
  638. data/spec/mongoid/extensions/hash_spec.rb +19 -458
  639. data/spec/mongoid/extensions/integer_spec.rb +3 -8
  640. data/spec/mongoid/extensions/module_spec.rb +1 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +1 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +1 -0
  643. data/spec/mongoid/extensions/object_spec.rb +1 -176
  644. data/spec/mongoid/extensions/range_spec.rb +1 -11
  645. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  646. data/spec/mongoid/extensions/regexp_spec.rb +1 -0
  647. data/spec/mongoid/extensions/set_spec.rb +2 -3
  648. data/spec/mongoid/extensions/string_spec.rb +3 -113
  649. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -0
  650. data/spec/mongoid/extensions/symbol_spec.rb +1 -31
  651. data/spec/mongoid/extensions/time_spec.rb +32 -350
  652. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -30
  653. data/spec/mongoid/extensions/true_class_spec.rb +1 -7
  654. data/spec/mongoid/factory_spec.rb +1 -0
  655. data/spec/mongoid/fields/foreign_key_spec.rb +282 -119
  656. data/spec/mongoid/fields/localized_spec.rb +1 -0
  657. data/spec/mongoid/fields/standard_spec.rb +1 -0
  658. data/spec/mongoid/fields_spec.rb +60 -66
  659. data/spec/mongoid/findable_spec.rb +2 -61
  660. data/spec/mongoid/indexable/specification_spec.rb +132 -13
  661. data/spec/mongoid/indexable_spec.rb +323 -9
  662. data/spec/mongoid/inspectable_spec.rb +81 -0
  663. data/spec/mongoid/interceptable_spec.rb +3 -82
  664. data/spec/mongoid/interceptable_spec_models.rb +112 -47
  665. data/spec/mongoid/loading_spec.rb +110 -0
  666. data/spec/mongoid/loggable_spec.rb +1 -0
  667. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -0
  668. data/spec/mongoid/mongoizable_spec.rb +1 -0
  669. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  670. data/spec/mongoid/persistable/creatable_spec.rb +1 -0
  671. data/spec/mongoid/persistable/deletable_spec.rb +78 -31
  672. data/spec/mongoid/persistable/destroyable_spec.rb +230 -52
  673. data/spec/mongoid/persistable/incrementable_spec.rb +1 -0
  674. data/spec/mongoid/persistable/logical_spec.rb +1 -0
  675. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  676. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  677. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  678. data/spec/mongoid/persistable/poppable_spec.rb +1 -0
  679. data/spec/mongoid/persistable/pullable_spec.rb +1 -0
  680. data/spec/mongoid/persistable/pushable_spec.rb +1 -0
  681. data/spec/mongoid/persistable/renamable_spec.rb +1 -0
  682. data/spec/mongoid/persistable/savable_spec.rb +2 -6
  683. data/spec/mongoid/persistable/settable_spec.rb +5 -4
  684. data/spec/mongoid/persistable/unsettable_spec.rb +1 -0
  685. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  686. data/spec/mongoid/persistable/upsertable_spec.rb +34 -1
  687. data/spec/mongoid/persistable_spec.rb +1 -0
  688. data/spec/mongoid/persistence_context_spec.rb +1 -0
  689. data/spec/mongoid/positional_spec.rb +1 -0
  690. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  691. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  692. data/spec/mongoid/relations/proxy_spec.rb +1 -0
  693. data/spec/mongoid/reloadable_spec.rb +28 -83
  694. data/spec/mongoid/scopable_spec.rb +39 -50
  695. data/spec/mongoid/search_indexable_spec.rb +147 -0
  696. data/spec/mongoid/selectable_spec.rb +1 -0
  697. data/spec/mongoid/serializable_spec.rb +10 -16
  698. data/spec/mongoid/shardable_models.rb +1 -0
  699. data/spec/mongoid/shardable_spec.rb +1 -0
  700. data/spec/mongoid/stateful_spec.rb +1 -0
  701. data/spec/mongoid/tasks/database_rake_spec.rb +127 -49
  702. data/spec/mongoid/tasks/database_spec.rb +48 -1
  703. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  704. data/spec/mongoid/threaded_spec.rb +38 -0
  705. data/spec/mongoid/timestamps/created/short_spec.rb +1 -0
  706. data/spec/mongoid/timestamps/created_spec.rb +1 -23
  707. data/spec/mongoid/timestamps/timeless_spec.rb +1 -0
  708. data/spec/mongoid/timestamps/updated/short_spec.rb +1 -0
  709. data/spec/mongoid/timestamps/updated_spec.rb +1 -0
  710. data/spec/mongoid/timestamps_spec.rb +1 -0
  711. data/spec/mongoid/timestamps_spec_models.rb +1 -0
  712. data/spec/mongoid/touchable_spec.rb +485 -69
  713. data/spec/mongoid/touchable_spec_models.rb +96 -1
  714. data/spec/mongoid/traversable_spec.rb +1 -0
  715. data/spec/mongoid/validatable/associated_spec.rb +5 -14
  716. data/spec/mongoid/validatable/format_spec.rb +1 -0
  717. data/spec/mongoid/validatable/length_spec.rb +1 -0
  718. data/spec/mongoid/validatable/numericality_spec.rb +1 -16
  719. data/spec/mongoid/validatable/presence_spec.rb +1 -0
  720. data/spec/mongoid/validatable/uniqueness_spec.rb +48 -3
  721. data/spec/mongoid/validatable_spec.rb +1 -0
  722. data/spec/mongoid/warnings_spec.rb +1 -0
  723. data/spec/mongoid_spec.rb +27 -0
  724. data/spec/rails/controller_extension/controller_runtime_spec.rb +1 -0
  725. data/spec/rails/mongoid_spec.rb +26 -117
  726. data/spec/shared/lib/mrss/docker_runner.rb +1 -1
  727. data/spec/shared/lib/mrss/server_version_registry.rb +1 -1
  728. data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
  729. data/spec/shared/share/Dockerfile.erb +34 -4
  730. data/spec/shared/shlib/distro.sh +0 -10
  731. data/spec/shared/shlib/server.sh +27 -33
  732. data/spec/shared/shlib/set_env.sh +42 -6
  733. data/spec/spec_helper.rb +26 -28
  734. data/spec/support/authorization.rb +1 -0
  735. data/spec/support/client_registry.rb +1 -0
  736. data/spec/support/constraints.rb +1 -0
  737. data/spec/support/crypt/models.rb +50 -0
  738. data/spec/support/crypt.rb +80 -0
  739. data/spec/support/expectations.rb +18 -20
  740. data/spec/support/feature_sandbox.rb +72 -0
  741. data/spec/support/helpers.rb +1 -0
  742. data/spec/support/immutable_ids.rb +22 -21
  743. data/spec/support/macros.rb +4 -6
  744. data/spec/support/models/account.rb +1 -0
  745. data/spec/support/models/acolyte.rb +1 -0
  746. data/spec/support/models/actor.rb +1 -0
  747. data/spec/support/models/actress.rb +1 -0
  748. data/spec/support/models/address.rb +3 -0
  749. data/spec/support/models/address_component.rb +1 -0
  750. data/spec/support/models/address_number.rb +1 -0
  751. data/spec/support/models/agency.rb +1 -0
  752. data/spec/support/models/agent.rb +1 -0
  753. data/spec/support/models/album.rb +1 -0
  754. data/spec/support/models/alert.rb +1 -0
  755. data/spec/support/models/animal.rb +1 -0
  756. data/spec/support/models/answer.rb +1 -0
  757. data/spec/support/models/appointment.rb +1 -0
  758. data/spec/support/models/armrest.rb +1 -0
  759. data/spec/support/models/array_field.rb +1 -0
  760. data/spec/support/models/article.rb +1 -0
  761. data/spec/support/models/artist.rb +1 -0
  762. data/spec/support/models/artwork.rb +1 -0
  763. data/spec/support/models/audible_sound.rb +1 -0
  764. data/spec/support/models/audio.rb +1 -0
  765. data/spec/support/models/augmentation.rb +1 -0
  766. data/spec/support/models/author.rb +1 -0
  767. data/spec/support/models/baby.rb +1 -0
  768. data/spec/support/models/band.rb +5 -1
  769. data/spec/support/models/bar.rb +1 -0
  770. data/spec/support/models/basic.rb +1 -0
  771. data/spec/support/models/bed.rb +1 -0
  772. data/spec/support/models/big_palette.rb +1 -0
  773. data/spec/support/models/birthday.rb +1 -0
  774. data/spec/support/models/bolt.rb +1 -0
  775. data/spec/support/models/bomb.rb +1 -0
  776. data/spec/support/models/book.rb +1 -0
  777. data/spec/support/models/breed.rb +1 -0
  778. data/spec/support/models/browser.rb +1 -0
  779. data/spec/support/models/building.rb +1 -0
  780. data/spec/support/models/building_address.rb +1 -0
  781. data/spec/support/models/bus.rb +1 -0
  782. data/spec/support/models/business.rb +1 -0
  783. data/spec/support/models/callback_test.rb +1 -0
  784. data/spec/support/models/canvas.rb +1 -0
  785. data/spec/support/models/car.rb +1 -0
  786. data/spec/support/models/cat.rb +1 -0
  787. data/spec/support/models/catalog.rb +1 -0
  788. data/spec/support/models/category.rb +1 -0
  789. data/spec/support/models/child.rb +1 -0
  790. data/spec/support/models/child_doc.rb +1 -0
  791. data/spec/support/models/church.rb +1 -0
  792. data/spec/support/models/circle.rb +1 -0
  793. data/spec/support/models/circuit.rb +1 -0
  794. data/spec/support/models/circus.rb +1 -0
  795. data/spec/support/models/code.rb +1 -0
  796. data/spec/support/models/coding/pull_request.rb +1 -0
  797. data/spec/support/models/coding.rb +1 -0
  798. data/spec/support/models/comment.rb +1 -0
  799. data/spec/support/models/company.rb +1 -0
  800. data/spec/support/models/consumption_period.rb +1 -0
  801. data/spec/support/models/contextable_item.rb +1 -0
  802. data/spec/support/models/contractor.rb +1 -0
  803. data/spec/support/models/cookie.rb +1 -0
  804. data/spec/support/models/country_code.rb +1 -0
  805. data/spec/support/models/courier_job.rb +1 -0
  806. data/spec/support/models/cover.rb +1 -0
  807. data/spec/support/models/crate.rb +1 -0
  808. data/spec/support/models/customer.rb +1 -0
  809. data/spec/support/models/customer_address.rb +1 -0
  810. data/spec/support/models/deed.rb +1 -0
  811. data/spec/support/models/definition.rb +1 -0
  812. data/spec/support/models/delegating_patient.rb +1 -0
  813. data/spec/support/models/description.rb +1 -0
  814. data/spec/support/models/dictionary.rb +1 -0
  815. data/spec/support/models/division.rb +1 -0
  816. data/spec/support/models/doctor.rb +1 -0
  817. data/spec/support/models/dog.rb +1 -0
  818. data/spec/support/models/dokument.rb +1 -0
  819. data/spec/support/models/draft.rb +1 -0
  820. data/spec/support/models/dragon.rb +1 -0
  821. data/spec/support/models/driver.rb +1 -0
  822. data/spec/support/models/drug.rb +1 -0
  823. data/spec/support/models/dungeon.rb +1 -0
  824. data/spec/support/models/edit.rb +1 -0
  825. data/spec/support/models/email.rb +1 -0
  826. data/spec/support/models/employer.rb +1 -0
  827. data/spec/support/models/entry.rb +1 -0
  828. data/spec/support/models/eraser.rb +1 -0
  829. data/spec/support/models/even.rb +1 -0
  830. data/spec/support/models/event.rb +1 -0
  831. data/spec/support/models/exhibition.rb +1 -0
  832. data/spec/support/models/exhibitor.rb +1 -0
  833. data/spec/support/models/explosion.rb +1 -0
  834. data/spec/support/models/eye.rb +1 -0
  835. data/spec/support/models/eye_bowl.rb +1 -0
  836. data/spec/support/models/face.rb +1 -0
  837. data/spec/support/models/fanatic.rb +1 -0
  838. data/spec/support/models/favorite.rb +8 -1
  839. data/spec/support/models/filesystem.rb +1 -0
  840. data/spec/support/models/fire_hydrant.rb +1 -0
  841. data/spec/support/models/firefox.rb +1 -0
  842. data/spec/support/models/fish.rb +1 -0
  843. data/spec/support/models/folder.rb +1 -0
  844. data/spec/support/models/folder_item.rb +1 -0
  845. data/spec/support/models/fruits.rb +1 -0
  846. data/spec/support/models/game.rb +1 -0
  847. data/spec/support/models/ghost.rb +1 -0
  848. data/spec/support/models/guitar.rb +1 -0
  849. data/spec/support/models/hole.rb +1 -0
  850. data/spec/support/models/home.rb +1 -0
  851. data/spec/support/models/house.rb +1 -0
  852. data/spec/support/models/html_writer.rb +1 -0
  853. data/spec/support/models/id_key.rb +1 -0
  854. data/spec/support/models/idnodef.rb +1 -0
  855. data/spec/support/models/image.rb +1 -0
  856. data/spec/support/models/implant.rb +1 -0
  857. data/spec/support/models/instrument.rb +1 -0
  858. data/spec/support/models/item.rb +1 -0
  859. data/spec/support/models/jar.rb +1 -0
  860. data/spec/support/models/kaleidoscope.rb +1 -0
  861. data/spec/support/models/kangaroo.rb +1 -0
  862. data/spec/support/models/label.rb +1 -0
  863. data/spec/support/models/language.rb +1 -0
  864. data/spec/support/models/lat_lng.rb +1 -6
  865. data/spec/support/models/league.rb +1 -0
  866. data/spec/support/models/learner.rb +1 -0
  867. data/spec/support/models/line_item.rb +1 -0
  868. data/spec/support/models/location.rb +1 -0
  869. data/spec/support/models/login.rb +1 -0
  870. data/spec/support/models/manufacturer.rb +1 -0
  871. data/spec/support/models/meat.rb +1 -0
  872. data/spec/support/models/membership.rb +1 -0
  873. data/spec/support/models/message.rb +1 -0
  874. data/spec/support/models/minim.rb +1 -0
  875. data/spec/support/models/mixed_drink.rb +1 -0
  876. data/spec/support/models/mop.rb +1 -0
  877. data/spec/support/models/movie.rb +1 -0
  878. data/spec/support/models/my_hash.rb +1 -0
  879. data/spec/support/models/name.rb +1 -0
  880. data/spec/support/models/name_only.rb +1 -0
  881. data/spec/support/models/node.rb +1 -0
  882. data/spec/support/models/note.rb +1 -0
  883. data/spec/support/models/nut.rb +1 -0
  884. data/spec/support/models/odd.rb +1 -0
  885. data/spec/support/models/order.rb +1 -0
  886. data/spec/support/models/ordered_post.rb +1 -0
  887. data/spec/support/models/ordered_preference.rb +1 -0
  888. data/spec/support/models/oscar.rb +1 -0
  889. data/spec/support/models/other_owner_object.rb +1 -0
  890. data/spec/support/models/override.rb +1 -0
  891. data/spec/support/models/ownable.rb +1 -0
  892. data/spec/support/models/owner.rb +1 -0
  893. data/spec/support/models/pack.rb +1 -0
  894. data/spec/support/models/page.rb +1 -0
  895. data/spec/support/models/page_question.rb +1 -0
  896. data/spec/support/models/palette.rb +1 -0
  897. data/spec/support/models/parent.rb +1 -0
  898. data/spec/support/models/parent_doc.rb +1 -0
  899. data/spec/support/models/passport.rb +1 -0
  900. data/spec/support/models/patient.rb +1 -0
  901. data/spec/support/models/pdf_writer.rb +1 -0
  902. data/spec/support/models/pencil.rb +1 -0
  903. data/spec/support/models/person.rb +1 -0
  904. data/spec/support/models/pet.rb +1 -0
  905. data/spec/support/models/pet_owner.rb +1 -0
  906. data/spec/support/models/phone.rb +1 -0
  907. data/spec/support/models/piano.rb +1 -0
  908. data/spec/support/models/pizza.rb +1 -0
  909. data/spec/support/models/player.rb +1 -0
  910. data/spec/support/models/post.rb +1 -0
  911. data/spec/support/models/post_genre.rb +1 -0
  912. data/spec/support/models/powerup.rb +1 -0
  913. data/spec/support/models/preference.rb +1 -0
  914. data/spec/support/models/princess.rb +1 -0
  915. data/spec/support/models/product.rb +1 -0
  916. data/spec/support/models/profile.rb +1 -0
  917. data/spec/support/models/pronunciation.rb +1 -0
  918. data/spec/support/models/pub.rb +1 -0
  919. data/spec/support/models/publication/encyclopedia.rb +1 -0
  920. data/spec/support/models/publication/review.rb +1 -0
  921. data/spec/support/models/publication.rb +1 -0
  922. data/spec/support/models/purchase.rb +1 -0
  923. data/spec/support/models/purchased_item.rb +1 -0
  924. data/spec/support/models/question.rb +1 -0
  925. data/spec/support/models/quiz.rb +1 -0
  926. data/spec/support/models/rating.rb +1 -0
  927. data/spec/support/models/record.rb +1 -0
  928. data/spec/support/models/registry.rb +1 -0
  929. data/spec/support/models/role.rb +1 -0
  930. data/spec/support/models/root_category.rb +1 -0
  931. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  932. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  933. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  934. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  935. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  936. data/spec/support/models/sandwich.rb +1 -0
  937. data/spec/support/models/scheduler.rb +1 -0
  938. data/spec/support/models/school.rb +1 -0
  939. data/spec/support/models/scribe.rb +1 -0
  940. data/spec/support/models/sealer.rb +1 -0
  941. data/spec/support/models/seat.rb +1 -0
  942. data/spec/support/models/seo.rb +1 -0
  943. data/spec/support/models/series.rb +1 -0
  944. data/spec/support/models/server.rb +1 -0
  945. data/spec/support/models/service.rb +1 -0
  946. data/spec/support/models/shape.rb +1 -0
  947. data/spec/support/models/shelf.rb +1 -0
  948. data/spec/support/models/shield.rb +1 -0
  949. data/spec/support/models/shipment_address.rb +1 -0
  950. data/spec/support/models/shipping_container.rb +1 -0
  951. data/spec/support/models/shipping_pack.rb +1 -0
  952. data/spec/support/models/shirt.rb +1 -0
  953. data/spec/support/models/shop.rb +1 -0
  954. data/spec/support/models/short_agent.rb +1 -0
  955. data/spec/support/models/short_quiz.rb +1 -0
  956. data/spec/support/models/simple.rb +1 -0
  957. data/spec/support/models/slave.rb +1 -0
  958. data/spec/support/models/song.rb +1 -0
  959. data/spec/support/models/sound.rb +1 -0
  960. data/spec/support/models/spacer.rb +1 -0
  961. data/spec/support/models/square.rb +1 -0
  962. data/spec/support/models/staff.rb +1 -0
  963. data/spec/support/models/store_as_dup_test1.rb +1 -0
  964. data/spec/support/models/store_as_dup_test2.rb +1 -0
  965. data/spec/support/models/store_as_dup_test3.rb +1 -0
  966. data/spec/support/models/store_as_dup_test4.rb +1 -0
  967. data/spec/support/models/strategy.rb +1 -0
  968. data/spec/support/models/student.rb +1 -0
  969. data/spec/support/models/sub_item.rb +1 -0
  970. data/spec/support/models/subscription.rb +1 -0
  971. data/spec/support/models/survey.rb +1 -0
  972. data/spec/support/models/symptom.rb +1 -0
  973. data/spec/support/models/system_role.rb +1 -0
  974. data/spec/support/models/tag.rb +1 -0
  975. data/spec/support/models/target.rb +1 -0
  976. data/spec/support/models/template.rb +1 -0
  977. data/spec/support/models/thing.rb +1 -0
  978. data/spec/support/models/threadlocker.rb +1 -0
  979. data/spec/support/models/title.rb +1 -0
  980. data/spec/support/models/tool.rb +1 -0
  981. data/spec/support/models/topping.rb +1 -0
  982. data/spec/support/models/toy.rb +1 -0
  983. data/spec/support/models/track.rb +1 -0
  984. data/spec/support/models/translation.rb +1 -0
  985. data/spec/support/models/tree.rb +1 -0
  986. data/spec/support/models/truck.rb +1 -0
  987. data/spec/support/models/updatable.rb +1 -0
  988. data/spec/support/models/user.rb +1 -0
  989. data/spec/support/models/user_account.rb +1 -0
  990. data/spec/support/models/validation_callback.rb +1 -0
  991. data/spec/support/models/vehicle.rb +1 -0
  992. data/spec/support/models/version.rb +1 -0
  993. data/spec/support/models/vertex.rb +1 -0
  994. data/spec/support/models/vet_visit.rb +1 -0
  995. data/spec/support/models/video.rb +1 -0
  996. data/spec/support/models/video_game.rb +1 -0
  997. data/spec/support/models/washer.rb +1 -0
  998. data/spec/support/models/weapon.rb +1 -0
  999. data/spec/support/models/wiki_page.rb +1 -0
  1000. data/spec/support/models/word.rb +1 -0
  1001. data/spec/support/models/word_origin.rb +1 -0
  1002. data/spec/support/models/writer.rb +1 -0
  1003. data/spec/support/rails_mock.rb +32 -0
  1004. data/spec/support/shared/time.rb +3 -21
  1005. data/spec/support/sinatra_mock.rb +7 -0
  1006. data/spec/support/spec_config.rb +30 -9
  1007. data.tar.gz.sig +0 -0
  1008. metadata +127 -48
  1009. metadata.gz.sig +1 -0
  1010. data/lib/mongoid/association/referenced/eager.rb +0 -163
  1011. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -113
  1012. data/lib/mongoid/contextual/geo_near.rb +0 -236
  1013. data/lib/mongoid/errors/invalid_session_use.rb +0 -21
  1014. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -27
  1015. data/lib/mongoid/query_cache.rb +0 -68
  1016. data/lib/mongoid/validatable/numericality.rb +0 -19
  1017. data/spec/mongoid/contextual/geo_near_spec.rb +0 -471
  1018. data/spec/mongoid/extensions_spec.rb +0 -43
  1019. data/spec/mongoid/query_cache_middleware_spec.rb +0 -50
  1020. data/spec/mongoid/query_cache_spec.rb +0 -865
  1021. data/spec/shared/CANDIDATE.md +0 -28
  1022. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  1023. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  1024. data/spec/shared/lib/tasks/candidate.rake +0 -64
@@ -4,18 +4,22 @@ module Mongoid
4
4
  module Association
5
5
  module Embedded
6
6
  class EmbedsOne
7
-
7
+ # Transparent proxy for embeds_one associations.
8
+ # An instance of this class is returned when calling the
9
+ # association getter method on the parent document. This
10
+ # class inherits from Mongoid::Association::Proxy and forwards
11
+ # most of its methods to the target of the association, i.e.
12
+ # the child document.
8
13
  class Proxy < Association::One
9
-
10
14
  # The valid options when defining this association.
11
15
  #
12
16
  # @return [ Array<Symbol> ] The allowed options when defining this association.
13
- VALID_OPTIONS = [
14
- :autobuild,
15
- :as,
16
- :cascade_callbacks,
17
- :cyclic,
18
- :store_as
17
+ VALID_OPTIONS = %i[
18
+ autobuild
19
+ as
20
+ cascade_callbacks
21
+ cyclic
22
+ store_as
19
23
  ].freeze
20
24
 
21
25
  # Instantiate a new embeds_one association.
@@ -25,15 +29,15 @@ module Mongoid
25
29
  #
26
30
  # @param [ Document ] base The document this association hangs off of.
27
31
  # @param [ Document ] target The child document in the association.
28
- # @param [ Association ] association The association metadata.
32
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
29
33
  def initialize(base, target, association)
30
- init(base, target, association) do
34
+ super do
31
35
  characterize_one(_target)
32
36
  bind_one
33
37
  characterize_one(_target)
34
38
  update_attributes_hash(_target)
35
- _target.save if persistable?
36
39
  _base._reset_memoized_descendants!
40
+ _target.save if persistable?
37
41
  end
38
42
  end
39
43
 
@@ -47,51 +51,20 @@ module Mongoid
47
51
  #
48
52
  # @return [ Document | nil ] The association or nil.
49
53
  def substitute(replacement)
50
- if replacement != self
51
- if _assigning?
52
- _base.add_atomic_unset(_target) unless replacement
53
- else
54
- # The associated object will be replaced by the below update if non-nil, so only
55
- # run the callbacks and state-changing code by passing persist: false in that case.
56
- _target.destroy(persist: !replacement) if persistable?
57
-
58
- unless Mongoid.broken_updates
59
- # A little explanation on why this is needed... Say we have three assignments:
60
- #
61
- # canvas.palette = palette
62
- # canvas.palette = nil
63
- # canvas.palette = palette
64
- # Where canvas embeds_one palette.
65
- #
66
- # Previously, what was happening was, on the first assignment,
67
- # palette was considered a "new record" (new_record?=true) and
68
- # thus palette was being inserted into the database. However,
69
- # on the third assignment, we're trying to reassign the palette,
70
- # palette is no longer considered a new record, because it had
71
- # been inserted previously. This is not exactly accurate,
72
- # because the second assignment ultimately removed the palette
73
- # from the database, so it needs to be reinserted. Since the
74
- # palette's new_record is false, Mongoid ends up "updating" the
75
- # document, which doesn't reinsert it into the database.
76
- #
77
- # The change I introduce here, respecifies palette as a "new
78
- # record" when it gets removed from the database, so if it is
79
- # reassigned, it will be reinserted into the database.
80
- _target.new_record = true
81
- end
82
- end
83
- unbind_one
84
- unless replacement
85
- update_attributes_hash(replacement)
86
- return nil
87
- end
88
- replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
89
- self._target = replacement
90
- characterize_one(_target)
91
- bind_one
92
- update_attributes_hash(_target)
93
- _target.save if persistable?
54
+ return self if replacement == self
55
+
56
+ if _assigning?
57
+ _base.add_atomic_unset(_target) unless replacement
58
+ else
59
+ update_target_when_not_assigning(replacement)
94
60
  end
61
+
62
+ unbind_one
63
+
64
+ return nil if replace_with_nil_document(replacement)
65
+
66
+ replace_with(replacement)
67
+
95
68
  self
96
69
  end
97
70
 
@@ -131,7 +104,92 @@ module Mongoid
131
104
  end
132
105
  end
133
106
 
107
+ # When not ``_assigning?``, the target may need to be destroyed, and
108
+ # may need to be marked as a new record. This method takes care of
109
+ # that, with extensive documentation for why it is necessary.
110
+ #
111
+ # @param [ Mongoid::Document ] replacement the replacement document
112
+ def update_target_when_not_assigning(replacement)
113
+ # The associated object will be replaced by the below update if non-nil, so only
114
+ # run the callbacks and state-changing code by passing persist: false in that case.
115
+ _target.destroy(persist: !replacement) if persistable?
116
+
117
+ # A little explanation on why this is needed... Say we have three assignments:
118
+ #
119
+ # canvas.palette = palette
120
+ # canvas.palette = nil
121
+ # canvas.palette = palette
122
+ # Where canvas embeds_one palette.
123
+ #
124
+ # Previously, what was happening was, on the first assignment,
125
+ # palette was considered a "new record" (new_record?=true) and
126
+ # thus palette was being inserted into the database. However,
127
+ # on the third assignment, we're trying to reassign the palette,
128
+ # palette is no longer considered a new record, because it had
129
+ # been inserted previously. This is not exactly accurate,
130
+ # because the second assignment ultimately removed the palette
131
+ # from the database, so it needs to be reinserted. Since the
132
+ # palette's new_record is false, Mongoid ends up "updating" the
133
+ # document, which doesn't reinsert it into the database.
134
+ #
135
+ # The change I introduce here, respecifies palette as a "new
136
+ # record" when it gets removed from the database, so if it is
137
+ # reassigned, it will be reinserted into the database.
138
+ _target.new_record = true
139
+ end
140
+
141
+ # Checks the argument. If it is non-nil, this method does nothing.
142
+ # Otherwise, it performs the logic for replacing the current
143
+ # document with nil.
144
+ #
145
+ # @param [ Mongoid::Document | Hash | nil ] replacement the document
146
+ # to check.
147
+ #
148
+ # @return [ true | false ] whether a nil document was substituted
149
+ # or not.
150
+ def replace_with_nil_document(replacement)
151
+ return false if replacement
152
+
153
+ update_attributes_hash(replacement)
154
+
155
+ # when `touch: true` is the default (see MONGOID-5016), creating
156
+ # an embedded document will touch the parent, and will cause the
157
+ # _descendants list to be initialized and memoized. If the object
158
+ # is then deleted, we need to make sure and un-memoize that list,
159
+ # otherwise when the update happens, the memoized _descendants list
160
+ # gets used and the "deleted" subdocument gets added again.
161
+ _reset_memoized_descendants!
162
+
163
+ true
164
+ end
165
+
166
+ # Replaces the current document with the given replacement
167
+ # document, which may be a Hash of attributes.
168
+ #
169
+ # @param [ Mongoid::Document | Hash ] replacement the document to
170
+ # substitute in place of the current document.
171
+ def replace_with(replacement)
172
+ replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
173
+ self._target = replacement
174
+ characterize_one(_target)
175
+ bind_one
176
+ update_attributes_hash(_target)
177
+ _target.save if persistable?
178
+ end
179
+
134
180
  class << self
181
+ # Returns the eager loader for this association.
182
+ #
183
+ # @param [ Array<Mongoid::Association> ] associations The
184
+ # associations to be eager loaded
185
+ # @param [ Array<Mongoid::Document> ] docs The parent documents
186
+ # that possess the given associations, which ought to be
187
+ # populated by the eager-loaded documents.
188
+ #
189
+ # @return [ Mongoid::Association::Embedded::Eager ]
190
+ def eager_loader(associations, docs)
191
+ Eager.new(associations, docs)
192
+ end
135
193
 
136
194
  # Returns true if the association is an embedded one. In this case
137
195
  # always true.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require 'mongoid/association/embedded/embeds_one/binding'
4
5
  require 'mongoid/association/embedded/embeds_one/buildable'
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require 'mongoid/association/embedded/cyclic'
5
+ require 'mongoid/association/embedded/eager'
4
6
  require 'mongoid/association/embedded/embedded_in'
5
7
  require 'mongoid/association/embedded/embeds_many'
6
8
  require 'mongoid/association/embedded/embeds_one'
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Mongoid
4
4
  module Association
5
-
6
5
  # This module contains the core macros for defining associations between
7
6
  # documents. They can be either embedded or referenced.
8
7
  module Macros
@@ -35,7 +34,7 @@ module Mongoid
35
34
  # @api private
36
35
  class_attribute :aliased_associations
37
36
 
38
- # @return [ Set<String> ] The set of associations that are configured
37
+ # @return [ Set<String> ] The set of associations that are configured
39
38
  # with :store_as parameter.
40
39
  class_attribute :stored_as_associations
41
40
 
@@ -53,11 +52,11 @@ module Mongoid
53
52
  #
54
53
  # @return [ Hash ] The associations.
55
54
  def associations
56
- self.relations
55
+ relations
57
56
  end
58
57
 
58
+ # Class methods for associations.
59
59
  module ClassMethods
60
-
61
60
  # Adds the association back to the parent document. This macro is
62
61
  # necessary to set the references from the child back to the parent
63
62
  # document. If a child does not define this association calling
@@ -77,7 +76,7 @@ module Mongoid
77
76
  #
78
77
  # @param [ Symbol ] name The name of the association.
79
78
  # @param [ Hash ] options The association options.
80
- # @param [ Proc ] block Optional block for defining extensions.
79
+ # @param &block Optional block for defining extensions.
81
80
  def embedded_in(name, options = {}, &block)
82
81
  define_association!(__method__, name, options, &block)
83
82
  end
@@ -100,7 +99,7 @@ module Mongoid
100
99
  #
101
100
  # @param [ Symbol ] name The name of the association.
102
101
  # @param [ Hash ] options The association options.
103
- # @param [ Proc ] block Optional block for defining extensions.
102
+ # @param &block Optional block for defining extensions.
104
103
  def embeds_many(name, options = {}, &block)
105
104
  define_association!(__method__, name, options, &block)
106
105
  end
@@ -123,7 +122,7 @@ module Mongoid
123
122
  #
124
123
  # @param [ Symbol ] name The name of the association.
125
124
  # @param [ Hash ] options The association options.
126
- # @param [ Proc ] block Optional block for defining extensions.
125
+ # @param &block Optional block for defining extensions.
127
126
  def embeds_one(name, options = {}, &block)
128
127
  define_association!(__method__, name, options, &block)
129
128
  end
@@ -145,11 +144,13 @@ module Mongoid
145
144
  #
146
145
  # @param [ Symbol ] name The name of the association.
147
146
  # @param [ Hash ] options The association options.
148
- # @param [ Proc ] block Optional block for defining extensions.
147
+ # @param &block Optional block for defining extensions.
149
148
  def belongs_to(name, options = {}, &block)
150
149
  define_association!(__method__, name, options, &block)
151
150
  end
152
151
 
152
+ # rubocop:disable Naming/PredicateName
153
+
153
154
  # Adds a referenced association from a parent Document to many
154
155
  # Documents in another database or collection.
155
156
  #
@@ -167,7 +168,7 @@ module Mongoid
167
168
  #
168
169
  # @param [ Symbol ] name The name of the association.
169
170
  # @param [ Hash ] options The association options.
170
- # @param [ Proc ] block Optional block for defining extensions.
171
+ # @param &block Optional block for defining extensions.
171
172
  def has_many(name, options = {}, &block)
172
173
  define_association!(__method__, name, options, &block)
173
174
  end
@@ -189,7 +190,7 @@ module Mongoid
189
190
  #
190
191
  # @param [ Symbol ] name The name of the association.
191
192
  # @param [ Hash ] options The association options.
192
- # @param [ Proc ] block Optional block for defining extensions.
193
+ # @param &block Optional block for defining extensions.
193
194
  def has_and_belongs_to_many(name, options = {}, &block)
194
195
  define_association!(__method__, name, options, &block)
195
196
  end
@@ -211,20 +212,22 @@ module Mongoid
211
212
  #
212
213
  # @param [ Symbol ] name The name of the association.
213
214
  # @param [ Hash ] options The association options.
214
- # @param [ Proc ] block Optional block for defining extensions.
215
+ # @param &block Optional block for defining extensions.
215
216
  def has_one(name, options = {}, &block)
216
217
  define_association!(__method__, name, options, &block)
217
218
  end
218
219
 
220
+ # rubocop:enable Naming/PredicateName
221
+
219
222
  private
220
223
 
221
224
  def define_association!(macro_name, name, options = {}, &block)
222
225
  Association::MACRO_MAPPING[macro_name].new(self, name, options, &block).tap do |assoc|
223
226
  assoc.setup!
224
- self.relations = self.relations.merge(name => assoc)
227
+ self.relations = relations.merge(name => assoc)
225
228
  if assoc.embedded? && assoc.respond_to?(:store_as) && assoc.store_as != name
226
- self.aliased_associations[assoc.store_as] = name
227
- self.stored_as_associations << assoc.store_as
229
+ aliased_associations[assoc.store_as] = name
230
+ stored_as_associations << assoc.store_as
228
231
  end
229
232
  end
230
233
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
6
+
7
+ # Mixin module for Mongoid::Association::Proxy which adds
8
+ # custom Marshal.dump functionality.
5
9
  module Marshalable
6
10
 
7
11
  # Provides the data needed to Marshal.dump an association proxy.
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
5
6
  module Nested
7
+
8
+ # Builder class used to perform #accepts_nested_attributes_for
9
+ # attribute assignment on many-to-n associations.
6
10
  class Many
7
11
  include Buildable
8
12
 
@@ -40,7 +44,7 @@ module Mongoid
40
44
  # @example Initialize the builder.
41
45
  # Many.new(association, attributes, options)
42
46
  #
43
- # @param [ Association ] association The association metadata.
47
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
44
48
  # @param [ Hash ] attributes The attributes hash to attempt to set.
45
49
  # @param [ Hash ] options The options defined.
46
50
  def initialize(association, attributes, options = {})
@@ -97,7 +101,8 @@ module Mongoid
97
101
  # @param [ Hash ] attrs The single document attributes to process.
98
102
  def process_attributes(parent, attrs)
99
103
  return if reject?(parent, attrs)
100
- if id = attrs.extract_id
104
+
105
+ if (id = extract_id(attrs))
101
106
  update_nested_relation(parent, id, attrs)
102
107
  else
103
108
  existing.push(Factory.build(@class_name, attrs)) unless destroyable?(attrs)
@@ -149,7 +154,7 @@ module Mongoid
149
154
  # @param [ Document ] doc The document to update.
150
155
  # @param [ Hash ] attrs The attributes.
151
156
  def update_document(doc, attrs)
152
- attrs.delete_id
157
+ delete_id(attrs)
153
158
  if association.embedded?
154
159
  doc.assign_attributes(attrs)
155
160
  else
@@ -1,8 +1,13 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
5
6
  module Nested
7
+
8
+ # Mixin module containing common functionality used to
9
+ # perform #accepts_nested_attributes_for attribute assignment
10
+ # on associations.
6
11
  module Buildable
7
12
 
8
13
  attr_accessor :attributes, :existing, :association, :options
@@ -60,6 +65,33 @@ module Mongoid
60
65
  def convert_id(klass, id)
61
66
  klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
62
67
  end
68
+
69
+ private
70
+
71
+ # Get the id attribute from the given hash, whether it's
72
+ # prefixed with an underscore or is a symbol.
73
+ #
74
+ # @example Get the id.
75
+ # extract_id({ _id: 1 })
76
+ #
77
+ # @param [ Hash ] hash The hash from which to extract.
78
+ #
79
+ # @return [ Object ] The value of the id.
80
+ def extract_id(hash)
81
+ hash['_id'] || hash[:_id] || hash['id'] || hash[:id]
82
+ end
83
+
84
+ # Deletes the id key from the given hash.
85
+ #
86
+ # @example Delete an id value.
87
+ # delete_id({ "_id" => 1 })
88
+ #
89
+ # @param [ Hash ] hash The hash from which to delete.
90
+ #
91
+ # @return [ Object ] The deleted value, or nil.
92
+ def delete_id(hash)
93
+ hash.delete('_id') || hash.delete(:_id) || hash.delete('id') || hash.delete(:id)
94
+ end
63
95
  end
64
96
  end
65
97
  end
@@ -1,14 +1,17 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
5
6
  module Nested
7
+
8
+ # Builder class used to perform #accepts_nested_attributes_for
9
+ # attribute assignment on one-to-n associations.
6
10
  class One
7
11
  include Buildable
8
12
 
9
13
  attr_accessor :destroy
10
14
 
11
-
12
15
  # Builds the association depending on the attributes and the options
13
16
  # passed to the macro.
14
17
  #
@@ -26,7 +29,7 @@ module Mongoid
26
29
  return if reject?(parent, attributes)
27
30
  @existing = parent.send(association.name)
28
31
  if update?
29
- attributes.delete_id
32
+ delete_id(attributes)
30
33
  existing.assign_attributes(attributes)
31
34
  elsif replace?
32
35
  parent.send(association.setter, Factory.build(@class_name, attributes))
@@ -43,7 +46,7 @@ module Mongoid
43
46
  # @example Instantiate the builder.
44
47
  # One.new(association, attributes)
45
48
  #
46
- # @param [ Association ] association The association metadata.
49
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
47
50
  # @param [ Hash ] attributes The attributes hash to attempt to set.
48
51
  # @param [ Hash ] options The options defined.
49
52
  def initialize(association, attributes, options)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  require 'mongoid/association/nested/nested_buildable'
4
5
  require 'mongoid/association/nested/many'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
5
6
 
7
+ # Options context used for all association types.
6
8
  module Options
7
9
 
8
10
  # Returns the name of the parent to a polymorphic child.
@@ -112,8 +114,13 @@ module Mongoid
112
114
  @touch_field ||= options[:touch] if (options[:touch].is_a?(String) || options[:touch].is_a?(Symbol))
113
115
  end
114
116
 
115
- private
116
-
117
+ # Whether the association object should be automatically touched
118
+ # when its inverse object is updated.
119
+ #
120
+ # @return [ true | false ] returns true if this association is
121
+ # automatically touched, false otherwise. The default is false.
122
+ #
123
+ # @api private
117
124
  def touchable?
118
125
  !!@options[:touch]
119
126
  end
@@ -1,21 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "mongoid/association/marshalable"
3
+ require 'mongoid/association/marshalable'
4
4
 
5
5
  module Mongoid
6
6
  module Association
7
-
8
7
  # This class is the superclass for all association proxy objects, and contains
9
8
  # common behavior for all of them.
10
9
  class Proxy
11
10
  extend Forwardable
12
11
 
13
- alias :extend_proxy :extend
12
+ alias extend_proxy extend
13
+
14
+ # specific methods to prevent from being undefined
15
+ KEEPER_METHODS = %i[
16
+ send
17
+ object_id
18
+ equal?
19
+ respond_to?
20
+ respond_to_missing?
21
+ tap
22
+ public_send
23
+ extend_proxy
24
+ extend_proxies
25
+ ].freeze
14
26
 
15
27
  # We undefine most methods to get them sent through to the target.
16
28
  instance_methods.each do |method|
17
- undef_method(method) unless
18
- method =~ /\A(?:__.*|send|object_id|equal\?|respond_to\?|respond_to_missing\?|tap|public_send|extend_proxy|extend_proxies)\z/
29
+ undef_method(method) unless method.to_s.start_with?('__') || KEEPER_METHODS.include?(method)
19
30
  end
20
31
 
21
32
  include Threaded::Lifecycle
@@ -41,16 +52,12 @@ module Mongoid
41
52
  def_delegators :binding, :bind_one, :unbind_one
42
53
  def_delegator :_base, :collection_name
43
54
 
44
- # Convenience for setting the target and the association metadata properties since
45
- # all proxies will need to do this.
46
- #
47
- # @example Initialize the proxy.
48
- # proxy.init(person, name, association)
55
+ # Sets the target and the association metadata properties.
49
56
  #
50
57
  # @param [ Document ] base The base document on the proxy.
51
58
  # @param [ Document | Array<Document> ] target The target of the proxy.
52
- # @param [ Association ] association The association metadata.
53
- def init(base, target, association)
59
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
60
+ def initialize(base, target, association)
54
61
  @_base, @_target, @_association = base, target, association
55
62
  yield(self) if block_given?
56
63
  extend_proxies(association.extension) if association.extension
@@ -58,7 +65,7 @@ module Mongoid
58
65
 
59
66
  # Allow extension to be an array and extend each module
60
67
  def extend_proxies(*extension)
61
- extension.flatten.each {|ext| extend_proxy(ext) }
68
+ extension.flatten.each { |ext| extend_proxy(ext) }
62
69
  end
63
70
 
64
71
  # Get the class from the association, or return nil if no association present.
@@ -68,7 +75,7 @@ module Mongoid
68
75
  #
69
76
  # @return [ Class ] The association class.
70
77
  def klass
71
- _association ? _association.klass : nil
78
+ _association&.klass
72
79
  end
73
80
 
74
81
  # Resets the criteria inside the association proxy. Used by many to many
@@ -119,10 +126,16 @@ module Mongoid
119
126
  #
120
127
  # @param [ String | Symbol ] name The name of the method.
121
128
  # @param [ Object... ] *args The arguments passed to the method.
129
+ # @param &block Optional block to pass.
122
130
  ruby2_keywords def method_missing(name, *args, &block)
123
131
  _target.send(name, *args, &block)
124
132
  end
125
133
 
134
+ # Whether the proxy can forward the method to the target.
135
+ #
136
+ # @param [ String | Symbol ] name The name of the method.
137
+ # @param [ Object... ] *args The +respond_to?+ arguments.
138
+ #
126
139
  # @api private
127
140
  ruby2_keywords def respond_to_missing?(name, *args)
128
141
  _target.respond_to?(name, *args)
@@ -174,21 +187,20 @@ module Mongoid
174
187
  #
175
188
  # @return [ Object ] The result of the given block
176
189
  def execute_callbacks_around(name, doc)
177
- execute_callback :"before_#{name.to_s}", doc
190
+ execute_callback :"before_#{name}", doc
178
191
  yield.tap do
179
- execute_callback :"after_#{name.to_s}", doc
192
+ execute_callback :"after_#{name}", doc
180
193
  end
181
194
  end
182
195
 
183
196
  class << self
184
-
185
197
  # Apply ordering to the criteria if it was defined on the association.
186
198
  #
187
199
  # @example Apply the ordering.
188
200
  # Proxy.apply_ordering(criteria, association)
189
201
  #
190
202
  # @param [ Criteria ] criteria The criteria to modify.
191
- # @param [ Association ] association The association metadata.
203
+ # @param [ Mongoid::Association::Relatable ] association The association metadata.
192
204
  #
193
205
  # @return [ Criteria ] The ordered criteria.
194
206
  def apply_ordering(criteria, association)
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
+ # rubocop:todo all
2
3
 
3
4
  module Mongoid
4
5
  module Association
5
6
  module Referenced
6
7
 
8
+ # Mixin module included into Mongoid::Document which adds
9
+ # the ability to automatically save opposite-side documents
10
+ # in referenced associations when saving the subject document.
7
11
  module AutoSave
8
12
  extend ActiveSupport::Concern
9
13
 
@@ -43,7 +47,7 @@ module Mongoid
43
47
  # @example Define the autosave method:
44
48
  # Association::Referenced::Autosave.define_autosave!(association)
45
49
  #
46
- # @param [ Association ] association The association for which autosaving is enabled.
50
+ # @param [ Mongoid::Association::Relatable ] association The association for which autosaving is enabled.
47
51
  #
48
52
  # @return [ Class ] The association's owner class.
49
53
  def self.define_autosave!(association)
@@ -56,7 +60,7 @@ module Mongoid
56
60
  __autosaving__ do
57
61
  if assoc_value = ivar(association.name)
58
62
  Array(assoc_value).each do |doc|
59
- pc = doc.persistence_context? ? doc.persistence_context : persistence_context
63
+ pc = doc.persistence_context? ? doc.persistence_context : persistence_context.for_child(doc)
60
64
  doc.with(pc) do |d|
61
65
  d.save
62
66
  end