mongoid 7.5.4 → 8.1.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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +6 -6
  4. data/Rakefile +44 -46
  5. data/lib/config/locales/en.yml +92 -43
  6. data/lib/mongoid/association/accessors.rb +44 -11
  7. data/lib/mongoid/association/bindable.rb +50 -2
  8. data/lib/mongoid/association/builders.rb +5 -3
  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 +34 -11
  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/buildable.rb +2 -2
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
  16. data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
  17. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
  18. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
  20. data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
  21. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
  23. data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
  24. data/lib/mongoid/association/macros.rb +8 -1
  25. data/lib/mongoid/association/many.rb +11 -7
  26. data/lib/mongoid/association/nested/many.rb +5 -4
  27. data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
  28. data/lib/mongoid/association/nested/one.rb +45 -7
  29. data/lib/mongoid/association/one.rb +2 -2
  30. data/lib/mongoid/association/options.rb +9 -9
  31. data/lib/mongoid/association/proxy.rb +15 -4
  32. data/lib/mongoid/association/referenced/auto_save.rb +4 -3
  33. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
  34. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  35. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
  36. data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
  37. data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
  38. data/lib/mongoid/association/referenced/eager.rb +2 -2
  39. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
  40. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
  41. data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
  42. data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
  43. data/lib/mongoid/association/referenced/has_many.rb +3 -3
  44. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  45. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
  46. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
  47. data/lib/mongoid/association/referenced/has_one.rb +3 -3
  48. data/lib/mongoid/association/referenced/syncable.rb +4 -4
  49. data/lib/mongoid/association/reflections.rb +4 -4
  50. data/lib/mongoid/association/relatable.rb +44 -10
  51. data/lib/mongoid/association.rb +5 -5
  52. data/lib/mongoid/atomic/modifiers.rb +2 -2
  53. data/lib/mongoid/atomic.rb +16 -7
  54. data/lib/mongoid/attributes/dynamic.rb +4 -4
  55. data/lib/mongoid/attributes/nested.rb +6 -6
  56. data/lib/mongoid/attributes/processing.rb +37 -6
  57. data/lib/mongoid/attributes/projector.rb +2 -2
  58. data/lib/mongoid/attributes/readonly.rb +3 -3
  59. data/lib/mongoid/attributes.rb +51 -42
  60. data/lib/mongoid/changeable.rb +147 -14
  61. data/lib/mongoid/clients/options.rb +5 -1
  62. data/lib/mongoid/clients/sessions.rb +2 -14
  63. data/lib/mongoid/clients/storage_options.rb +2 -5
  64. data/lib/mongoid/clients/validators/storage.rb +3 -15
  65. data/lib/mongoid/collection_configurable.rb +58 -0
  66. data/lib/mongoid/composable.rb +2 -0
  67. data/lib/mongoid/config/defaults.rb +60 -0
  68. data/lib/mongoid/config/options.rb +3 -0
  69. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  70. data/lib/mongoid/config/validators/client.rb +6 -6
  71. data/lib/mongoid/config/validators.rb +1 -0
  72. data/lib/mongoid/config.rb +153 -18
  73. data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
  74. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
  75. data/lib/mongoid/contextual/aggregable/none.rb +1 -1
  76. data/lib/mongoid/contextual/atomic.rb +1 -1
  77. data/lib/mongoid/contextual/geo_near.rb +7 -7
  78. data/lib/mongoid/contextual/map_reduce.rb +2 -2
  79. data/lib/mongoid/contextual/memory.rb +285 -58
  80. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  81. data/lib/mongoid/contextual/mongo.rb +540 -346
  82. data/lib/mongoid/contextual/none.rb +193 -20
  83. data/lib/mongoid/contextual/queryable.rb +1 -1
  84. data/lib/mongoid/contextual.rb +14 -2
  85. data/lib/mongoid/copyable.rb +32 -8
  86. data/lib/mongoid/criteria/findable.rb +8 -5
  87. data/lib/mongoid/criteria/includable.rb +27 -22
  88. data/lib/mongoid/criteria/marshalable.rb +10 -2
  89. data/lib/mongoid/criteria/permission.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
  91. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
  92. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
  93. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
  94. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
  95. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
  96. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -17
  97. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
  98. data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
  99. data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
  100. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
  101. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
  102. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
  103. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
  104. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
  105. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
  106. data/lib/mongoid/criteria/queryable/key.rb +4 -4
  107. data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
  108. data/lib/mongoid/criteria/queryable/optional.rb +11 -17
  109. data/lib/mongoid/criteria/queryable/options.rb +2 -2
  110. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
  111. data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
  112. data/lib/mongoid/criteria/queryable/selector.rb +92 -7
  113. data/lib/mongoid/criteria/queryable/smash.rb +40 -7
  114. data/lib/mongoid/criteria/queryable.rb +12 -7
  115. data/lib/mongoid/criteria/scopable.rb +2 -2
  116. data/lib/mongoid/criteria/translator.rb +45 -0
  117. data/lib/mongoid/criteria.rb +20 -40
  118. data/lib/mongoid/deprecable.rb +37 -0
  119. data/lib/mongoid/deprecation.rb +25 -0
  120. data/lib/mongoid/document.rb +127 -35
  121. data/lib/mongoid/equality.rb +8 -8
  122. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  123. data/lib/mongoid/errors/document_not_found.rb +10 -6
  124. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  125. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  126. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  127. data/lib/mongoid/errors/invalid_config_option.rb +1 -1
  128. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
  129. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  130. data/lib/mongoid/errors/invalid_field.rb +6 -2
  131. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  132. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  133. data/lib/mongoid/errors/invalid_relation.rb +1 -1
  134. data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
  135. data/lib/mongoid/errors/invalid_session_use.rb +1 -1
  136. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  137. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  138. data/lib/mongoid/errors/mongoid_error.rb +3 -3
  139. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
  140. data/lib/mongoid/errors/no_client_database.rb +1 -1
  141. data/lib/mongoid/errors/no_client_hosts.rb +1 -1
  142. data/lib/mongoid/errors/readonly_attribute.rb +1 -1
  143. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
  144. data/lib/mongoid/errors/unknown_attribute.rb +1 -1
  145. data/lib/mongoid/errors.rb +6 -3
  146. data/lib/mongoid/extensions/array.rb +9 -7
  147. data/lib/mongoid/extensions/big_decimal.rb +33 -10
  148. data/lib/mongoid/extensions/binary.rb +42 -0
  149. data/lib/mongoid/extensions/boolean.rb +8 -2
  150. data/lib/mongoid/extensions/date.rb +26 -20
  151. data/lib/mongoid/extensions/date_time.rb +1 -1
  152. data/lib/mongoid/extensions/false_class.rb +1 -1
  153. data/lib/mongoid/extensions/float.rb +7 -4
  154. data/lib/mongoid/extensions/hash.rb +38 -9
  155. data/lib/mongoid/extensions/integer.rb +7 -4
  156. data/lib/mongoid/extensions/module.rb +1 -1
  157. data/lib/mongoid/extensions/object.rb +10 -8
  158. data/lib/mongoid/extensions/range.rb +41 -10
  159. data/lib/mongoid/extensions/regexp.rb +11 -4
  160. data/lib/mongoid/extensions/set.rb +11 -4
  161. data/lib/mongoid/extensions/string.rb +11 -22
  162. data/lib/mongoid/extensions/symbol.rb +4 -15
  163. data/lib/mongoid/extensions/time.rb +29 -16
  164. data/lib/mongoid/extensions/time_with_zone.rb +1 -2
  165. data/lib/mongoid/extensions/true_class.rb +1 -1
  166. data/lib/mongoid/extensions.rb +1 -0
  167. data/lib/mongoid/factory.rb +55 -7
  168. data/lib/mongoid/fields/foreign_key.rb +11 -4
  169. data/lib/mongoid/fields/localized.rb +19 -4
  170. data/lib/mongoid/fields/standard.rb +17 -7
  171. data/lib/mongoid/fields/validators/macro.rb +3 -9
  172. data/lib/mongoid/fields.rb +142 -28
  173. data/lib/mongoid/findable.rb +54 -24
  174. data/lib/mongoid/indexable/specification.rb +2 -2
  175. data/lib/mongoid/indexable/validators/options.rb +6 -2
  176. data/lib/mongoid/interceptable.rb +186 -16
  177. data/lib/mongoid/matchable.rb +1 -1
  178. data/lib/mongoid/matcher/eq_impl.rb +1 -1
  179. data/lib/mongoid/matcher/type.rb +1 -1
  180. data/lib/mongoid/matcher.rb +48 -14
  181. data/lib/mongoid/persistable/creatable.rb +19 -9
  182. data/lib/mongoid/persistable/deletable.rb +2 -2
  183. data/lib/mongoid/persistable/destroyable.rb +1 -1
  184. data/lib/mongoid/persistable/savable.rb +14 -2
  185. data/lib/mongoid/persistable/unsettable.rb +2 -2
  186. data/lib/mongoid/persistable/updatable.rb +69 -12
  187. data/lib/mongoid/persistable/upsertable.rb +21 -2
  188. data/lib/mongoid/persistable.rb +6 -3
  189. data/lib/mongoid/persistence_context.rb +6 -4
  190. data/lib/mongoid/query_cache.rb +13 -261
  191. data/lib/mongoid/railties/controller_runtime.rb +1 -1
  192. data/lib/mongoid/railties/database.rake +7 -2
  193. data/lib/mongoid/reloadable.rb +10 -8
  194. data/lib/mongoid/scopable.rb +15 -13
  195. data/lib/mongoid/selectable.rb +1 -2
  196. data/lib/mongoid/serializable.rb +17 -13
  197. data/lib/mongoid/stateful.rb +57 -10
  198. data/lib/mongoid/tasks/database.rake +12 -0
  199. data/lib/mongoid/tasks/database.rb +20 -2
  200. data/lib/mongoid/threaded/lifecycle.rb +5 -5
  201. data/lib/mongoid/threaded.rb +42 -12
  202. data/lib/mongoid/timestamps/created.rb +1 -1
  203. data/lib/mongoid/timestamps/updated.rb +2 -2
  204. data/lib/mongoid/touchable.rb +3 -4
  205. data/lib/mongoid/traversable.rb +10 -5
  206. data/lib/mongoid/utils.rb +22 -0
  207. data/lib/mongoid/validatable/associated.rb +98 -17
  208. data/lib/mongoid/validatable/localizable.rb +1 -1
  209. data/lib/mongoid/validatable/macros.rb +5 -7
  210. data/lib/mongoid/validatable/presence.rb +2 -2
  211. data/lib/mongoid/validatable/uniqueness.rb +9 -8
  212. data/lib/mongoid/validatable.rb +17 -6
  213. data/lib/mongoid/version.rb +1 -1
  214. data/lib/mongoid/warnings.rb +19 -4
  215. data/lib/mongoid.rb +17 -3
  216. data/spec/config/mongoid.yml +16 -0
  217. data/spec/integration/app_spec.rb +24 -19
  218. data/spec/integration/associations/belongs_to_spec.rb +18 -0
  219. data/spec/integration/associations/embedded_spec.rb +15 -0
  220. data/spec/integration/associations/embeds_many_spec.rb +15 -2
  221. data/spec/integration/associations/embeds_one_spec.rb +18 -0
  222. data/spec/integration/associations/foreign_key_spec.rb +9 -0
  223. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
  224. data/spec/integration/associations/has_one_spec.rb +97 -1
  225. data/spec/integration/associations/scope_option_spec.rb +1 -1
  226. data/spec/integration/callbacks_models.rb +132 -1
  227. data/spec/integration/callbacks_spec.rb +381 -4
  228. data/spec/integration/criteria/range_spec.rb +95 -1
  229. data/spec/integration/discriminator_key_spec.rb +118 -80
  230. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  231. data/spec/integration/i18n_fallbacks_spec.rb +3 -32
  232. data/spec/integration/matcher_examples_spec.rb +20 -13
  233. data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
  234. data/spec/integration/matcher_operator_spec.rb +3 -5
  235. data/spec/integration/persistence/range_field_spec.rb +350 -0
  236. data/spec/mongoid/association/counter_cache_spec.rb +1 -1
  237. data/spec/mongoid/association/depending_spec.rb +9 -9
  238. data/spec/mongoid/association/eager_spec.rb +2 -1
  239. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
  240. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
  241. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +96 -9
  242. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
  243. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
  244. data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
  245. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -0
  246. data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
  247. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
  248. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
  249. data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
  250. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
  251. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
  252. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
  253. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +19 -0
  254. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  255. data/spec/mongoid/association/referenced/belongs_to_spec.rb +4 -20
  256. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
  257. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
  258. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
  259. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
  260. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
  261. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +215 -177
  262. data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
  263. data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
  264. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
  265. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
  266. data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
  267. data/spec/mongoid/association/syncable_spec.rb +15 -1
  268. data/spec/mongoid/atomic/paths_spec.rb +0 -14
  269. data/spec/mongoid/attributes/nested_spec.rb +80 -11
  270. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  271. data/spec/mongoid/attributes/projector_spec.rb +1 -5
  272. data/spec/mongoid/attributes_spec.rb +526 -33
  273. data/spec/mongoid/changeable_spec.rb +429 -37
  274. data/spec/mongoid/clients/factory_spec.rb +23 -30
  275. data/spec/mongoid/clients/sessions_spec.rb +0 -38
  276. data/spec/mongoid/clients_spec.rb +149 -15
  277. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  278. data/spec/mongoid/config/defaults_spec.rb +160 -0
  279. data/spec/mongoid/config_spec.rb +214 -31
  280. data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
  281. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  282. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  283. data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
  284. data/spec/mongoid/contextual/memory_spec.rb +850 -88
  285. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  286. data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
  287. data/spec/mongoid/contextual/none_spec.rb +60 -21
  288. data/spec/mongoid/copyable_spec.rb +453 -11
  289. data/spec/mongoid/criteria/findable_spec.rb +86 -210
  290. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  291. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  292. data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
  293. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
  294. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
  295. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
  296. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
  297. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
  298. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
  299. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
  300. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
  301. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
  302. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
  303. data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -484
  304. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
  305. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
  306. data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
  307. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
  308. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  309. data/spec/mongoid/criteria_projection_spec.rb +1 -5
  310. data/spec/mongoid/criteria_spec.rb +469 -1205
  311. data/spec/mongoid/document_fields_spec.rb +173 -24
  312. data/spec/mongoid/document_spec.rb +32 -41
  313. data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
  314. data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
  315. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  316. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
  317. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  318. data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
  319. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
  320. data/spec/mongoid/extensions/array_spec.rb +16 -2
  321. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -212
  322. data/spec/mongoid/extensions/binary_spec.rb +44 -9
  323. data/spec/mongoid/extensions/boolean_spec.rb +68 -82
  324. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
  325. data/spec/mongoid/extensions/date_spec.rb +71 -1
  326. data/spec/mongoid/extensions/date_time_spec.rb +15 -9
  327. data/spec/mongoid/extensions/float_spec.rb +53 -74
  328. data/spec/mongoid/extensions/hash_spec.rb +33 -3
  329. data/spec/mongoid/extensions/integer_spec.rb +50 -64
  330. data/spec/mongoid/extensions/range_spec.rb +255 -54
  331. data/spec/mongoid/extensions/regexp_spec.rb +58 -33
  332. data/spec/mongoid/extensions/set_spec.rb +106 -0
  333. data/spec/mongoid/extensions/string_spec.rb +53 -25
  334. data/spec/mongoid/extensions/symbol_spec.rb +18 -25
  335. data/spec/mongoid/extensions/time_spec.rb +639 -106
  336. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
  337. data/spec/mongoid/factory_spec.rb +61 -1
  338. data/spec/mongoid/fields/localized_spec.rb +80 -37
  339. data/spec/mongoid/fields_spec.rb +503 -87
  340. data/spec/mongoid/findable_spec.rb +450 -58
  341. data/spec/mongoid/indexable/specification_spec.rb +2 -2
  342. data/spec/mongoid/indexable_spec.rb +55 -30
  343. data/spec/mongoid/interceptable_spec.rb +824 -22
  344. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  345. data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
  346. data/spec/mongoid/mongoizable_spec.rb +285 -0
  347. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  348. data/spec/mongoid/persistable/deletable_spec.rb +28 -8
  349. data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
  350. data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
  351. data/spec/mongoid/persistable/logical_spec.rb +37 -0
  352. data/spec/mongoid/persistable/poppable_spec.rb +36 -0
  353. data/spec/mongoid/persistable/pullable_spec.rb +72 -0
  354. data/spec/mongoid/persistable/pushable_spec.rb +72 -0
  355. data/spec/mongoid/persistable/renamable_spec.rb +36 -0
  356. data/spec/mongoid/persistable/savable_spec.rb +96 -0
  357. data/spec/mongoid/persistable/settable_spec.rb +37 -0
  358. data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
  359. data/spec/mongoid/persistable/updatable_spec.rb +20 -28
  360. data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
  361. data/spec/mongoid/persistence_context_spec.rb +31 -57
  362. data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
  363. data/spec/mongoid/query_cache_spec.rb +56 -215
  364. data/spec/mongoid/reloadable_spec.rb +83 -6
  365. data/spec/mongoid/scopable_spec.rb +91 -1
  366. data/spec/mongoid/serializable_spec.rb +25 -39
  367. data/spec/mongoid/shardable_spec.rb +4 -4
  368. data/spec/mongoid/stateful_spec.rb +150 -8
  369. data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
  370. data/spec/mongoid/tasks/database_spec.rb +127 -0
  371. data/spec/mongoid/timestamps_spec.rb +392 -4
  372. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  373. data/spec/mongoid/touchable_spec.rb +390 -2
  374. data/spec/mongoid/touchable_spec_models.rb +14 -8
  375. data/spec/mongoid/traversable_spec.rb +13 -35
  376. data/spec/mongoid/validatable/associated_spec.rb +27 -34
  377. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  378. data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
  379. data/spec/mongoid/warnings_spec.rb +35 -0
  380. data/spec/mongoid_spec.rb +34 -16
  381. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
  382. data/spec/rails/mongoid_spec.rb +4 -16
  383. data/spec/spec_helper.rb +5 -0
  384. data/spec/support/constraints.rb +24 -0
  385. data/spec/support/immutable_ids.rb +118 -0
  386. data/spec/support/macros.rb +78 -0
  387. data/spec/support/models/artist.rb +0 -1
  388. data/spec/support/models/augmentation.rb +12 -0
  389. data/spec/support/models/band.rb +5 -0
  390. data/spec/support/models/book.rb +1 -0
  391. data/spec/support/models/building.rb +2 -0
  392. data/spec/support/models/catalog.rb +24 -0
  393. data/spec/support/models/circus.rb +3 -0
  394. data/spec/support/models/cover.rb +10 -0
  395. data/spec/support/models/fanatic.rb +8 -0
  396. data/spec/support/models/implant.rb +9 -0
  397. data/spec/support/models/label.rb +2 -0
  398. data/spec/support/models/lat_lng.rb +6 -0
  399. data/spec/support/models/name.rb +10 -0
  400. data/spec/support/models/passport.rb +9 -0
  401. data/spec/support/models/person.rb +2 -0
  402. data/spec/support/models/player.rb +2 -0
  403. data/spec/support/models/powerup.rb +12 -0
  404. data/spec/support/models/product.rb +1 -0
  405. data/spec/support/models/purse.rb +9 -0
  406. data/spec/support/models/registry.rb +1 -0
  407. data/spec/support/models/school.rb +14 -0
  408. data/spec/support/models/shield.rb +18 -0
  409. data/spec/support/models/student.rb +14 -0
  410. data/spec/support/models/weapon.rb +12 -0
  411. metadata +101 -96
  412. checksums.yaml.gz.sig +0 -0
  413. data/lib/mongoid/errors/eager_load.rb +0 -23
  414. data/lib/mongoid/errors/invalid_value.rb +0 -17
  415. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
  416. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
  417. data/spec/mongoid/errors/eager_load_spec.rb +0 -31
  418. data/spec/shared/LICENSE +0 -20
  419. data/spec/shared/bin/get-mongodb-download-url +0 -17
  420. data/spec/shared/bin/s3-copy +0 -45
  421. data/spec/shared/bin/s3-upload +0 -69
  422. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  423. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  424. data/spec/shared/lib/mrss/constraints.rb +0 -378
  425. data/spec/shared/lib/mrss/docker_runner.rb +0 -291
  426. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  427. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  428. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  429. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  430. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  431. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  432. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  433. data/spec/shared/lib/mrss/utils.rb +0 -15
  434. data/spec/shared/share/Dockerfile.erb +0 -325
  435. data/spec/shared/share/haproxy-1.conf +0 -16
  436. data/spec/shared/share/haproxy-2.conf +0 -17
  437. data/spec/shared/shlib/config.sh +0 -27
  438. data/spec/shared/shlib/distro.sh +0 -74
  439. data/spec/shared/shlib/server.sh +0 -392
  440. data/spec/shared/shlib/set_env.sh +0 -169
  441. data.tar.gz.sig +0 -0
  442. metadata.gz.sig +0 -3
@@ -27,6 +27,30 @@ module Constraints
27
27
  Mongo::VERSION.split('.')[0...precision].map(&:to_i)
28
28
  end
29
29
 
30
+ def min_bson_version(version)
31
+ required_version = version.split('.').map(&:to_i)
32
+ actual_version = bson_version(required_version.length)
33
+ before(:all) do
34
+ if (actual_version <=> required_version) < 0
35
+ skip "bson-ruby version #{version} or higher is required"
36
+ end
37
+ end
38
+ end
39
+
40
+ def max_bson_version(version)
41
+ required_version = version.split('.').map(&:to_i)
42
+ actual_version = bson_version(required_version.length)
43
+ before(:all) do
44
+ if (actual_version <=> required_version) > 0
45
+ skip "bson-ruby version #{version} or lower is required"
46
+ end
47
+ end
48
+ end
49
+
50
+ def bson_version(precision)
51
+ BSON::VERSION.split('.')[0...precision].map(&:to_i)
52
+ end
53
+
30
54
  def min_rails_version(version)
31
55
  unless version =~ /\A\d+\.\d+\z/
32
56
  raise ArgumentError, "Version can only be major.minor: #{version}"
@@ -0,0 +1,118 @@
1
+ module Mongoid
2
+ module ImmutableIds
3
+ def immutable_id_examples_as(name)
4
+ shared_examples_for name do
5
+ shared_examples 'a persisted document' do
6
+ it 'should ignore the change and issue a warning' do
7
+ expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
8
+ expect { invoke_operation! }.not_to raise_error
9
+ expect(id_is_unchanged).not_to be legacy_behavior_expects_id_to_change
10
+ end
11
+
12
+ context 'when immutable_ids is true' do
13
+ before { Mongoid::Config.immutable_ids = true }
14
+ after { Mongoid::Config.immutable_ids = false }
15
+
16
+ it 'should disallow _id to be updated' do
17
+ expect { invoke_operation! }
18
+ .to raise_error(Mongoid::Errors::ImmutableAttribute)
19
+ end
20
+
21
+ context 'when id is set to the existing value' do
22
+ let(:new_id_value) { object._id }
23
+
24
+ it 'should allow the update to proceed' do
25
+ expect { invoke_operation! }
26
+ .not_to raise_error
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ context 'when the field is _id' do
33
+ let(:new_id_value) { 1234 }
34
+
35
+ context 'when the document is top-level' do
36
+ let(:legacy_behavior_expects_id_to_change) { false }
37
+
38
+ context 'when the document is new' do
39
+ let(:object) { Person.new }
40
+
41
+ it 'should allow _id to be updated' do
42
+ invoke_operation!
43
+ expect(object.new_record?).to be false
44
+ expect(object.reload._id).to be == new_id_value
45
+ end
46
+ end
47
+
48
+ context 'when the document has been persisted' do
49
+ let(:object) { Person.create }
50
+ let!(:original_id) { object._id }
51
+ let(:id_is_unchanged) { Person.exists?(original_id) }
52
+
53
+ it_behaves_like 'a persisted document'
54
+ end
55
+ end
56
+
57
+ context 'when the document is embedded' do
58
+ let(:parent) { Person.create }
59
+ let(:legacy_behavior_expects_id_to_change) { true }
60
+
61
+ context 'when the document is new' do
62
+ let(:object) { parent.favorites.new }
63
+
64
+ it 'should allow _id to be updated' do
65
+ invoke_operation!
66
+ expect(object.new_record?).to be false
67
+ expect(parent.reload.favorites.first._id).to be == new_id_value
68
+ end
69
+ end
70
+
71
+ context 'when the document has been persisted' do
72
+ let(:object) { parent.favorites.create }
73
+ let!(:original_id) { object._id }
74
+ let(:id_is_unchanged) { parent.favorites.where(_id: original_id).exists? }
75
+
76
+ it_behaves_like 'a persisted document'
77
+
78
+ context 'updating embeds_one via parent' do
79
+ context 'when immutable_ids is false' do
80
+ before { expect(Mongoid::Config.immutable_ids).to be false }
81
+
82
+ it 'should ignore the change' do
83
+ expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
84
+
85
+ parent.pet = pet = Pet.new
86
+ parent.save
87
+
88
+ original_id = pet._id
89
+ new_id = BSON::ObjectId.new
90
+
91
+ expect { parent.update(pet: { _id: new_id }) }.not_to raise_error
92
+ expect(parent.reload.pet._id.to_s).to be == original_id.to_s
93
+ end
94
+ end
95
+
96
+ context 'when immutable_ids is true' do
97
+ before { Mongoid::Config.immutable_ids = true }
98
+ after { Mongoid::Config.immutable_ids = false }
99
+
100
+ it 'should raise an exception' do
101
+ parent.pet = pet = Pet.new
102
+ parent.save
103
+
104
+ original_id = pet._id
105
+ new_id = BSON::ObjectId.new
106
+
107
+ expect { parent.update(pet: { _id: new_id }) }
108
+ .to raise_error(Mongoid::Errors::ImmutableAttribute)
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Mongoid
4
4
  module Macros
5
+
5
6
  def use_spec_mongoid_config
6
7
  around do |example|
7
8
  config_path = File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml")
@@ -39,6 +40,28 @@ module Mongoid
39
40
  end
40
41
  end
41
42
 
43
+ def driver_config_override(key, value)
44
+ around do |example|
45
+ existing = Mongo.send(key)
46
+
47
+ Mongo.send("#{key}=", value)
48
+
49
+ example.run
50
+
51
+ Mongo.send("#{key}=", existing)
52
+ end
53
+ end
54
+
55
+ def with_driver_config_values(key, *values, &block)
56
+ values.each do |value|
57
+ context "when #{key} is #{value}" do
58
+ driver_config_override key, value
59
+
60
+ class_exec(value, &block)
61
+ end
62
+ end
63
+ end
64
+
42
65
  def restore_config_clients
43
66
  around do |example|
44
67
  # Duplicate the config because some tests mutate it.
@@ -47,5 +70,60 @@ module Mongoid
47
70
  Mongoid::Config.send(:clients=, old_config)
48
71
  end
49
72
  end
73
+
74
+ def query_cache_enabled
75
+ around do |example|
76
+ Mongoid::QueryCache.cache do
77
+ example.run
78
+ end
79
+ end
80
+ end
81
+
82
+ def override_query_cache(enabled)
83
+ around do |example|
84
+ cache_enabled = Mongo::QueryCache.enabled?
85
+ Mongo::QueryCache.enabled = enabled
86
+ example.run
87
+ Mongo::QueryCache.enabled = cache_enabled
88
+ end
89
+ end
90
+
91
+ # Override the global persistence context.
92
+ #
93
+ # @param [ :client, :database ] component The component to override.
94
+ # @param [ Object ] value The value to override to.
95
+ def persistence_context_override(component, value)
96
+ around do |example|
97
+ meth = "#{component}_override"
98
+ old_value = Mongoid::Threaded.send(meth)
99
+ Mongoid::Threaded.send("#{meth}=", value)
100
+ example.run
101
+ Mongoid::Threaded.send("#{meth}=", old_value)
102
+ end
103
+ end
104
+
105
+ def time_zone_override(tz)
106
+ around do |example|
107
+ old_tz = Time.zone
108
+ Time.zone = tz
109
+ example.run
110
+ Time.zone = old_tz
111
+ end
112
+ end
113
+
114
+ def with_default_i18n_configs
115
+ around do |example|
116
+ I18n.locale = :en
117
+ I18n.default_locale = :en
118
+ I18n.try(:fallbacks=, I18n::Locale::Fallbacks.new)
119
+ I18n.enforce_available_locales = false
120
+ example.run
121
+ ensure
122
+ I18n.locale = :en
123
+ I18n.default_locale = :en
124
+ I18n.try(:fallbacks=, I18n::Locale::Fallbacks.new)
125
+ I18n.enforce_available_locales = false
126
+ end
127
+ end
50
128
  end
51
129
  end
@@ -87,5 +87,4 @@ class Artist
87
87
  def after_remove_album(album)
88
88
  @after_remove_referenced_called = true
89
89
  end
90
-
91
90
  end
@@ -10,4 +10,16 @@ class Augmentation
10
10
  after_build do
11
11
  self.name = "Infolink (#{player.frags})"
12
12
  end
13
+
14
+ field :after_find_player
15
+ field :after_initialize_player
16
+ field :after_default_player, default: ->{ self.player&._id }
17
+
18
+ after_find do |doc|
19
+ doc.after_find_player = player&._id
20
+ end
21
+
22
+ after_initialize do |doc|
23
+ doc.after_initialize_player = player&._id
24
+ end
13
25
  end
@@ -20,10 +20,15 @@ class Band
20
20
  field :y, as: :years, type: Integer
21
21
  field :founded, type: Date
22
22
  field :deleted, type: Boolean
23
+ field :mojo, type: Object
24
+ field :tags, type: Hash
25
+ field :fans
26
+ field :location, type: LatLng
23
27
 
24
28
  embeds_many :records, cascade_callbacks: true
25
29
  embeds_many :notes, as: :noteable, cascade_callbacks: true, validate: false
26
30
  embeds_many :labels
31
+ embeds_many :fanatics
27
32
  embeds_one :label, cascade_callbacks: true
28
33
 
29
34
  scope :highly_rated, -> { gte(rating: 7) }
@@ -15,4 +15,5 @@ class Book
15
15
  end
16
16
 
17
17
  embeds_many :pages, cascade_callbacks: true
18
+ embeds_many :covers, cascade_callbacks: true
18
19
  end
@@ -3,6 +3,8 @@
3
3
  class Building
4
4
  include Mongoid::Document
5
5
 
6
+ field :name, type: String
7
+
6
8
  embeds_one :building_address, validate: false
7
9
  embeds_many :contractors
8
10
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Catalog
4
+ include Mongoid::Document
5
+
6
+ field :array_field, type: Array
7
+ field :big_decimal_field, type: BigDecimal
8
+ field :boolean_field, type: Boolean
9
+ field :date_field, type: Date
10
+ field :date_time_field, type: DateTime
11
+ field :float_field, type: Float
12
+ field :hash_field, type: Hash
13
+ field :integer_field, type: Integer
14
+ field :object_id_field, type: BSON::ObjectId
15
+ field :binary_field, type: BSON::Binary
16
+ field :range_field, type: Range
17
+ field :regexp_field, type: Regexp
18
+ field :set_field, type: Set
19
+ field :string_field, type: String
20
+ field :stringified_symbol_field, type: StringifiedSymbol
21
+ field :symbol_field, type: Symbol
22
+ field :time_field, type: Time
23
+ field :time_with_zone_field, type: ActiveSupport::TimeWithZone
24
+ end
@@ -4,6 +4,9 @@ class Circus
4
4
  include Mongoid::Document
5
5
 
6
6
  field :name
7
+ field :slogan
8
+
9
+ validates_uniqueness_of :slogan, allow_blank: true
7
10
 
8
11
  embeds_many :animals
9
12
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Cover
4
+ include Mongoid::Document
5
+ include Mongoid::Timestamps
6
+
7
+ field :title, type: String
8
+
9
+ embedded_in :book
10
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Fanatic
4
+ include Mongoid::Document
5
+ field :age, type: Integer
6
+
7
+ embedded_in :band
8
+ end
@@ -12,7 +12,16 @@ class Implant
12
12
  doc.name = "Cochlear Implant (#{player.frags})"
13
13
  end
14
14
 
15
+ field :after_find_player
16
+ field :after_initialize_player
17
+ field :after_default_player, default: ->{ self.player&._id }
18
+
15
19
  after_find do |doc|
16
20
  doc.impressions += 1
21
+ doc.after_find_player = player&._id
22
+ end
23
+
24
+ after_initialize do |doc|
25
+ doc.after_initialize_player = player&._id
17
26
  end
18
27
  end
@@ -6,6 +6,8 @@ class Label
6
6
 
7
7
  field :name, type: String
8
8
  field :sales, type: BigDecimal
9
+ field :age, type: Integer
10
+
9
11
  field :after_create_called, type: Mongoid::Boolean, default: false
10
12
  field :after_save_called, type: Mongoid::Boolean, default: false
11
13
  field :after_update_called, type: Mongoid::Boolean, default: false
@@ -4,6 +4,8 @@ class LatLng
4
4
  attr_accessor :lat, :lng
5
5
 
6
6
  def self.demongoize(object)
7
+ return if object.nil?
8
+
7
9
  LatLng.new(object[1], object[0])
8
10
  end
9
11
 
@@ -14,4 +16,8 @@ class LatLng
14
16
  def mongoize
15
17
  [ lng, lat ]
16
18
  end
19
+
20
+ def ==(other)
21
+ lat == other.lat && lng == other.lng
22
+ end
17
23
  end
@@ -4,6 +4,8 @@ class Name
4
4
  include Mongoid::Document
5
5
  include Mongoid::Attributes::Dynamic
6
6
 
7
+ validate :is_not_jamis
8
+
7
9
  field :_id, type: String, overwrite: true, default: ->{
8
10
  "#{first_name}-#{last_name}"
9
11
  }
@@ -23,4 +25,12 @@ class Name
23
25
  def set_parent=(set = false)
24
26
  self.parent_title = namable.title if set
25
27
  end
28
+
29
+ private
30
+
31
+ def is_not_jamis
32
+ if first_name == 'Jamis' && last_name == 'Buck'
33
+ errors.add(:base, :invalid)
34
+ end
35
+ end
26
36
  end
@@ -10,4 +10,13 @@ class Passport
10
10
  field :localized_translations, localize: true
11
11
 
12
12
  embedded_in :person, autobuild: true
13
+
14
+ embeds_many :passport_pages
15
+ end
16
+
17
+ class PassportPage
18
+ include Mongoid::Document
19
+
20
+ field :num_stamps, type: Integer
21
+ embedded_in :passport
13
22
  end
@@ -40,6 +40,7 @@ class Person
40
40
  field :arrays, type: Array
41
41
  field :range, type: Range
42
42
  field :species, type: Symbol
43
+ field :posts_count, type: Integer, default: 0
43
44
 
44
45
  index age: 1
45
46
  index addresses: 1
@@ -69,6 +70,7 @@ class Person
69
70
  embeds_many :messages, validate: false
70
71
 
71
72
  embeds_one :passport, autobuild: true, store_as: :pass, validate: false
73
+ embeds_one :purse, store_as: "Purse"
72
74
  embeds_one :pet, class_name: "Animal", validate: false
73
75
  embeds_one :name, as: :namable, validate: false do
74
76
  def extension
@@ -25,6 +25,8 @@ class Player
25
25
  embeds_many :implants
26
26
  embeds_one :augmentation
27
27
 
28
+ has_and_belongs_to_many :shields
29
+
28
30
  after_find do |doc|
29
31
  doc.impressions += 1
30
32
  end
@@ -10,4 +10,16 @@ class Powerup
10
10
  after_build do
11
11
  self.name = "Quad Damage (#{player.frags})"
12
12
  end
13
+
14
+ field :after_find_player
15
+ field :after_initialize_player
16
+ field :after_default_player, default: ->{ self.player&._id }
17
+
18
+ after_find do |doc|
19
+ doc.after_find_player = player&._id
20
+ end
21
+
22
+ after_initialize do |doc|
23
+ doc.after_initialize_player = player&._id
24
+ end
13
25
  end
@@ -10,6 +10,7 @@ class Product
10
10
  field :website, localize: true
11
11
  field :sku, as: :stock_keeping_unit
12
12
  field :tl, as: :tagline, localize: true
13
+ field :title, localize: :present
13
14
  alias_attribute :cost, :price
14
15
 
15
16
  validates :name, presence: true
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Purse
4
+ include Mongoid::Document
5
+
6
+ field :brand, type: String
7
+
8
+ embedded_in :person
9
+ end
@@ -3,4 +3,5 @@
3
3
  class Registry
4
4
  include Mongoid::Document
5
5
  field :data, type: BSON::Binary
6
+ field :obj_id, type: BSON::ObjectId
6
7
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class School
4
+ include Mongoid::Document
5
+
6
+ has_many :students
7
+
8
+ field :district, type: String
9
+ field :team, type: String
10
+
11
+ field :after_destroy_triggered, default: false
12
+
13
+ accepts_nested_attributes_for :students, allow_destroy: true
14
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ class Shield
3
+ include Mongoid::Document
4
+
5
+ has_and_belongs_to_many :players
6
+
7
+ field :after_find_player
8
+ field :after_initialize_player
9
+ field :after_default_player, default: ->{ players.first&._id }
10
+
11
+ after_find do |doc|
12
+ doc.after_find_player = players.first&._id
13
+ end
14
+
15
+ after_initialize do |doc|
16
+ doc.after_initialize_player = players.first&._id
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Student
4
+ include Mongoid::Document
5
+
6
+ belongs_to :school
7
+
8
+ field :name, type: String
9
+ field :grade, type: Integer, default: 3
10
+
11
+ after_destroy do |doc|
12
+ school.after_destroy_triggered = true if school
13
+ end
14
+ end
@@ -10,4 +10,16 @@ class Weapon
10
10
  after_build do
11
11
  self.name = "Holy Hand Grenade (#{player.frags})"
12
12
  end
13
+
14
+ field :after_find_player
15
+ field :after_initialize_player
16
+ field :after_default_player, default: ->{ self.player&._id }
17
+
18
+ after_find do |doc|
19
+ doc.after_find_player = player&._id
20
+ end
21
+
22
+ after_initialize do |doc|
23
+ doc.after_initialize_player = player&._id
24
+ end
13
25
  end