mongoid 7.4.3 → 8.0.7

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 (383) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +25 -0
  5. data/lib/config/locales/en.yml +52 -28
  6. data/lib/mongoid/association/accessors.rb +38 -9
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +4 -2
  9. data/lib/mongoid/association/constrainable.rb +0 -1
  10. data/lib/mongoid/association/eager_loadable.rb +29 -7
  11. data/lib/mongoid/association/embedded/batchable.rb +33 -10
  12. data/lib/mongoid/association/embedded/cyclic.rb +1 -1
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  16. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  17. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +65 -41
  19. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  20. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
  21. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
  22. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  23. data/lib/mongoid/association/macros.rb +28 -1
  24. data/lib/mongoid/association/many.rb +11 -7
  25. data/lib/mongoid/association/nested/many.rb +5 -4
  26. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  27. data/lib/mongoid/association/nested/one.rb +5 -5
  28. data/lib/mongoid/association/one.rb +2 -2
  29. data/lib/mongoid/association/options.rb +9 -9
  30. data/lib/mongoid/association/proxy.rb +14 -3
  31. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  32. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  33. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  34. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  35. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  36. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  37. data/lib/mongoid/association/referenced/eager.rb +2 -2
  38. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  40. data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -24
  41. data/lib/mongoid/association/referenced/has_many/proxy.rb +26 -16
  42. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  43. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  44. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  45. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  46. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  47. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  48. data/lib/mongoid/association/reflections.rb +2 -2
  49. data/lib/mongoid/association/relatable.rb +44 -10
  50. data/lib/mongoid/association.rb +5 -5
  51. data/lib/mongoid/atomic/modifiers.rb +2 -2
  52. data/lib/mongoid/atomic.rb +7 -0
  53. data/lib/mongoid/attributes/dynamic.rb +3 -3
  54. data/lib/mongoid/attributes/nested.rb +5 -5
  55. data/lib/mongoid/attributes/processing.rb +37 -6
  56. data/lib/mongoid/attributes/projector.rb +1 -1
  57. data/lib/mongoid/attributes/readonly.rb +2 -2
  58. data/lib/mongoid/attributes.rb +43 -40
  59. data/lib/mongoid/cacheable.rb +2 -2
  60. data/lib/mongoid/changeable.rb +43 -10
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/validators/storage.rb +3 -3
  64. data/lib/mongoid/config/options.rb +3 -0
  65. data/lib/mongoid/config/validators/client.rb +6 -6
  66. data/lib/mongoid/config.rb +62 -17
  67. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  68. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  69. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  70. data/lib/mongoid/contextual/atomic.rb +1 -1
  71. data/lib/mongoid/contextual/geo_near.rb +7 -7
  72. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  73. data/lib/mongoid/contextual/memory.rb +180 -21
  74. data/lib/mongoid/contextual/mongo.rb +260 -217
  75. data/lib/mongoid/contextual/none.rb +67 -5
  76. data/lib/mongoid/contextual/queryable.rb +1 -1
  77. data/lib/mongoid/contextual.rb +2 -2
  78. data/lib/mongoid/copyable.rb +32 -8
  79. data/lib/mongoid/criteria/findable.rb +7 -4
  80. data/lib/mongoid/criteria/includable.rb +24 -20
  81. data/lib/mongoid/criteria/marshalable.rb +10 -2
  82. data/lib/mongoid/criteria/permission.rb +1 -1
  83. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  84. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -14
  85. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  86. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  87. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  88. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  89. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -15
  90. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -9
  91. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  92. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  93. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  94. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  95. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  96. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  97. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  98. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  99. data/lib/mongoid/criteria/queryable/key.rb +3 -3
  100. data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
  101. data/lib/mongoid/criteria/queryable/optional.rb +5 -11
  102. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  103. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  104. data/lib/mongoid/criteria/queryable/selectable.rb +31 -37
  105. data/lib/mongoid/criteria/queryable/selector.rb +93 -8
  106. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  107. data/lib/mongoid/criteria/queryable/storable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable.rb +12 -7
  109. data/lib/mongoid/criteria/scopable.rb +2 -2
  110. data/lib/mongoid/criteria/translator.rb +45 -0
  111. data/lib/mongoid/criteria.rb +16 -35
  112. data/lib/mongoid/deprecable.rb +37 -0
  113. data/lib/mongoid/deprecation.rb +25 -0
  114. data/lib/mongoid/document.rb +135 -34
  115. data/lib/mongoid/equality.rb +8 -8
  116. data/lib/mongoid/errors/document_not_found.rb +33 -12
  117. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  118. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  119. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  120. data/lib/mongoid/errors/invalid_field.rb +6 -2
  121. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  122. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  123. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  124. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  125. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  126. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  127. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  128. data/lib/mongoid/errors/no_client_database.rb +1 -1
  129. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  130. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  131. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  132. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  133. data/lib/mongoid/errors.rb +2 -2
  134. data/lib/mongoid/extensions/array.rb +9 -7
  135. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  136. data/lib/mongoid/extensions/binary.rb +42 -0
  137. data/lib/mongoid/extensions/boolean.rb +8 -2
  138. data/lib/mongoid/extensions/date.rb +26 -20
  139. data/lib/mongoid/extensions/date_time.rb +1 -1
  140. data/lib/mongoid/extensions/false_class.rb +1 -1
  141. data/lib/mongoid/extensions/float.rb +7 -4
  142. data/lib/mongoid/extensions/hash.rb +37 -8
  143. data/lib/mongoid/extensions/integer.rb +7 -4
  144. data/lib/mongoid/extensions/module.rb +1 -1
  145. data/lib/mongoid/extensions/object.rb +8 -6
  146. data/lib/mongoid/extensions/range.rb +41 -10
  147. data/lib/mongoid/extensions/regexp.rb +11 -4
  148. data/lib/mongoid/extensions/set.rb +11 -4
  149. data/lib/mongoid/extensions/string.rb +11 -22
  150. data/lib/mongoid/extensions/symbol.rb +4 -15
  151. data/lib/mongoid/extensions/time.rb +27 -16
  152. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  153. data/lib/mongoid/extensions/true_class.rb +1 -1
  154. data/lib/mongoid/extensions.rb +1 -0
  155. data/lib/mongoid/factory.rb +55 -7
  156. data/lib/mongoid/fields/foreign_key.rb +11 -4
  157. data/lib/mongoid/fields/localized.rb +9 -4
  158. data/lib/mongoid/fields/standard.rb +7 -7
  159. data/lib/mongoid/fields/validators/macro.rb +3 -9
  160. data/lib/mongoid/fields.rb +233 -40
  161. data/lib/mongoid/findable.rb +34 -13
  162. data/lib/mongoid/indexable/specification.rb +2 -2
  163. data/lib/mongoid/indexable/validators/options.rb +6 -2
  164. data/lib/mongoid/interceptable.rb +185 -16
  165. data/lib/mongoid/matchable.rb +1 -1
  166. data/lib/mongoid/matcher.rb +33 -13
  167. data/lib/mongoid/persistable/creatable.rb +18 -9
  168. data/lib/mongoid/persistable/deletable.rb +1 -1
  169. data/lib/mongoid/persistable/destroyable.rb +1 -1
  170. data/lib/mongoid/persistable/savable.rb +2 -2
  171. data/lib/mongoid/persistable/unsettable.rb +1 -1
  172. data/lib/mongoid/persistable/updatable.rb +19 -12
  173. data/lib/mongoid/persistable/upsertable.rb +1 -1
  174. data/lib/mongoid/persistable.rb +3 -3
  175. data/lib/mongoid/persistence_context.rb +63 -10
  176. data/lib/mongoid/query_cache.rb +8 -260
  177. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  178. data/lib/mongoid/reloadable.rb +10 -8
  179. data/lib/mongoid/scopable.rb +26 -22
  180. data/lib/mongoid/selectable.rb +1 -2
  181. data/lib/mongoid/serializable.rb +10 -6
  182. data/lib/mongoid/shardable.rb +35 -11
  183. data/lib/mongoid/stateful.rb +35 -9
  184. data/lib/mongoid/tasks/database.rb +0 -2
  185. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  186. data/lib/mongoid/threaded.rb +42 -12
  187. data/lib/mongoid/timestamps/created.rb +1 -1
  188. data/lib/mongoid/timestamps/updated.rb +2 -2
  189. data/lib/mongoid/touchable.rb +2 -3
  190. data/lib/mongoid/traversable.rb +5 -4
  191. data/lib/mongoid/validatable/localizable.rb +1 -1
  192. data/lib/mongoid/validatable/macros.rb +0 -2
  193. data/lib/mongoid/validatable/presence.rb +2 -2
  194. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  195. data/lib/mongoid/validatable.rb +6 -6
  196. data/lib/mongoid/version.rb +1 -1
  197. data/lib/mongoid/warnings.rb +28 -0
  198. data/lib/mongoid.rb +2 -0
  199. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -3
  200. data/spec/config/mongoid.yml +16 -0
  201. data/spec/integration/app_spec.rb +8 -12
  202. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  203. data/spec/integration/associations/embedded_spec.rb +15 -0
  204. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  205. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  206. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  207. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  208. data/spec/integration/associations/has_one_spec.rb +97 -1
  209. data/spec/integration/associations/scope_option_spec.rb +1 -1
  210. data/spec/integration/callbacks_models.rb +95 -1
  211. data/spec/integration/callbacks_spec.rb +246 -4
  212. data/spec/integration/criteria/range_spec.rb +95 -1
  213. data/spec/integration/discriminator_key_spec.rb +115 -76
  214. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  215. data/spec/integration/i18n_fallbacks_spec.rb +1 -17
  216. data/spec/integration/matcher_examples_spec.rb +20 -13
  217. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  218. data/spec/integration/matcher_operator_spec.rb +3 -5
  219. data/spec/integration/persistence/range_field_spec.rb +350 -0
  220. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  221. data/spec/mongoid/association/depending_spec.rb +9 -9
  222. data/spec/mongoid/association/eager_spec.rb +2 -1
  223. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  224. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  225. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
  226. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  227. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +235 -40
  228. data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
  229. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
  230. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  231. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  232. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  233. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  234. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  235. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  236. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
  237. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  238. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
  239. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +202 -201
  240. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  241. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  242. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  243. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
  244. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +160 -119
  245. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  246. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  247. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  248. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  249. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  250. data/spec/mongoid/association/syncable_spec.rb +14 -0
  251. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  252. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  253. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  254. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  255. data/spec/mongoid/attributes_spec.rb +551 -27
  256. data/spec/mongoid/cacheable_spec.rb +3 -3
  257. data/spec/mongoid/changeable_spec.rb +130 -13
  258. data/spec/mongoid/clients/factory_spec.rb +23 -30
  259. data/spec/mongoid/clients/options_spec.rb +1 -0
  260. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  261. data/spec/mongoid/clients_spec.rb +57 -2
  262. data/spec/mongoid/config_spec.rb +78 -18
  263. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  264. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  265. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  266. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  267. data/spec/mongoid/contextual/memory_spec.rb +1336 -69
  268. data/spec/mongoid/contextual/mongo_spec.rb +1253 -247
  269. data/spec/mongoid/contextual/none_spec.rb +38 -0
  270. data/spec/mongoid/copyable_spec.rb +451 -1
  271. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  272. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  273. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  274. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  275. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  276. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  277. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  278. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  279. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  280. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  281. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
  282. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  283. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  284. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  285. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  286. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
  287. data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
  288. data/spec/mongoid/criteria/queryable/selector_spec.rb +89 -4
  289. data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
  290. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  291. data/spec/mongoid/criteria_projection_spec.rb +0 -1
  292. data/spec/mongoid/criteria_spec.rb +475 -1199
  293. data/spec/mongoid/document_fields_spec.rb +173 -24
  294. data/spec/mongoid/document_spec.rb +32 -41
  295. data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
  296. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  297. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  298. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  299. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  300. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  301. data/spec/mongoid/extensions/array_spec.rb +16 -2
  302. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  303. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  304. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  305. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  306. data/spec/mongoid/extensions/date_spec.rb +71 -1
  307. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  308. data/spec/mongoid/extensions/float_spec.rb +53 -74
  309. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  310. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  311. data/spec/mongoid/extensions/range_spec.rb +255 -54
  312. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  313. data/spec/mongoid/extensions/set_spec.rb +106 -0
  314. data/spec/mongoid/extensions/string_spec.rb +53 -25
  315. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  316. data/spec/mongoid/extensions/time_spec.rb +634 -66
  317. data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
  318. data/spec/mongoid/factory_spec.rb +61 -1
  319. data/spec/mongoid/fields/localized_spec.rb +37 -12
  320. data/spec/mongoid/fields_spec.rb +364 -50
  321. data/spec/mongoid/findable_spec.rb +80 -15
  322. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  323. data/spec/mongoid/indexable_spec.rb +39 -20
  324. data/spec/mongoid/interceptable_spec.rb +807 -27
  325. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  326. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  327. data/spec/mongoid/mongoizable_spec.rb +285 -0
  328. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  329. data/spec/mongoid/persistable/deletable_spec.rb +2 -2
  330. data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
  331. data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
  332. data/spec/mongoid/persistence_context_spec.rb +50 -1
  333. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  334. data/spec/mongoid/query_cache_spec.rb +0 -154
  335. data/spec/mongoid/reloadable_spec.rb +59 -2
  336. data/spec/mongoid/scopable_spec.rb +54 -16
  337. data/spec/mongoid/shardable_models.rb +14 -0
  338. data/spec/mongoid/shardable_spec.rb +157 -51
  339. data/spec/mongoid/stateful_spec.rb +28 -0
  340. data/spec/mongoid/timestamps_spec.rb +390 -0
  341. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  342. data/spec/mongoid/touchable_spec.rb +116 -0
  343. data/spec/mongoid/touchable_spec_models.rb +12 -8
  344. data/spec/mongoid/traversable_spec.rb +4 -11
  345. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  346. data/spec/mongoid/validatable/uniqueness_spec.rb +59 -31
  347. data/spec/mongoid/warnings_spec.rb +35 -0
  348. data/spec/mongoid_spec.rb +1 -1
  349. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  350. data/spec/rails/mongoid_spec.rb +4 -16
  351. data/spec/shared/lib/mrss/docker_runner.rb +7 -0
  352. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  353. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  354. data/spec/shared/lib/mrss/utils.rb +28 -6
  355. data/spec/shared/share/Dockerfile.erb +36 -40
  356. data/spec/shared/shlib/server.sh +32 -8
  357. data/spec/shared/shlib/set_env.sh +4 -4
  358. data/spec/support/constraints.rb +24 -0
  359. data/spec/support/macros.rb +46 -0
  360. data/spec/support/models/augmentation.rb +12 -0
  361. data/spec/support/models/band.rb +3 -0
  362. data/spec/support/models/catalog.rb +24 -0
  363. data/spec/support/models/circus.rb +3 -0
  364. data/spec/support/models/code.rb +2 -0
  365. data/spec/support/models/fanatic.rb +8 -0
  366. data/spec/support/models/implant.rb +9 -0
  367. data/spec/support/models/label.rb +2 -0
  368. data/spec/support/models/passport.rb +9 -0
  369. data/spec/support/models/person.rb +2 -0
  370. data/spec/support/models/player.rb +2 -0
  371. data/spec/support/models/powerup.rb +12 -0
  372. data/spec/support/models/purse.rb +9 -0
  373. data/spec/support/models/registry.rb +1 -0
  374. data/spec/support/models/school.rb +14 -0
  375. data/spec/support/models/shield.rb +18 -0
  376. data/spec/support/models/student.rb +14 -0
  377. data/spec/support/models/weapon.rb +12 -0
  378. data.tar.gz.sig +4 -1
  379. metadata +682 -635
  380. metadata.gz.sig +0 -0
  381. data/lib/mongoid/errors/eager_load.rb +0 -23
  382. data/lib/mongoid/errors/invalid_value.rb +0 -17
  383. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -75,7 +75,7 @@ module Mongoid
75
75
 
76
76
  # Is this association polymorphic?
77
77
  #
78
- # @return [ true, false ] Whether this association is polymorphic.
78
+ # @return [ true | false ] Whether this association is polymorphic.
79
79
  def polymorphic?
80
80
  !!@options[:polymorphic]
81
81
  end
@@ -114,7 +114,8 @@ module Mongoid
114
114
  rel.as == name &&
115
115
  rel.relation_class_name == inverse_class_name
116
116
  end
117
- matches.collect { |m| m.name }
117
+
118
+ matches.map { |m| m.name }
118
119
  end
119
120
  end
120
121
 
@@ -19,6 +19,7 @@ module Mongoid
19
19
  def bind_one(doc)
20
20
  doc.parentize(_base)
21
21
  binding do
22
+ remove_associated(doc)
22
23
  doc.do_or_do_not(_association.inverse_setter(_target), _base)
23
24
  end
24
25
  end
@@ -31,7 +31,7 @@ module Mongoid
31
31
  docs = []
32
32
  object.each do |attrs|
33
33
  if _loading? && base.persisted?
34
- docs.push(Factory.from_db(klass, attrs, nil, selected_fields))
34
+ docs.push(Factory.execute_from_db(klass, attrs, nil, selected_fields, execute_callbacks: false))
35
35
  else
36
36
  docs.push(Factory.build(klass, attrs))
37
37
  end
@@ -19,7 +19,7 @@ module Mongoid
19
19
  # @example Push a document.
20
20
  # person.addresses.push(address)
21
21
  #
22
- # @param [ Document, Array<Document> ] args Any number of documents.
22
+ # @param [ Document | Array<Document> ] args Any number of documents.
23
23
  def <<(*args)
24
24
  docs = args.flatten
25
25
  return concat(docs) if docs.size > 1
@@ -67,10 +67,11 @@ module Mongoid
67
67
  #
68
68
  # @return [ Document ] The new document.
69
69
  def build(attributes = {}, type = nil)
70
- doc = Factory.build(type || _association.klass, attributes)
70
+ doc = Factory.execute_build(type || _association.klass, attributes, execute_callbacks: false)
71
71
  append(doc)
72
72
  doc.apply_post_processed_defaults
73
73
  yield(doc) if block_given?
74
+ doc.run_pending_callbacks
74
75
  doc.run_callbacks(:build) { doc }
75
76
  _base._reset_memoized_descendants!
76
77
  doc
@@ -94,6 +95,7 @@ module Mongoid
94
95
  # @return [ self ] The empty association.
95
96
  def clear
96
97
  batch_clear(_target.dup)
98
+ update_attributes_hash
97
99
  self
98
100
  end
99
101
 
@@ -115,7 +117,7 @@ module Mongoid
115
117
  # @example Use #persisted? inside block to count persisted documents.
116
118
  # person.addresses.count { |a| a.persisted? && a.country == "FR" }
117
119
  #
118
- # @param [ Object, Array<Object> ] args Args to delegate to the target.
120
+ # @param [ Object | Array<Object> ] args Args to delegate to the target.
119
121
  #
120
122
  # @return [ Integer ] The total number of persisted embedded docs, as
121
123
  # flagged by the #persisted? method.
@@ -133,22 +135,40 @@ module Mongoid
133
135
  #
134
136
  # @param [ Document ] document The document to be deleted.
135
137
  #
136
- # @return [ Document, nil ] The deleted document or nil if nothing deleted.
138
+ # @return [ Document | nil ] The deleted document or nil if nothing deleted.
137
139
  def delete(document)
138
- execute_callback :before_remove, document
139
- doc = _target.delete_one(document)
140
- if doc && !_binding?
141
- _unscoped.delete_one(doc)
142
- if _assigning?
143
- _base.add_atomic_pull(doc)
144
- else
145
- doc.delete(suppress: true)
146
- unbind_one(doc)
140
+ execute_callbacks_around(:remove, document) do
141
+ doc = _target.delete_one(document)
142
+ if doc && !_binding?
143
+ _unscoped.delete_one(doc)
144
+ if _assigning?
145
+ _base.add_atomic_pull(doc)
146
+ else
147
+ doc.delete(suppress: true)
148
+ unbind_one(doc)
149
+ end
150
+ update_attributes_hash
147
151
  end
152
+ reindex
153
+ doc
148
154
  end
155
+ end
156
+
157
+ # Mongoid::Extensions::Array defines Array#delete_one, so we need
158
+ # to make sure that method behaves reasonably on proxies, too.
159
+ alias delete_one delete
160
+
161
+ # Removes a single document from the collection *in memory only*.
162
+ # It will *not* persist the change.
163
+ #
164
+ # @param [ Document ] document The document to delete.
165
+ #
166
+ # @api private
167
+ def _remove(document)
168
+ _target.delete_one(document)
169
+ _unscoped.delete_one(document)
170
+ update_attributes_hash
149
171
  reindex
150
- execute_callback :after_remove, document
151
- doc
152
172
  end
153
173
 
154
174
  # Delete all the documents in the association without running callbacks.
@@ -173,7 +193,7 @@ module Mongoid
173
193
  # doc.state == "GA"
174
194
  # end
175
195
  #
176
- # @return [ Many, Enumerator ] The association or an enumerator if no
196
+ # @return [ Many | Enumerator ] The association or an enumerator if no
177
197
  # block was provided.
178
198
  def delete_if
179
199
  if block_given?
@@ -207,9 +227,9 @@ module Mongoid
207
227
  # @example Are there persisted documents?
208
228
  # person.posts.exists?
209
229
  #
210
- # @return [ true, false ] True is persisted documents exist, false if not.
230
+ # @return [ true | false ] True is persisted documents exist, false if not.
211
231
  def exists?
212
- count > 0
232
+ _target.any? { |doc| doc.persisted? }
213
233
  end
214
234
 
215
235
  # Finds a document in this association through several different
@@ -256,6 +276,7 @@ module Mongoid
256
276
  integrate(doc)
257
277
  doc._index = index
258
278
  end
279
+ update_attributes_hash
259
280
  @_unscoped = _target.dup
260
281
  @_target = scope(_target)
261
282
  end
@@ -283,7 +304,7 @@ module Mongoid
283
304
  # @param [ Integer ] count The number of documents to pop, or 1 if not
284
305
  # provided.
285
306
  #
286
- # @return [ Document, Array<Document> ] The popped document(s).
307
+ # @return [ Document | Array<Document> ] The popped document(s).
287
308
  def pop(count = nil)
288
309
  if count
289
310
  if docs = _target[_target.size - count, _target.size]
@@ -291,6 +312,8 @@ module Mongoid
291
312
  end
292
313
  else
293
314
  delete(_target[-1])
315
+ end.tap do
316
+ update_attributes_hash
294
317
  end
295
318
  end
296
319
 
@@ -306,7 +329,7 @@ module Mongoid
306
329
  # @param [ Integer ] count The number of documents to shift, or 1 if not
307
330
  # provided.
308
331
  #
309
- # @return [ Document, Array<Document> ] The shifted document(s).
332
+ # @return [ Document | Array<Document> ] The shifted document(s).
310
333
  def shift(count = nil)
311
334
  if count
312
335
  if _target.size > 0 && docs = _target[0, count]
@@ -314,6 +337,8 @@ module Mongoid
314
337
  end
315
338
  else
316
339
  delete(_target[0])
340
+ end.tap do
341
+ update_attributes_hash
317
342
  end
318
343
  end
319
344
 
@@ -328,6 +353,7 @@ module Mongoid
328
353
  # @return [ Many ] The proxied association.
329
354
  def substitute(docs)
330
355
  batch_replace(docs)
356
+ update_attributes_hash
331
357
  self
332
358
  end
333
359
 
@@ -365,6 +391,7 @@ module Mongoid
365
391
  end
366
392
  _unscoped.push(document)
367
393
  integrate(document)
394
+ update_attributes_hash
368
395
  document._index = _unscoped.size - 1
369
396
  execute_callback :after_add, document
370
397
  end
@@ -387,20 +414,6 @@ module Mongoid
387
414
  _association.criteria(_base, _target)
388
415
  end
389
416
 
390
- # Deletes one document from the target and unscoped.
391
- #
392
- # @api private
393
- #
394
- # @example Delete one document.
395
- # relation.delete_one(doc)
396
- #
397
- # @param [ Document ] document The document to delete.
398
- def delete_one(document)
399
- _target.delete_one(document)
400
- _unscoped.delete_one(document)
401
- reindex
402
- end
403
-
404
417
  # Integrate the document into the association. will set its metadata and
405
418
  # attempt to bind the inverse.
406
419
  #
@@ -418,7 +431,7 @@ module Mongoid
418
431
  #
419
432
  # If the method exists on the array, use the default proxy behavior.
420
433
  #
421
- # @param [ Symbol, String ] name The name of the method.
434
+ # @param [ Symbol | String ] name The name of the method.
422
435
  # @param [ Array ] args The method args
423
436
  # @param [ Proc ] block Optional block to pass.
424
437
  #
@@ -435,7 +448,7 @@ module Mongoid
435
448
  # @example Can we persist the association?
436
449
  # relation.persistable?
437
450
  #
438
- # @return [ true, false ] If the association is persistable.
451
+ # @return [ true | false ] If the association is persistable.
439
452
  def persistable?
440
453
  _base.persisted? && !_binding?
441
454
  end
@@ -479,13 +492,14 @@ module Mongoid
479
492
  # relation.remove_all({ :num => 1 }, true)
480
493
  #
481
494
  # @param [ Hash ] conditions Conditions to filter by.
482
- # @param [ true, false ] method :delete or :destroy.
495
+ # @param [ true | false ] method :delete or :destroy.
483
496
  #
484
497
  # @return [ Integer ] The number of documents removed.
485
498
  def remove_all(conditions = {}, method = :delete)
486
499
  criteria = where(conditions || {})
487
500
  removed = criteria.size
488
501
  batch_remove(criteria, method)
502
+ update_attributes_hash
489
503
  removed
490
504
  end
491
505
 
@@ -511,12 +525,22 @@ module Mongoid
511
525
  @_unscoped = docs
512
526
  end
513
527
 
528
+ # Returns a list of attributes hashes for each document.
529
+ #
530
+ # @return [ Array<Hash> ] The list of attributes hashes
514
531
  def as_attributes
515
- attributes = []
516
- _unscoped.each do |doc|
517
- attributes.push(doc.as_document)
532
+ _unscoped.map { |doc| doc.send(:as_attributes) }
533
+ end
534
+
535
+ # Update the _base's attributes hash with the _target's attributes
536
+ #
537
+ # @api private
538
+ def update_attributes_hash
539
+ if !_target.empty?
540
+ _base.attributes.merge!(_association.store_as => _target.map(&:attributes))
541
+ else
542
+ _base.attributes.delete(_association.store_as)
518
543
  end
519
- attributes
520
544
  end
521
545
 
522
546
  class << self
@@ -92,7 +92,7 @@ module Mongoid
92
92
 
93
93
  # Is this association polymorphic?
94
94
  #
95
- # @return [ true, false ] Whether this association is polymorphic.
95
+ # @return [ true | false ] Whether this association is polymorphic.
96
96
  def polymorphic?
97
97
  @polymorphic ||= !!@options[:as]
98
98
  end
@@ -101,7 +101,7 @@ module Mongoid
101
101
  #
102
102
  # @note Only relevant if the association is polymorphic.
103
103
  #
104
- # @return [ String, nil ] The field for storing the associated object's type.
104
+ # @return [ String | nil ] The field for storing the associated object's type.
105
105
  def type
106
106
  @type ||= "#{as}_type" if polymorphic?
107
107
  end
@@ -25,11 +25,25 @@ module Mongoid
25
25
  #
26
26
  # @return [ Document ] A single document.
27
27
  def build(base, object, _type = nil, selected_fields = nil)
28
- return object unless object.is_a?(Hash)
29
- if _loading? && base.persisted?
30
- Factory.from_db(klass, object, nil, selected_fields)
28
+ if object.is_a?(Hash)
29
+ if _loading? && base.persisted?
30
+ Factory.execute_from_db(klass, object, nil, selected_fields, execute_callbacks: false)
31
+ else
32
+ Factory.build(klass, object)
33
+ end
31
34
  else
32
- Factory.build(klass, object)
35
+ clear_associated(object)
36
+ object
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def clear_associated(doc)
43
+ if doc && (inv = inverse(doc))
44
+ if associated = doc.ivar(inv)
45
+ associated.substitute(nil)
46
+ end
33
47
  end
34
48
  end
35
49
  end
@@ -31,6 +31,7 @@ module Mongoid
31
31
  characterize_one(_target)
32
32
  bind_one
33
33
  characterize_one(_target)
34
+ update_attributes_hash(_target)
34
35
  _base._reset_memoized_descendants!
35
36
  _target.save if persistable?
36
37
  end
@@ -44,7 +45,7 @@ module Mongoid
44
45
  #
45
46
  # @param [ Document ] replacement A document to replace the target.
46
47
  #
47
- # @return [ Document, nil ] The association or nil.
48
+ # @return [ Document | nil ] The association or nil.
48
49
  def substitute(replacement)
49
50
  if replacement != self
50
51
  if _assigning?
@@ -80,11 +81,15 @@ module Mongoid
80
81
  end
81
82
  end
82
83
  unbind_one
83
- return nil unless replacement
84
+ unless replacement
85
+ update_attributes_hash(replacement)
86
+ return nil
87
+ end
84
88
  replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
85
89
  self._target = replacement
86
- bind_one
87
90
  characterize_one(_target)
91
+ bind_one
92
+ update_attributes_hash(_target)
88
93
  _target.save if persistable?
89
94
  end
90
95
  self
@@ -107,11 +112,25 @@ module Mongoid
107
112
  # @example Can we persist the association?
108
113
  # relation.persistable?
109
114
  #
110
- # @return [ true, false ] If the association is persistable.
115
+ # @return [ true | false ] If the association is persistable.
111
116
  def persistable?
112
117
  _base.persisted? && !_binding? && !_building? && !_assigning?
113
118
  end
114
119
 
120
+ # Update the _base's attributes hash with the _target's attributes
121
+ #
122
+ # @param replacement [ Document | nil ] The doc to use to update the
123
+ # attributes hash.
124
+ #
125
+ # @api private
126
+ def update_attributes_hash(replacement)
127
+ if replacement
128
+ _base.attributes.merge!(_association.store_as => replacement.attributes)
129
+ else
130
+ _base.attributes.delete(_association.store_as)
131
+ end
132
+ end
133
+
115
134
  class << self
116
135
 
117
136
  # Returns true if the association is an embedded one. In this case
@@ -66,7 +66,7 @@ module Mongoid
66
66
  # @example Get the validation default.
67
67
  # Proxy.validation_default
68
68
  #
69
- # @return [ true, false ] The validation default.
69
+ # @return [ true | false ] The validation default.
70
70
  def validation_default; true; end
71
71
 
72
72
  # Does this association type store the foreign key?
@@ -88,7 +88,7 @@ module Mongoid
88
88
 
89
89
  # Is this association polymorphic?
90
90
  #
91
- # @return [ true, false ] Whether this association is polymorphic.
91
+ # @return [ true | false ] Whether this association is polymorphic.
92
92
  def polymorphic?
93
93
  @polymorphic ||= !!@options[:as]
94
94
  end
@@ -97,7 +97,7 @@ module Mongoid
97
97
  #
98
98
  # @note Only relevant if the association is polymorphic.
99
99
  #
100
- # @return [ String, nil ] The field for storing the associated object's type.
100
+ # @return [ String | nil ] The field for storing the associated object's type.
101
101
  def type
102
102
  @type ||= "#{as}_type" if polymorphic?
103
103
  end
@@ -12,12 +12,38 @@ module Mongoid
12
12
  class_attribute :embedded, instance_reader: false
13
13
  class_attribute :embedded_relations
14
14
  class_attribute :relations
15
+
16
+ # A hash that maps aliases to their associations. This hash maps the
17
+ # associations "in database name" to its "in code" name. This is used when
18
+ # associations specify the `store_as` option, or on a referenced association.
19
+ # On a referenced association, this is used to map the foreign key to
20
+ # the association's name. For example, if we had the following
21
+ # relationship:
22
+ #
23
+ # User has_many Accounts
24
+ #
25
+ # User will have an entry in the aliased associations hash:
26
+ #
27
+ # account_ids => accounts
28
+ #
29
+ # Note that on the belongs_to associations, the mapping from
30
+ # foreign key => name is not in the aliased_associations hash, but a
31
+ # mapping from name => foreign key is in the aliased_fields hash.
32
+ #
33
+ # @return [ Hash<String, String> ] The aliased associations hash.
34
+ #
15
35
  # @api private
16
36
  class_attribute :aliased_associations
37
+
38
+ # @return [ Set<String> ] The set of associations that are configured
39
+ # with :store_as parameter.
40
+ class_attribute :stored_as_associations
41
+
17
42
  self.embedded = false
18
43
  self.embedded_relations = BSON::Document.new
19
44
  self.relations = BSON::Document.new
20
45
  self.aliased_associations = {}
46
+ self.stored_as_associations = Set.new
21
47
  end
22
48
 
23
49
  # This is convenience for libraries still on the old API.
@@ -196,8 +222,9 @@ module Mongoid
196
222
  Association::MACRO_MAPPING[macro_name].new(self, name, options, &block).tap do |assoc|
197
223
  assoc.setup!
198
224
  self.relations = self.relations.merge(name => assoc)
199
- if assoc.respond_to?(:store_as) && assoc.store_as != name
225
+ if assoc.embedded? && assoc.respond_to?(:store_as) && assoc.store_as != name
200
226
  self.aliased_associations[assoc.store_as] = name
227
+ self.stored_as_associations << assoc.store_as
201
228
  end
202
229
  end
203
230
  end
@@ -17,7 +17,7 @@ module Mongoid
17
17
  # @example Is the association empty??
18
18
  # person.addresses.blank?
19
19
  #
20
- # @return [ true, false ] If the association is empty or not.
20
+ # @return [ true | false ] If the association is empty or not.
21
21
  def blank?
22
22
  !any?
23
23
  end
@@ -28,7 +28,6 @@ module Mongoid
28
28
  # @example Create and save the new document.
29
29
  # person.posts.create(:text => "Testing")
30
30
  #
31
- #
32
31
  # @param [ Hash ] attributes The attributes to create with.
33
32
  # @param [ Class ] type The optional type of document to create.
34
33
  #
@@ -61,6 +60,11 @@ module Mongoid
61
60
  attributes.map { |attrs| create!(attrs, type, &block) }
62
61
  else
63
62
  doc = build(attributes, type, &block)
63
+
64
+ Array(doc).each do |doc|
65
+ doc.try(:run_pending_callbacks)
66
+ end
67
+
64
68
  _base.persisted? ? doc.save! : raise_unsaved(doc)
65
69
  doc
66
70
  end
@@ -126,9 +130,9 @@ module Mongoid
126
130
  # relation.respond_to?(:name)
127
131
  #
128
132
  # @param [ Symbol ] name The method name.
129
- # @param [ true, false ] include_private Whether to include private methods.
133
+ # @param [ true | false ] include_private Whether to include private methods.
130
134
  #
131
- # @return [ true, false ] If the proxy responds to the method.
135
+ # @return [ true | false ] If the proxy responds to the method.
132
136
  def respond_to?(name, include_private = false)
133
137
  [].respond_to?(name, include_private) ||
134
138
  klass.respond_to?(name, include_private) || super
@@ -153,9 +157,9 @@ module Mongoid
153
157
  #
154
158
  # @param [ Hash ] options The options to pass.
155
159
  #
156
- # @option options [ Symbol ] :include What associations to include
157
- # @option options [ Symbol ] :only Limit the fields to only these.
158
- # @option options [ Symbol ] :except Dont include these fields.
160
+ # @option options [ Symbol | String | Array<Symbol | String> ] :except Do not include these field(s).
161
+ # @option options [ Symbol | String | Array<Symbol | String> ] :include Which association(s) to include.
162
+ # @option options [ Symbol | String | Array<Symbol | String> ] :only Limit the field(s) to only these.
159
163
  #
160
164
  # @return [ Hash ] The documents, ready to be serialized.
161
165
  def serializable_hash(options = {})
@@ -65,7 +65,7 @@ module Mongoid
65
65
  #
66
66
  # @param [ Hash ] attributes The attributes to pull the flag from.
67
67
  #
68
- # @return [ true, false ] If the association can potentially be deleted.
68
+ # @return [ true | false ] If the association can potentially be deleted.
69
69
  def destroyable?(attributes)
70
70
  destroy = attributes.delete(:_destroy)
71
71
  Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
@@ -79,7 +79,7 @@ module Mongoid
79
79
  #
80
80
  # @param [ Hash ] attributes The attributes being set.
81
81
  #
82
- # @return [ true, false ] If the attributes exceed the limit.
82
+ # @return [ true | false ] If the attributes exceed the limit.
83
83
  def over_limit?(attributes)
84
84
  limit = options[:limit]
85
85
  limit ? attributes.size > limit : false
@@ -134,8 +134,9 @@ module Mongoid
134
134
  # @param [ Proxy ] relation The association proxy.
135
135
  # @param [ Document ] doc The document to delete.
136
136
  def destroy_document(relation, doc)
137
+ res = doc.destroy unless doc.embedded? || doc.destroyed?
137
138
  relation.delete(doc)
138
- doc.destroy unless doc.embedded? || doc.destroyed?
139
+ res
139
140
  end
140
141
 
141
142
  # Update the document.
@@ -164,7 +165,7 @@ module Mongoid
164
165
  # builder.update_nested_relation(parent, id, attrs)
165
166
  #
166
167
  # @param [ Document ] parent The parent document.
167
- # @param [ String, BSON::ObjectId ] id of the related document.
168
+ # @param [ String | BSON::ObjectId ] id of the related document.
168
169
  # @param [ Hash ] attrs The single document attributes to process.
169
170
  def update_nested_relation(parent, id, attrs)
170
171
  first = existing.first
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Do we allow a destroy?
13
13
  # builder.allow_destroy?
14
14
  #
15
- # @return [ true, false ] True if the allow destroy option was set.
15
+ # @return [ true | false ] True if the allow destroy option was set.
16
16
  def allow_destroy?
17
17
  options[:allow_destroy] || false
18
18
  end
@@ -25,7 +25,7 @@ module Mongoid
25
25
  # @param [ Document ] document The parent document of the association
26
26
  # @param [ Hash ] attrs The attributes to check for rejection.
27
27
  #
28
- # @return [ true, false ] True and call proc or method if rejectable, false if not.
28
+ # @return [ true | false ] True and call proc or method if rejectable, false if not.
29
29
  def reject?(document, attrs)
30
30
  case callback = options[:reject_if]
31
31
  when Symbol
@@ -43,7 +43,7 @@ module Mongoid
43
43
  # @example Is this update only?
44
44
  # builder.update_only?
45
45
  #
46
- # @return [ true, false ] True if the update_only option was set.
46
+ # @return [ true | false ] True if the update_only option was set.
47
47
  def update_only?
48
48
  options[:update_only] || false
49
49
  end
@@ -56,7 +56,7 @@ module Mongoid
56
56
  # @param [ Class ] klass The class we're trying to convert for.
57
57
  # @param [ String ] id The id, usually coming from the form.
58
58
  #
59
- # @return [ BSON::ObjectId, String, Object ] The converted id.
59
+ # @return [ BSON::ObjectId | String | Object ] The converted id.
60
60
  def convert_id(klass, id)
61
61
  klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
62
62
  end
@@ -62,7 +62,7 @@ module Mongoid
62
62
  # @example Is the id acceptable?
63
63
  # one.acceptable_id?
64
64
  #
65
- # @return [ true, false ] If the id part of the logic will allow an update.
65
+ # @return [ true | false ] If the id part of the logic will allow an update.
66
66
  def acceptable_id?
67
67
  id = association.klass.extract_id_field(attributes)
68
68
  id = convert_id(existing.class, id)
@@ -74,7 +74,7 @@ module Mongoid
74
74
  # @example Can the existing object be deleted?
75
75
  # one.delete?
76
76
  #
77
- # @return [ true, false ] If the association should be deleted.
77
+ # @return [ true | false ] If the association should be deleted.
78
78
  def delete?
79
79
  id = association.klass.extract_id_field(attributes)
80
80
  destroyable? && !id.nil?
@@ -85,7 +85,7 @@ module Mongoid
85
85
  # @example Is the object destroyable?
86
86
  # one.destroyable?({ :_destroy => "1" })
87
87
  #
88
- # @return [ true, false ] If the association can potentially be
88
+ # @return [ true | false ] If the association can potentially be
89
89
  # destroyed.
90
90
  def destroyable?
91
91
  Nested::DESTROY_FLAGS.include?(destroy) && allow_destroy?
@@ -96,7 +96,7 @@ module Mongoid
96
96
  # @example Is the document to be replaced?
97
97
  # one.replace?
98
98
  #
99
- # @return [ true, false ] If the document should be replaced.
99
+ # @return [ true | false ] If the document should be replaced.
100
100
  def replace?
101
101
  !existing && !destroyable? && !attributes.blank?
102
102
  end
@@ -106,7 +106,7 @@ module Mongoid
106
106
  # @example Should the document be updated?
107
107
  # one.update?
108
108
  #
109
- # @return [ true, false ] If the object should have its attributes updated.
109
+ # @return [ true | false ] If the object should have its attributes updated.
110
110
  def update?
111
111
  existing && !destroyable? && acceptable_id?
112
112
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Clear the relation.
13
13
  # relation.clear
14
14
  #
15
- # @return [ true, false ] If the delete succeeded.
15
+ # @return [ true | false ] If the delete succeeded.
16
16
  def clear
17
17
  _target.delete
18
18
  end
@@ -34,7 +34,7 @@ module Mongoid
34
34
  #
35
35
  # @param [ Symbol ] name The method name.
36
36
  #
37
- # @return [ true, false ] If the proxy responds to the method.
37
+ # @return [ true | false ] If the proxy responds to the method.
38
38
  def respond_to?(name, include_private = false)
39
39
  _target.respond_to?(name, include_private) || super
40
40
  end