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
@@ -7,7 +7,7 @@ module Mongoid
7
7
 
8
8
  # Returns the name of the parent to a polymorphic child.
9
9
  #
10
- # @return [ String, Symbol ] The name.
10
+ # @return [ String | Symbol ] The name.
11
11
  def as
12
12
  @options[:as]
13
13
  end
@@ -28,21 +28,21 @@ module Mongoid
28
28
 
29
29
  # Whether to index the primary or foreign key field.
30
30
  #
31
- # @return [ true, false ]
31
+ # @return [ true | false ]
32
32
  def indexed?
33
33
  @indexed ||= !!@options[:index]
34
34
  end
35
35
 
36
36
  # Whether the association is autobuilding.
37
37
  #
38
- # @return [ true, false ]
38
+ # @return [ true | false ]
39
39
  def autobuilding?
40
40
  !!@options[:autobuild]
41
41
  end
42
42
 
43
43
  # Is the association cyclic.
44
44
  #
45
- # @return [ true, false ] Whether the association is cyclic.
45
+ # @return [ true | false ] Whether the association is cyclic.
46
46
  def cyclic?
47
47
  !!@options[:cyclic]
48
48
  end
@@ -57,7 +57,7 @@ module Mongoid
57
57
  # Mongoid assumes that the field used to hold the primary key of the association is id.
58
58
  # You can override this and explicitly specify the primary key with the :primary_key option.
59
59
  #
60
- # @return [ Symbol, String ] The primary key.
60
+ # @return [ Symbol | String ] The primary key.
61
61
  def primary_key
62
62
  @primary_key ||= @options[:primary_key] ? @options[:primary_key].to_s : Relatable::PRIMARY_KEY_DEFAULT
63
63
  end
@@ -65,7 +65,7 @@ module Mongoid
65
65
  # Options to save any loaded members and destroy members that are marked for destruction
66
66
  # when the parent object is saved.
67
67
  #
68
- # @return [ true, false ] The autosave option.
68
+ # @return [ true | false ] The autosave option.
69
69
  def autosave
70
70
  !!@options[:autosave]
71
71
  end
@@ -73,19 +73,19 @@ module Mongoid
73
73
 
74
74
  # Whether the association is counter-cached.
75
75
  #
76
- # @return [ true, false ]
76
+ # @return [ true | false ]
77
77
  def counter_cached?
78
78
  !!@options[:counter_cache]
79
79
  end
80
80
 
81
81
  # Whether this association is polymorphic.
82
82
  #
83
- # @return [ true, false ] Whether the association is polymorphic.
83
+ # @return [ true | false ] Whether the association is polymorphic.
84
84
  def polymorphic?; false; end
85
85
 
86
86
  # Whether the association has callbacks cascaded down from the parent.
87
87
  #
88
- # @return [ true, false ] Whether callbacks are cascaded.
88
+ # @return [ true | false ] Whether callbacks are cascaded.
89
89
  def cascading_callbacks?
90
90
  !!@options[:cascade_callbacks]
91
91
  end
@@ -48,7 +48,7 @@ module Mongoid
48
48
  # proxy.init(person, name, association)
49
49
  #
50
50
  # @param [ Document ] base The base document on the proxy.
51
- # @param [ Document, Array<Document> ] target The target of the proxy.
51
+ # @param [ Document | Array<Document> ] target The target of the proxy.
52
52
  # @param [ Association ] association The association metadata.
53
53
  def init(base, target, association)
54
54
  @_base, @_target, @_association = base, target, association
@@ -117,9 +117,8 @@ module Mongoid
117
117
  # Default behavior of method missing should be to delegate all calls
118
118
  # to the target of the proxy. This can be overridden in special cases.
119
119
  #
120
- # @param [ String, Symbol ] name The name of the method.
120
+ # @param [ String | Symbol ] name The name of the method.
121
121
  # @param [ Array ] args The arguments passed to the method.
122
- #
123
122
  ruby2_keywords def method_missing(name, *args, &block)
124
123
  _target.send(name, *args, &block)
125
124
  end
@@ -169,6 +168,18 @@ module Mongoid
169
168
  end
170
169
  end
171
170
 
171
+ # Execute the before and after callbacks for the given method.
172
+ #
173
+ # @param [ Symbol ] name The name of the callbacks to execute.
174
+ #
175
+ # @return [ Object ] The result of the given block
176
+ def execute_callbacks_around(name, doc)
177
+ execute_callback :"before_#{name.to_s}", doc
178
+ yield.tap do
179
+ execute_callback :"after_#{name.to_s}", doc
180
+ end
181
+ end
182
+
172
183
  class << self
173
184
 
174
185
  # Apply ordering to the criteria if it was defined on the association.
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # @example Is the document autosaved?
13
13
  # document.autosaved?
14
14
  #
15
- # @return [ true, false ] Has the document already been autosaved?
15
+ # @return [ true | false ] Has the document already been autosaved?
16
16
  def autosaved?
17
17
  Threaded.autosaved?(self)
18
18
  end
@@ -56,7 +56,8 @@ module Mongoid
56
56
  __autosaving__ do
57
57
  if assoc_value = ivar(association.name)
58
58
  Array(assoc_value).each do |doc|
59
- doc.with(persistence_context) do |d|
59
+ pc = doc.persistence_context? ? doc.persistence_context : persistence_context
60
+ doc.with(pc) do |d|
60
61
  d.save
61
62
  end
62
63
  end
@@ -64,7 +65,7 @@ module Mongoid
64
65
  end
65
66
  end
66
67
  end
67
- klass.after_save save_method, unless: :autosaved?
68
+ klass.after_persist_parent save_method, unless: :autosaved?
68
69
  end
69
70
  end
70
71
  end
@@ -28,6 +28,7 @@ module Mongoid
28
28
  if _base.referenced_many?
29
29
  _target.__send__(inverse).push(_base)
30
30
  else
31
+ remove_associated(_target)
31
32
  _target.set_relation(inverse, _base)
32
33
  end
33
34
  end
@@ -28,7 +28,7 @@ module Mongoid
28
28
  private
29
29
 
30
30
  def execute_query(object, type)
31
- query_criteria(object, type).limit(1).first(id_sort: :none)
31
+ query_criteria(object, type).take
32
32
  end
33
33
 
34
34
  def query_criteria(object, type)
@@ -18,7 +18,7 @@ module Mongoid
18
18
  # Association::BelongsTo::Proxy.new(game, person, association)
19
19
  #
20
20
  # @param [ Document ] base The document this association hangs off of.
21
- # @param [ Document, Array<Document> ] target The target (parent) of the
21
+ # @param [ Document | Array<Document> ] target The target (parent) of the
22
22
  # association.
23
23
  # @param [ Association ] association The association object.
24
24
  def initialize(base, target, association)
@@ -34,7 +34,6 @@ module Mongoid
34
34
  #
35
35
  # @example Nullify the association.
36
36
  # person.game.nullify
37
- #
38
37
  def nullify
39
38
  unbind_one
40
39
  _target.save
@@ -46,9 +45,9 @@ module Mongoid
46
45
  # @example Substitute the association.
47
46
  # name.substitute(new_name)
48
47
  #
49
- # @param [ Document, Array<Document> ] replacement The replacement.
48
+ # @param [ Document | Array<Document> ] replacement The replacement.
50
49
  #
51
- # @return [ self, nil ] The association or nil.
50
+ # @return [ self | nil ] The association or nil.
52
51
  def substitute(replacement)
53
52
  unbind_one
54
53
  if replacement
@@ -77,7 +76,7 @@ module Mongoid
77
76
  # @example Normalize the substitute.
78
77
  # proxy.normalize(id)
79
78
  #
80
- # @param [ Document, Object ] replacement The replacement object.
79
+ # @param [ Document | Object ] replacement The replacement object.
81
80
  #
82
81
  # @return [ Document ] The document.
83
82
  def normalize(replacement)
@@ -90,7 +89,7 @@ module Mongoid
90
89
  # @example Can we persist the association?
91
90
  # relation.persistable?
92
91
  #
93
- # @return [ true, false ] If the association is persistable.
92
+ # @return [ true | false ] If the association is persistable.
94
93
  def persistable?
95
94
  _target.persisted? && !_binding? && !_building?
96
95
  end
@@ -97,7 +97,7 @@ module Mongoid
97
97
 
98
98
  # Is this association polymorphic?
99
99
  #
100
- # @return [ true, false ] Whether this association is polymorphic.
100
+ # @return [ true | false ] Whether this association is polymorphic.
101
101
  def polymorphic?
102
102
  @polymorphic ||= !!@options[:polymorphic]
103
103
  end
@@ -153,7 +153,7 @@ module Mongoid
153
153
  create_foreign_key_field!
154
154
  setup_index!
155
155
  define_touchable!
156
- @owner_class.validates_associated(name) if validate?
156
+ @owner_class.validates_associated(name) if validate? || require_association?
157
157
  @owner_class.validates(name, presence: true) if require_association?
158
158
  end
159
159
 
@@ -13,7 +13,7 @@ module Mongoid
13
13
  # @example Reset the given counter cache
14
14
  # post.reset_counters(:comments)
15
15
  #
16
- # @param [ Symbol, Array ] counters One or more counter caches to reset
16
+ # @param [ Symbol | Array ] counters One or more counter caches to reset
17
17
  def reset_counters(*counters)
18
18
  self.class.with(persistence_context) do |_class|
19
19
  _class.reset_counters(self, *counters)
@@ -30,7 +30,7 @@ module Mongoid
30
30
  # Post.reset_counters('50e0edd97c71c17ea9000001', :comments)
31
31
  #
32
32
  # @param [ String ] id The id of the object that will be reset.
33
- # @param [ Symbol, Array ] counters One or more counter caches to reset
33
+ # @param [ Symbol | Array ] counters One or more counter caches to reset
34
34
  def reset_counters(id, *counters)
35
35
  document = id.is_a?(Document) ? id : find(id)
36
36
  counters.each do |name|
@@ -97,18 +97,18 @@ module Mongoid
97
97
 
98
98
  association.inverse_class.tap do |klass|
99
99
  klass.after_update do
100
- if record = __send__(name)
101
- foreign_key = association.foreign_key
100
+ foreign_key = association.foreign_key
102
101
 
103
- if attribute_changed?(foreign_key)
104
- original, current = attribute_change(foreign_key)
102
+ if send("#{foreign_key}_previously_changed?")
103
+ original, current = send("#{foreign_key}_previous_change")
105
104
 
106
- unless original.nil?
107
- record.class.with(persistence_context) do |_class|
108
- _class.decrement_counter(cache_column, original)
109
- end
105
+ unless original.nil?
106
+ association.klass.with(persistence_context) do |_class|
107
+ _class.decrement_counter(cache_column, original)
110
108
  end
109
+ end
111
110
 
111
+ if record = __send__(name)
112
112
  unless current.nil?
113
113
  record[cache_column] = (record[cache_column] || 0) + 1
114
114
  record.class.with(record.persistence_context) do |_class|
@@ -85,7 +85,7 @@ module Mongoid
85
85
  # loader.set_on_parent("foo", docs)
86
86
  #
87
87
  # @param [ ObjectId ] id parent`s id
88
- # @param [ Document, Array ] element to push into the parent
88
+ # @param [ Document | Array ] element to push into the parent
89
89
  def set_on_parent(id, element)
90
90
  grouped_docs[id].each do |d|
91
91
  set_relation(d, element)
@@ -140,7 +140,7 @@ module Mongoid
140
140
  # loader.set_relation(doc, docs)
141
141
  #
142
142
  # @param [ Document ] doc The object to set the association on
143
- # @param [ Document, Array ] element to set into the parent
143
+ # @param [ Document | Array ] element to set into the parent
144
144
  def set_relation(doc, element)
145
145
  doc.set_relation(@association.name, element) unless doc.blank?
146
146
  end
@@ -21,17 +21,41 @@ module Mongoid
21
21
  # @example Concat with other documents.
22
22
  # person.posts.concat([ post_one, post_two ])
23
23
  #
24
- # @param [ Document, Array<Document> ] args Any number of documents.
24
+ # @param [ Document | Array<Document> ] args Any number of documents.
25
25
  #
26
26
  # @return [ Array<Document> ] The loaded docs.
27
27
  def <<(*args)
28
28
  docs = args.flatten
29
29
  return concat(docs) if docs.size > 1
30
30
  if doc = docs.first
31
- append(doc)
32
- _base.add_to_set(foreign_key => doc.public_send(_association.primary_key))
33
- if child_persistable?(doc)
34
- doc.save
31
+ append(doc) do
32
+ # We ignore the changes to the value for the foreign key in the
33
+ # changed_attributes hash in this block of code for two reasons:
34
+ #
35
+ # 1) The add_to_set method deletes the value for the foreign
36
+ # key in the changed_attributes hash, but if we enter this
37
+ # method with a value for the foreign key in the
38
+ # changed_attributes hash, then we want it to exist outside
39
+ # this method as well. It's used later on in the Syncable
40
+ # module to set the inverse foreign keys.
41
+ # 2) The reset_unloaded method accesses the value for the foreign
42
+ # key on _base, which causes it to get added to the
43
+ # changed_attributes hash. This happens because when reading
44
+ # a "resizable" attribute, it is automatically added to the
45
+ # changed_attributes hash. This is true only for the foreign
46
+ # key value for HABTM associations as the other associations
47
+ # use strings for their foreign key values. For consistency
48
+ # with the other associations, we ignore this addition to
49
+ # the changed_attributes hash.
50
+ # See MONGOID-4843 for a longer discussion about this.
51
+ reset_foreign_key_changes do
52
+ _base.add_to_set(foreign_key => doc.public_send(_association.primary_key))
53
+
54
+ if child_persistable?(doc)
55
+ doc.save
56
+ end
57
+ reset_unloaded
58
+ end
35
59
  end
36
60
  end
37
61
  unsynced(_base, foreign_key) and self
@@ -81,12 +105,13 @@ module Mongoid
81
105
  #
82
106
  # @return [ Document ] The new document.
83
107
  def build(attributes = {}, type = nil)
84
- doc = Factory.build(type || klass, attributes)
85
- _base.public_send(foreign_key).push(doc.public_send(_association.primary_key))
108
+ doc = Factory.execute_build(type || klass, attributes, execute_callbacks: false)
86
109
  append(doc)
87
110
  doc.apply_post_processed_defaults
111
+ _base.public_send(foreign_key).push(doc.public_send(_association.primary_key))
88
112
  unsynced(doc, inverse_foreign_key)
89
113
  yield(doc) if block_given?
114
+ doc.run_pending_callbacks
90
115
  doc
91
116
  end
92
117
 
@@ -112,6 +137,10 @@ module Mongoid
112
137
  doc
113
138
  end
114
139
 
140
+ # Mongoid::Extensions::Array defines Array#delete_one, so we need
141
+ # to make sure that method behaves reasonably on proxies, too.
142
+ alias delete_one delete
143
+
115
144
  # Removes all associations between the base document and the target
116
145
  # documents by deleting the foreign keys and the references, orphaning
117
146
  # the target documents in the process.
@@ -178,6 +207,7 @@ module Mongoid
178
207
  push(replacement.compact.uniq)
179
208
  else
180
209
  reset_unloaded
210
+ clear_foreign_key_changes
181
211
  end
182
212
  self
183
213
  end
@@ -195,6 +225,32 @@ module Mongoid
195
225
 
196
226
  private
197
227
 
228
+ # Clears the foreign key from the changed_attributes hash.
229
+ #
230
+ # This is, in general, used to clear the foreign key from the
231
+ # changed_attributes hash for consistency with the other referenced
232
+ # associations.
233
+ #
234
+ # @api private
235
+ def clear_foreign_key_changes
236
+ _base.changed_attributes.delete(foreign_key)
237
+ end
238
+
239
+ # Reset the value in the changed_attributes hash for the foreign key
240
+ # to its value before executing the given block.
241
+ #
242
+ # @api private
243
+ def reset_foreign_key_changes
244
+ if _base.changed_attributes.key?(foreign_key)
245
+ fk = _base.changed_attributes[foreign_key].dup
246
+ yield if block_given?
247
+ _base.changed_attributes[foreign_key] = fk
248
+ else
249
+ yield if block_given?
250
+ clear_foreign_key_changes
251
+ end
252
+ end
253
+
198
254
  # Appends the document to the target array, updating the index on the
199
255
  # document at the same time.
200
256
  #
@@ -203,11 +259,12 @@ module Mongoid
203
259
  #
204
260
  # @param [ Document ] document The document to append to the target.
205
261
  def append(document)
206
- execute_callback :before_add, document
207
- _target.push(document)
208
- characterize_one(document)
209
- bind_one(document)
210
- execute_callback :after_add, document
262
+ execute_callbacks_around(:add, document) do
263
+ _target.push(document)
264
+ characterize_one(document)
265
+ bind_one(document)
266
+ yield if block_given?
267
+ end
211
268
  end
212
269
 
213
270
  # Instantiate the binding associated with this association.
@@ -229,7 +286,7 @@ module Mongoid
229
286
  #
230
287
  # @param [ Document ] doc The document.
231
288
  #
232
- # @return [ true, false ] If the document can be persisted.
289
+ # @return [ true | false ] If the document can be persisted.
233
290
  def child_persistable?(doc)
234
291
  (persistable? || _creating?) &&
235
292
  !(doc.persisted? && _association.forced_nil_inverse?)
@@ -78,7 +78,7 @@ module Mongoid
78
78
 
79
79
  # Are ids only saved on this side of the association?
80
80
  #
81
- # @return [ true, false ] Whether this association has a forced nil inverse.
81
+ # @return [ true | false ] Whether this association has a forced nil inverse.
82
82
  def forced_nil_inverse?
83
83
  @forced_nil_inverse ||= @options.key?(:inverse_of) && !@options[:inverse_of]
84
84
  end
@@ -119,6 +119,8 @@ module Mongoid
119
119
  @options[:inverse_foreign_key]
120
120
  elsif @options.key?(:inverse_of)
121
121
  inverse_of ? "#{inverse_of.to_s.singularize}#{FOREIGN_KEY_SUFFIX}" : nil
122
+ elsif inv = inverse_association&.foreign_key
123
+ inv
122
124
  else
123
125
  "#{inverse_class_name.demodulize.underscore}#{FOREIGN_KEY_SUFFIX}"
124
126
  end
@@ -129,7 +131,7 @@ module Mongoid
129
131
  #
130
132
  # @param [ Document ] doc The document to be bound.
131
133
  #
132
- # @return [ true, false ] Whether the document can be bound.
134
+ # @return [ true | false ] Whether the document can be bound.
133
135
  def bindable?(doc)
134
136
  forced_nil_inverse? || (!!inverse && doc.fields.keys.include?(foreign_key))
135
137
  end
@@ -219,7 +221,7 @@ module Mongoid
219
221
  def synced_save
220
222
  assoc = self
221
223
  inverse_class.set_callback(
222
- :save,
224
+ :persist_parent,
223
225
  :after,
224
226
  if: ->(doc){ doc._syncable?(assoc) }
225
227
  ) do |doc|
@@ -228,6 +230,7 @@ module Mongoid
228
230
  end
229
231
 
230
232
  def create_foreign_key_field!
233
+ inverse_class.aliased_associations[foreign_key] = name.to_s
231
234
  @owner_class.field(
232
235
  foreign_key,
233
236
  type: FOREIGN_KEY_FIELD_TYPE,
@@ -28,7 +28,7 @@ module Mongoid
28
28
  #
29
29
  # @param [ Enumerable ] other The other enumerable.
30
30
  #
31
- # @return [ true, false ] If the objects are equal.
31
+ # @return [ true | false ] If the objects are equal.
32
32
  def ==(other)
33
33
  return false unless other.respond_to?(:entries)
34
34
  entries == other.entries
@@ -42,7 +42,7 @@ module Mongoid
42
42
  #
43
43
  # @param [ Object ] other The object to check.
44
44
  #
45
- # @return [ true, false ] If the objects are equal in a case.
45
+ # @return [ true | false ] If the objects are equal in a case.
46
46
  def ===(other)
47
47
  return false unless other.respond_to?(:entries)
48
48
  if Mongoid.legacy_triple_equals
@@ -192,7 +192,7 @@ module Mongoid
192
192
  # @example Is the enumerable empty?
193
193
  # enumerable.empty?
194
194
  #
195
- # @return [ true, false ] If the enumerable is empty.
195
+ # @return [ true | false ] If the enumerable is empty.
196
196
  def empty?
197
197
  if _loaded?
198
198
  in_memory.empty?
@@ -224,7 +224,7 @@ module Mongoid
224
224
  # @param [ Object ] condition The condition that documents
225
225
  # must satisfy. See Enumerable documentation for details.
226
226
  #
227
- # @return [ true, false ] If the association has any documents.
227
+ # @return [ true | false ] If the association has any documents.
228
228
  def any?(*args)
229
229
  return super if args.any? || block_given?
230
230
 
@@ -240,17 +240,15 @@ module Mongoid
240
240
  # @note Automatically adding a sort on _id when no other sort is
241
241
  # defined on the criteria has the potential to cause bad performance issues.
242
242
  # If you experience unexpected poor performance when using #first or #last,
243
- # use the option { id_sort: :none }.
244
- # Be aware that #first/#last won't guarantee order in this case.
243
+ # use #take instead.
244
+ # Be aware that #take won't guarantee order.
245
245
  #
246
- # @param [ Hash ] opts The options for the query returning the first document.
247
- #
248
- # @option opts [ :none ] :id_sort Don't apply a sort on _id.
246
+ # @param [ Integer ] limit The number of documents to return.
249
247
  #
250
248
  # @return [ Document ] The first document found.
251
- def first(opts = {})
249
+ def first(limit = nil)
252
250
  _loaded.try(:values).try(:first) ||
253
- _added[(ul = _unloaded.try(:first, opts)).try(:_id)] ||
251
+ _added[(ul = _unloaded.try(:first, limit)).try(:_id)] ||
254
252
  ul ||
255
253
  _added.values.try(:first)
256
254
  end
@@ -263,7 +261,7 @@ module Mongoid
263
261
  # @example Initialize the enumerable with an array.
264
262
  # Enumerable.new([ post ])
265
263
  #
266
- # @param [ Criteria, Array<Document> ] target The wrapped object.
264
+ # @param [ Criteria | Array<Document> ] target The wrapped object.
267
265
  def initialize(target, base = nil, association = nil)
268
266
  @_base = base
269
267
  @_association = association
@@ -285,7 +283,7 @@ module Mongoid
285
283
  #
286
284
  # @param [ Document ] doc The document to check.
287
285
  #
288
- # @return [ true, false ] If the document is in the target.
286
+ # @return [ true | false ] If the document is in the target.
289
287
  def include?(doc)
290
288
  return super unless _unloaded
291
289
  _unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
@@ -327,18 +325,16 @@ module Mongoid
327
325
  # @note Automatically adding a sort on _id when no other sort is
328
326
  # defined on the criteria has the potential to cause bad performance issues.
329
327
  # If you experience unexpected poor performance when using #first or #last,
330
- # use the option { id_sort: :none }.
331
- # Be aware that #first/#last won't guarantee order in this case.
332
- #
333
- # @param [ Hash ] opts The options for the query returning the first document.
328
+ # use #take instead.
329
+ # Be aware that #take won't guarantee order.
334
330
  #
335
- # @option opts [ :none ] :id_sort Don't apply a sort on _id.
331
+ # @param [ Integer ] limit The number of documents to return.
336
332
  #
337
333
  # @return [ Document ] The last document found.
338
- def last(opts = {})
334
+ def last(limit = nil)
339
335
  _added.values.try(:last) ||
340
336
  _loaded.try(:values).try(:last) ||
341
- _added[(ul = _unloaded.try(:last, opts)).try(:_id)] ||
337
+ _added[(ul = _unloaded.try(:last, limit)).try(:_id)] ||
342
338
  ul
343
339
  end
344
340
 
@@ -356,7 +352,7 @@ module Mongoid
356
352
  # @example Is the enumerable _loaded?
357
353
  # enumerable._loaded?
358
354
  #
359
- # @return [ true, false ] If the enumerable has been _loaded.
355
+ # @return [ true | false ] If the enumerable has been _loaded.
360
356
  def _loaded?
361
357
  !!@executed
362
358
  end
@@ -409,11 +405,11 @@ module Mongoid
409
405
  # @example Does the enumerable respond to the method?
410
406
  # enumerable.respond_to?(:sum)
411
407
  #
412
- # @param [ String, Symbol ] name The name of the method.
413
- # @param [ true, false ] include_private Whether to include private
408
+ # @param [ String | Symbol ] name The name of the method.
409
+ # @param [ true | false ] include_private Whether to include private
414
410
  # methods.
415
411
  #
416
- # @return [ true, false ] Whether the enumerable responds.
412
+ # @return [ true | false ] Whether the enumerable responds.
417
413
  def respond_to?(name, include_private = false)
418
414
  [].respond_to?(name, include_private) || super
419
415
  end