mongoid 6.4.2 → 7.0.3

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 (318) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/config/locales/en.yml +17 -0
  4. data/lib/mongoid/association/accessors.rb +339 -0
  5. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  6. data/lib/mongoid/association/builders.rb +92 -0
  7. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  8. data/lib/mongoid/association/depending.rb +137 -0
  9. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  10. data/lib/mongoid/{relations → association}/embedded/batchable.rb +19 -19
  11. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  12. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  13. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  14. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  15. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  16. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  17. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  18. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +552 -0
  19. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  20. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  21. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  22. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  23. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  24. data/lib/mongoid/association/embedded.rb +4 -0
  25. data/lib/mongoid/association/macros.rb +204 -0
  26. data/lib/mongoid/{relations → association}/many.rb +19 -49
  27. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  28. data/lib/mongoid/association/nested/many.rb +200 -0
  29. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  30. data/lib/mongoid/association/nested/one.rb +127 -0
  31. data/lib/mongoid/association/nested.rb +15 -0
  32. data/lib/mongoid/{relations → association}/one.rb +6 -6
  33. data/lib/mongoid/association/options.rb +152 -0
  34. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  35. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  36. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  37. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  38. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  39. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  40. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  41. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  42. data/lib/mongoid/association/referenced/eager.rb +162 -0
  43. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +312 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  48. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  49. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  50. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  51. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  52. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  53. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  54. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  55. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  56. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  57. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  58. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  59. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  60. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  61. data/lib/mongoid/association/referenced.rb +7 -0
  62. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  63. data/lib/mongoid/association/relatable.rb +509 -0
  64. data/lib/mongoid/{relations.rb → association.rb} +57 -56
  65. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  66. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  67. data/lib/mongoid/atomic.rb +4 -4
  68. data/lib/mongoid/attributes/dynamic.rb +2 -2
  69. data/lib/mongoid/attributes/nested.rb +22 -11
  70. data/lib/mongoid/attributes/processing.rb +2 -2
  71. data/lib/mongoid/attributes/readonly.rb +2 -4
  72. data/lib/mongoid/attributes.rb +22 -13
  73. data/lib/mongoid/changeable.rb +1 -1
  74. data/lib/mongoid/clients/options.rb +7 -5
  75. data/lib/mongoid/composable.rb +4 -4
  76. data/lib/mongoid/config.rb +1 -0
  77. data/lib/mongoid/contextual/atomic.rb +1 -1
  78. data/lib/mongoid/contextual/geo_near.rb +1 -1
  79. data/lib/mongoid/contextual/memory.rb +21 -3
  80. data/lib/mongoid/contextual/mongo.rb +10 -8
  81. data/lib/mongoid/copyable.rb +7 -6
  82. data/lib/mongoid/criteria/includable.rb +14 -14
  83. data/lib/mongoid/criteria/modifiable.rb +8 -14
  84. data/lib/mongoid/criteria/options.rb +2 -2
  85. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  86. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  87. data/lib/mongoid/criteria/queryable/selectable.rb +37 -7
  88. data/lib/mongoid/criteria.rb +2 -2
  89. data/lib/mongoid/document.rb +15 -6
  90. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  91. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  92. data/lib/mongoid/errors/unknown_model.rb +25 -0
  93. data/lib/mongoid/errors.rb +3 -0
  94. data/lib/mongoid/extensions/array.rb +5 -5
  95. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  96. data/lib/mongoid/extensions/hash.rb +5 -2
  97. data/lib/mongoid/extensions/object.rb +4 -4
  98. data/lib/mongoid/extensions/range.rb +1 -0
  99. data/lib/mongoid/extensions/regexp.rb +1 -0
  100. data/lib/mongoid/extensions.rb +0 -4
  101. data/lib/mongoid/factory.rb +13 -3
  102. data/lib/mongoid/fields/foreign_key.rb +5 -5
  103. data/lib/mongoid/fields/standard.rb +2 -14
  104. data/lib/mongoid/fields/validators/macro.rb +1 -1
  105. data/lib/mongoid/fields.rb +3 -3
  106. data/lib/mongoid/indexable.rb +4 -1
  107. data/lib/mongoid/interceptable.rb +5 -5
  108. data/lib/mongoid/matchable/and.rb +1 -1
  109. data/lib/mongoid/matchable/elem_match.rb +9 -3
  110. data/lib/mongoid/matchable/eq.rb +22 -0
  111. data/lib/mongoid/matchable/ne.rb +1 -1
  112. data/lib/mongoid/matchable.rb +3 -1
  113. data/lib/mongoid/persistable/deletable.rb +7 -6
  114. data/lib/mongoid/persistable/incrementable.rb +1 -1
  115. data/lib/mongoid/persistable/logical.rb +1 -1
  116. data/lib/mongoid/persistable/settable.rb +57 -12
  117. data/lib/mongoid/persistable.rb +4 -5
  118. data/lib/mongoid/persistence_context.rb +20 -5
  119. data/lib/mongoid/query_cache.rb +8 -4
  120. data/lib/mongoid/railtie.rb +17 -0
  121. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  122. data/lib/mongoid/scopable.rb +3 -3
  123. data/lib/mongoid/serializable.rb +4 -4
  124. data/lib/mongoid/shardable.rb +1 -1
  125. data/lib/mongoid/threaded.rb +36 -0
  126. data/lib/mongoid/touchable.rb +102 -0
  127. data/lib/mongoid/traversable.rb +3 -3
  128. data/lib/mongoid/validatable/presence.rb +2 -2
  129. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  130. data/lib/mongoid/validatable.rb +8 -8
  131. data/lib/mongoid/version.rb +1 -1
  132. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  133. data/spec/app/models/animal.rb +2 -1
  134. data/spec/app/models/bomb.rb +1 -1
  135. data/spec/app/models/message.rb +1 -1
  136. data/spec/app/models/minim.rb +7 -0
  137. data/spec/app/models/person.rb +5 -2
  138. data/spec/app/models/shipment_address.rb +1 -0
  139. data/spec/app/models/store_as_dup_test3.rb +7 -0
  140. data/spec/app/models/store_as_dup_test4.rb +7 -0
  141. data/spec/app/models/updatable.rb +7 -0
  142. data/spec/app/models/vertex.rb +6 -0
  143. data/spec/app/models/wiki_page.rb +1 -1
  144. data/spec/config/mongoid.yml +13 -3
  145. data/spec/integration/associations/belongs_to_spec.rb +13 -0
  146. data/spec/lite_spec_helper.rb +56 -0
  147. data/spec/mongoid/{relations → association}/accessors_spec.rb +40 -1
  148. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  149. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  150. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  151. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  152. data/spec/mongoid/association/depending_spec.rb +866 -0
  153. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  154. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  155. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  156. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  157. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  158. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  159. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  160. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  161. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +124 -182
  162. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  163. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  164. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  165. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  166. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  167. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  168. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  170. data/spec/mongoid/association/options_spec.rb +1321 -0
  171. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +66 -34
  172. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  173. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  174. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +33 -14
  175. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  176. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2006 -0
  177. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  178. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  179. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +26 -7
  180. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +56 -0
  181. data/spec/mongoid/{relations/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/proxy_spec.rb} +107 -98
  182. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -0
  183. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1027 -0
  184. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  185. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  186. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  187. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  188. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  189. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  190. data/spec/mongoid/association/referenced/has_many_models.rb +37 -0
  191. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  192. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  193. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  194. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  195. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  196. data/spec/mongoid/association/referenced/has_one_models.rb +48 -0
  197. data/spec/mongoid/association/referenced/has_one_spec.rb +1350 -0
  198. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  199. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  200. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  201. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  202. data/spec/mongoid/atomic_spec.rb +4 -4
  203. data/spec/mongoid/attributes/nested_spec.rb +29 -11
  204. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  205. data/spec/mongoid/attributes_spec.rb +38 -2
  206. data/spec/mongoid/clients/factory_spec.rb +24 -18
  207. data/spec/mongoid/clients/options_spec.rb +58 -44
  208. data/spec/mongoid/clients/sessions_spec.rb +1 -1
  209. data/spec/mongoid/clients/transactions_spec.rb +369 -0
  210. data/spec/mongoid/clients_spec.rb +68 -8
  211. data/spec/mongoid/config_spec.rb +27 -1
  212. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  213. data/spec/mongoid/contextual/mongo_spec.rb +33 -5
  214. data/spec/mongoid/copyable_spec.rb +90 -6
  215. data/spec/mongoid/copyable_spec_models.rb +17 -0
  216. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  217. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  218. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  219. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  220. data/spec/mongoid/criteria/queryable/selectable_spec.rb +42 -3
  221. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  222. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  223. data/spec/mongoid/criteria_spec.rb +33 -18
  224. data/spec/mongoid/document_spec.rb +83 -4
  225. data/spec/mongoid/extensions/array_spec.rb +11 -15
  226. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  227. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  228. data/spec/mongoid/extensions/object_spec.rb +7 -11
  229. data/spec/mongoid/extensions/range_spec.rb +7 -0
  230. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  231. data/spec/mongoid/factory_spec.rb +19 -1
  232. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  233. data/spec/mongoid/fields_spec.rb +2 -2
  234. data/spec/mongoid/findable_spec.rb +1 -1
  235. data/spec/mongoid/indexable_spec.rb +18 -8
  236. data/spec/mongoid/interceptable_spec.rb +22 -1
  237. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  238. data/spec/mongoid/matchable/eq_spec.rb +48 -0
  239. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  240. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  241. data/spec/mongoid/persistable/settable_spec.rb +95 -10
  242. data/spec/mongoid/persistable_spec.rb +21 -6
  243. data/spec/mongoid/persistence_context_spec.rb +1 -1
  244. data/spec/mongoid/query_cache_spec.rb +61 -22
  245. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  246. data/spec/mongoid/scopable_spec.rb +13 -0
  247. data/spec/mongoid/shardable_spec.rb +32 -12
  248. data/spec/mongoid/threaded_spec.rb +68 -0
  249. data/spec/mongoid/{relations/touchable_spec.rb → touchable_spec.rb} +40 -1
  250. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  251. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  252. data/spec/mongoid/validatable_spec.rb +1 -1
  253. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  254. data/spec/spec_helper.rb +51 -25
  255. data/spec/support/constraints.rb +101 -0
  256. data/spec/support/macros.rb +20 -0
  257. data/spec/support/spec_config.rb +39 -0
  258. metadata +602 -582
  259. checksums.yaml.gz.sig +0 -2
  260. data/lib/mongoid/relations/accessors.rb +0 -267
  261. data/lib/mongoid/relations/auto_save.rb +0 -94
  262. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  263. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  264. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  265. data/lib/mongoid/relations/bindings.rb +0 -9
  266. data/lib/mongoid/relations/builder.rb +0 -57
  267. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  268. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  269. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  270. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  271. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  272. data/lib/mongoid/relations/builders.rb +0 -106
  273. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  274. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  275. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  276. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  277. data/lib/mongoid/relations/cascading.rb +0 -56
  278. data/lib/mongoid/relations/conversions.rb +0 -34
  279. data/lib/mongoid/relations/counter_cache.rb +0 -160
  280. data/lib/mongoid/relations/cyclic.rb +0 -107
  281. data/lib/mongoid/relations/eager/base.rb +0 -153
  282. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  283. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  284. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  285. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  286. data/lib/mongoid/relations/embedded/in.rb +0 -241
  287. data/lib/mongoid/relations/embedded/many.rb +0 -683
  288. data/lib/mongoid/relations/embedded/one.rb +0 -235
  289. data/lib/mongoid/relations/macros.rb +0 -367
  290. data/lib/mongoid/relations/metadata.rb +0 -1179
  291. data/lib/mongoid/relations/nested_builder.rb +0 -74
  292. data/lib/mongoid/relations/options.rb +0 -49
  293. data/lib/mongoid/relations/polymorphic.rb +0 -39
  294. data/lib/mongoid/relations/referenced/in.rb +0 -304
  295. data/lib/mongoid/relations/referenced/many.rb +0 -812
  296. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  297. data/lib/mongoid/relations/referenced/one.rb +0 -290
  298. data/lib/mongoid/relations/synchronization.rb +0 -169
  299. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  300. data/lib/mongoid/relations/targets.rb +0 -2
  301. data/lib/mongoid/relations/touchable.rb +0 -97
  302. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  303. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  304. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  305. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  306. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  307. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  308. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  309. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  310. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  311. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  312. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  313. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  314. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  315. data/spec/mongoid/relations/options_spec.rb +0 -35
  316. data.tar.gz.sig +0 -0
  317. metadata.gz.sig +0 -0
  318. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -24,7 +24,7 @@ module Mongoid
24
24
  # @since 2.0.0
25
25
  POLYGON = "Polygon"
26
26
 
27
- # @attribute [rw] negating If the next expression is negated.
27
+ # @attribute [rw] negating If the next spression is negated.
28
28
  # @attribute [rw] selector The query selector.
29
29
  attr_accessor :negating, :selector
30
30
 
@@ -134,13 +134,21 @@ module Mongoid
134
134
  ::Boolean.evolve(value)
135
135
  end
136
136
 
137
- # Add a $geoIntersects or $geoWithin selection. Symbol operators must be used as shown in
138
- # the examples to expand the criteria.
137
+ # Add a $geoIntersects or $geoWithin selection. Symbol operators must
138
+ # be used as shown in the examples to expand the criteria.
139
139
  #
140
140
  # @note The only valid geometry shapes for a $geoIntersects are:
141
141
  # :intersects_line, :intersects_point, and :intersects_polygon.
142
142
  #
143
- # @note The only valid geometry shape for a $geoWithin is :within_polygon
143
+ # @note The only valid options for a $geoWithin query are the geometry
144
+ # shape :within_polygon and the operator :within_box.
145
+ #
146
+ # @note The :within_box operator for the $geoWithin query expects the
147
+ # lower left (south west) coordinate pair as the first argument and
148
+ # the upper right (north east) as the second argument.
149
+ # Important: When latitude and longitude are passed, longitude is
150
+ # expected as the first element of the coordinate pair.
151
+ # Source: https://docs.mongodb.com/manual/reference/operator/query/box/
144
152
  #
145
153
  # @example Add a geo intersect criterion for a line.
146
154
  # query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
@@ -154,6 +162,9 @@ module Mongoid
154
162
  # @example Add a geo within criterion for a polygon.
155
163
  # query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
156
164
  #
165
+ # @example Add a geo within criterion for a box.
166
+ # query.geo_spacial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
167
+ #
157
168
  # @param [ Hash ] criterion The criterion.
158
169
  #
159
170
  # @return [ Selectable ] The cloned selectable.
@@ -174,6 +185,7 @@ module Mongoid
174
185
  key :within_polygon, :override, "$geoWithin", "$geometry" do |value|
175
186
  { "type" => POLYGON, "coordinates" => value }
176
187
  end
188
+ key :within_box, :override, "$geoWithin", "$box"
177
189
 
178
190
  # Add the $gt criterion to the selector.
179
191
  #
@@ -501,6 +513,11 @@ module Mongoid
501
513
  # @example Construct a text search selector with options.
502
514
  # selectable.text_search("testing", :$language => "fr")
503
515
  #
516
+ # @note Per https://docs.mongodb.com/manual/reference/operator/query/text/
517
+ # it is not currently possible to supply multiple text search
518
+ # conditions in a query. Mongoid will build such a query but the
519
+ # server will return an error when trying to execute it.
520
+ #
504
521
  # @param [ String, Symbol ] terms A string of terms that MongoDB parses
505
522
  # and uses to query the text index.
506
523
  # @param [ Hash ] opts Text search options. See MongoDB documentation
@@ -512,9 +529,19 @@ module Mongoid
512
529
  def text_search(terms, opts = nil)
513
530
  clone.tap do |query|
514
531
  if terms
515
- criterion = { :$text => { :$search => terms } }
516
- criterion[:$text].merge!(opts) if opts
517
- query.selector = criterion
532
+ criterion = {'$text' => { '$search' => terms }}
533
+ criterion['$text'].merge!(opts) if opts
534
+ if query.selector['$text']
535
+ # Per https://docs.mongodb.com/manual/reference/operator/query/text/
536
+ # multiple $text expressions are not currently supported by
537
+ # MongoDB server, but build the query correctly instead of
538
+ # overwriting previous text search condition with the currently
539
+ # given one.
540
+ Mongoid.logger.warn('Multiple $text expressions per query are not currently supported by the server')
541
+ query.selector = {'$and' => [query.selector]}.merge(criterion)
542
+ else
543
+ query.selector = query.selector.merge(criterion)
544
+ end
518
545
  end
519
546
  end
520
547
  end
@@ -535,6 +562,9 @@ module Mongoid
535
562
  #
536
563
  # @since 1.0.0
537
564
  def where(criterion = nil)
565
+ # We need to save the criterion in an instance variable so Modifiable methods
566
+ # know how to create a polymorphic object.
567
+ @criterion = criterion
538
568
  criterion.is_a?(String) ? js_query(criterion) : expr_query(criterion)
539
569
  end
540
570
 
@@ -27,8 +27,8 @@ module Mongoid
27
27
  include Modifiable
28
28
  include Scopable
29
29
  include Clients::Options
30
- include Options
31
30
  include Clients::Sessions
31
+ include Options
32
32
 
33
33
  # Static array used to check with method missing - we only need to ever
34
34
  # instantiate once.
@@ -36,7 +36,7 @@ module Mongoid
36
36
  # @since 4.0.0
37
37
  CHECK = []
38
38
 
39
- attr_accessor :embedded, :klass, :parent_document, :metadata
39
+ attr_accessor :embedded, :klass, :parent_document, :association
40
40
 
41
41
  # Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
42
42
  # of this +Criteria+ or the criteria itself.
@@ -4,7 +4,6 @@ require "mongoid/evolvable"
4
4
  require "mongoid/extensions"
5
5
  require "mongoid/errors"
6
6
  require "mongoid/threaded"
7
- require "mongoid/relations"
8
7
  require "mongoid/atomic"
9
8
  require "mongoid/attributes"
10
9
  require "mongoid/contextual"
@@ -14,7 +13,9 @@ require "mongoid/criteria"
14
13
  require "mongoid/factory"
15
14
  require "mongoid/fields"
16
15
  require "mongoid/timestamps"
16
+ require "mongoid/association"
17
17
  require "mongoid/composable"
18
+ require "mongoid/touchable"
18
19
 
19
20
  module Mongoid
20
21
 
@@ -23,6 +24,7 @@ module Mongoid
23
24
  module Document
24
25
  extend ActiveSupport::Concern
25
26
  include Composable
27
+ include Mongoid::Touchable::InstanceMethods
26
28
 
27
29
  attr_accessor :__selected_fields
28
30
  attr_reader :new_record
@@ -178,6 +180,13 @@ module Mongoid
178
180
 
179
181
  # Calls #as_json on the document with additional, Mongoid-specific options.
180
182
  #
183
+ # @note Rails 6 changes return value of as_json for non-primitive types
184
+ # such as BSON::ObjectId. In Rails <= 5, as_json returned these as
185
+ # instances of the class. In Rails 6, these are returned serialized to
186
+ # primitive types (e.g. {"$oid"=>"5bcfc40bde340b37feda98e9"}).
187
+ # See https://github.com/rails/rails/commit/2e5cb980a448e7f4ab00df6e9ad4c1cc456616aa
188
+ # for more information.
189
+ #
181
190
  # @example Get the document as json.
182
191
  # document.as_json(compact: true)
183
192
  #
@@ -190,11 +199,11 @@ module Mongoid
190
199
  #
191
200
  # @since 5.1.0
192
201
  def as_json(options = nil)
193
- if options && (options[:compact] == true)
194
- super(options).reject! { |k,v| v.nil? }
195
- else
196
- super(options)
202
+ rv = super
203
+ if options && options[:compact]
204
+ rv = rv.compact
197
205
  end
206
+ rv
198
207
  end
199
208
 
200
209
  # Returns an instance of the specified class with the attributes,
@@ -281,7 +290,7 @@ module Mongoid
281
290
  without_autobuild do
282
291
  relation, stored = send(name), meta.store_as
283
292
  if attributes.key?(stored) || !relation.blank?
284
- if relation
293
+ if !relation.nil?
285
294
  attributes[stored] = relation.send(:as_attributes)
286
295
  else
287
296
  attributes.delete(stored)
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # This error is raised when an invalid strategy is defined for an association dependency.
6
+ class InvalidDependentStrategy < MongoidError
7
+
8
+ # Create the new error.
9
+ #
10
+ # @example Create the new error.
11
+ # InvalidDependentStrategy.new(association, invalid_strategy, valid_strategies)
12
+ #
13
+ # @param [ Mongoid::Association ] association The association for which this
14
+ # dependency is defined.
15
+ # @param [ Symbol, String ] invalid_strategy The attempted invalid strategy.
16
+ # @param [ Array<Symbol> ] valid_strategies The valid strategies.
17
+ #
18
+ # @since 7.0.0
19
+ def initialize(association, invalid_strategy, valid_strategies)
20
+ super(
21
+ compose_message(
22
+ "invalid_dependent_strategy",
23
+ { association: association,
24
+ invalid_strategy: invalid_strategy,
25
+ valid_strategies: valid_strategies
26
+ }
27
+ )
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # Raised when an option provided for a relation is invalid.
6
+ class InvalidRelationOption < MongoidError
7
+
8
+ # Create the new error.
9
+ #
10
+ # @example Create the new error.
11
+ # InvalidRelationOption.new(Person, invalid_option: 'make_me_a_sandwich')
12
+ #
13
+ # @param [ Class ] klass The model class.
14
+ # @param [ String, Symbol ] name The relation name.
15
+ # @param [ Symbol ] option The invalid option.
16
+ # @param [ Array<Symbol> ] valid_options The valid option.
17
+ #
18
+ # @since 3.0.0
19
+ def initialize(klass, name, option, valid_options)
20
+ super(
21
+ compose_message(
22
+ "invalid_relation_option",
23
+ { klass: klass, name: name, option: option, valid_options: valid_options }
24
+ )
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Errors
4
+
5
+ # This error is raised when trying to instantiate a model object from the value in
6
+ # the '_type' field of a document and the class doesn't exist.
7
+ class UnknownModel < MongoidError
8
+
9
+ # Create the new error.
10
+ #
11
+ # @example Instantiate the error.
12
+ # UnknownModel.new('InvalidClass', "invalid_class")
13
+ #
14
+ # @param [ String ] klass The model class.
15
+ # @param [ String ] value The value used to determine the (invalid) class.
16
+ #
17
+ # @since 7.0.0
18
+ def initialize(klass, value)
19
+ super(
20
+ compose_message("unknown_model", { klass: klass, value: value })
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -8,6 +8,7 @@ require "mongoid/errors/eager_load"
8
8
  require "mongoid/errors/in_memory_collation_not_supported"
9
9
  require "mongoid/errors/invalid_collection"
10
10
  require "mongoid/errors/invalid_config_option"
11
+ require "mongoid/errors/invalid_dependent_strategy"
11
12
  require "mongoid/errors/invalid_field"
12
13
  require "mongoid/errors/invalid_field_option"
13
14
  require "mongoid/errors/invalid_find"
@@ -17,6 +18,7 @@ require "mongoid/errors/invalid_options"
17
18
  require "mongoid/errors/invalid_path"
18
19
  require "mongoid/errors/invalid_persistence_option"
19
20
  require "mongoid/errors/invalid_relation"
21
+ require "mongoid/errors/invalid_relation_option"
20
22
  require "mongoid/errors/invalid_scope"
21
23
  require "mongoid/errors/invalid_session_use"
22
24
  require "mongoid/errors/invalid_set_polymorphic_relation"
@@ -42,6 +44,7 @@ require "mongoid/errors/readonly_document"
42
44
  require "mongoid/errors/scope_overwrite"
43
45
  require "mongoid/errors/too_many_nested_attribute_records"
44
46
  require "mongoid/errors/unknown_attribute"
47
+ require "mongoid/errors/unknown_model"
45
48
  require "mongoid/errors/unsaved_document"
46
49
  require "mongoid/errors/unsupported_javascript"
47
50
  require "mongoid/errors/validations"
@@ -122,22 +122,22 @@ module Mongoid
122
122
 
123
123
  module ClassMethods
124
124
 
125
- # Convert the provided object to a propery array of foreign keys.
125
+ # Convert the provided object to a proper array of foreign keys.
126
126
  #
127
127
  # @example Mongoize the object.
128
128
  # Array.__mongoize_fk__(constraint, object)
129
129
  #
130
- # @param [ Constraint ] constraint The metadata constraint.
130
+ # @param [ Association ] association The association metadata.
131
131
  # @param [ Object ] object The object to convert.
132
132
  #
133
133
  # @return [ Array ] The array of ids.
134
134
  #
135
135
  # @since 3.0.0
136
- def __mongoize_fk__(constraint, object)
136
+ def __mongoize_fk__(association, object)
137
137
  if object.resizable?
138
- object.blank? ? object : constraint.convert(object)
138
+ object.blank? ? object : association.convert_to_foreign_key(object)
139
139
  else
140
- object.blank? ? [] : constraint.convert(Array(object))
140
+ object.blank? ? [] : association.convert_to_foreign_key(Array(object))
141
141
  end
142
142
  end
143
143
 
@@ -53,7 +53,7 @@ module Mongoid
53
53
  #
54
54
  # @since 3.0.0
55
55
  def demongoize(object)
56
- object && object.numeric? ? ::BigDecimal.new(object.to_s) : nil
56
+ object && object.numeric? ? BigDecimal(object.to_s) : nil
57
57
  end
58
58
 
59
59
  # Mongoize an object of any type to how it's stored in the db as a String.
@@ -106,8 +106,11 @@ module Mongoid
106
106
  value = self
107
107
  keys.each do |key|
108
108
  return nil if value.nil?
109
- nested = value[key] || value[key.to_i]
110
- value = nested
109
+ value_for_key = value[key]
110
+ if value_for_key.nil? && key.to_i.to_s == key
111
+ value_for_key = value[key.to_i]
112
+ end
113
+ value = value_for_key
111
114
  end
112
115
  value
113
116
  end
@@ -225,17 +225,17 @@ module Mongoid
225
225
  # contstraint.
226
226
  #
227
227
  # @example Convert the object to a fk.
228
- # Object.__mongoize_fk__(constraint, object)
228
+ # Object.__mongoize_fk__(association, object)
229
229
  #
230
- # @param [ Constraint ] constraint The constraint.
230
+ # @param [ Association ] association The association metadata.
231
231
  # @param [ Object ] object The object to convert.
232
232
  #
233
233
  # @return [ Object ] The converted object.
234
234
  #
235
235
  # @since 3.0.0
236
- def __mongoize_fk__(constraint, object)
236
+ def __mongoize_fk__(association, object)
237
237
  return nil if !object || object == ""
238
- constraint.convert(object)
238
+ association.convert_to_foreign_key(object)
239
239
  end
240
240
 
241
241
  # Convert the object from its mongo friendly ruby type to this type.
@@ -70,6 +70,7 @@ module Mongoid
70
70
  def mongoize(object)
71
71
  return nil if object.nil?
72
72
  return object if object.is_a?(::Hash)
73
+ return object if object.is_a?(String)
73
74
  hash = { "min" => object.first, "max" => object.last }
74
75
  if object.respond_to?(:exclude_end?) && object.exclude_end?
75
76
  hash.merge!("exclude_end" => true)
@@ -17,6 +17,7 @@ module Mongoid
17
17
  #
18
18
  # @since 3.0.0
19
19
  def mongoize(object)
20
+ return nil if object.nil?
20
21
  ::Regexp.new(object)
21
22
  end
22
23
  end
@@ -5,10 +5,6 @@ class BSON::ObjectId
5
5
  end
6
6
  end
7
7
 
8
- class Symbol
9
- remove_method :size if instance_methods.include? :size # temporal fix for ruby 1.9
10
- end
11
-
12
8
  class BSON::Document
13
9
  # We need to override this as ActiveSupport creates a new Object, instead of a new Hash
14
10
  # see https://github.com/rails/rails/commit/f1bad130d0c9bd77c94e43b696adca56c46a66aa
@@ -38,12 +38,22 @@ module Mongoid
38
38
  # #only we give the document a list of the selected fields.
39
39
  #
40
40
  # @return [ Document ] The instantiated document.
41
- def from_db(klass, attributes = nil, selected_fields = nil)
41
+ def from_db(klass, attributes = nil, criteria = nil)
42
+ selected_fields = criteria.options[:fields] if criteria
42
43
  type = (attributes || {})[TYPE]
43
44
  if type.blank?
44
- klass.instantiate(attributes, selected_fields)
45
+ obj = klass.instantiate(attributes, selected_fields)
46
+ if criteria && criteria.association && criteria.parent_document
47
+ obj.set_relation(criteria.association.inverse, criteria.parent_document)
48
+ end
49
+ obj
45
50
  else
46
- type.camelize.constantize.instantiate(attributes, selected_fields)
51
+ camelized = type.camelize
52
+ begin
53
+ camelized.constantize.instantiate(attributes, selected_fields)
54
+ rescue NameError
55
+ raise Errors::UnknownModel.new(camelized, type)
56
+ end
47
57
  end
48
58
  end
49
59
  end
@@ -63,8 +63,8 @@ module Mongoid
63
63
  # @since 3.0.0
64
64
  def evolve(object)
65
65
  if object_id_field? || object.is_a?(Document)
66
- if metadata.polymorphic? && constraint
67
- constraint.convert(object)
66
+ if association.polymorphic?
67
+ association.convert_to_foreign_key(object)
68
68
  else
69
69
  object.__evolve_object_id__
70
70
  end
@@ -97,7 +97,7 @@ module Mongoid
97
97
  # @since 3.0.0
98
98
  def mongoize(object)
99
99
  if type.resizable? || object_id_field?
100
- type.__mongoize_fk__(constraint, object)
100
+ type.__mongoize_fk__(association, object)
101
101
  else
102
102
  related_id_field.mongoize(object)
103
103
  end
@@ -113,7 +113,7 @@ module Mongoid
113
113
  # @since 2.2.0
114
114
  def object_id_field?
115
115
  @object_id_field ||=
116
- metadata.polymorphic? ? true : metadata.klass.using_object_ids?
116
+ association.polymorphic? ? true : association.klass.using_object_ids?
117
117
  end
118
118
 
119
119
  # Returns true if an array, false if not.
@@ -156,7 +156,7 @@ module Mongoid
156
156
  #
157
157
  # @since 3.0.0
158
158
  def related_id_field
159
- @related_id_field ||= metadata.klass.fields["_id"]
159
+ @related_id_field ||= association.klass.fields["_id"]
160
160
  end
161
161
 
162
162
  # This is used when default values need to be serialized. Most of the
@@ -26,18 +26,6 @@ module Mongoid
26
26
  mods[key] = new
27
27
  end
28
28
 
29
- # Get the constraint from the metadata once.
30
- #
31
- # @example Get the constraint.
32
- # field.constraint
33
- #
34
- # @return [ Constraint ] The relation's contraint.
35
- #
36
- # @since 2.1.0
37
- def constraint
38
- @constraint ||= metadata.constraint
39
- end
40
-
41
29
  # Evaluate the default value and return it. Will handle the
42
30
  # serialization, proc calls, and duplication if necessary.
43
31
  #
@@ -127,8 +115,8 @@ module Mongoid
127
115
  # @return [ Metadata ] The relation metadata.
128
116
  #
129
117
  # @since 2.2.0
130
- def metadata
131
- @metadata ||= options[:metadata]
118
+ def association
119
+ @association ||= options[:association]
132
120
  end
133
121
 
134
122
  # Is the field a BSON::ObjectId?
@@ -14,7 +14,7 @@ module Mongoid
14
14
  :label,
15
15
  :localize,
16
16
  :fallbacks,
17
- :metadata,
17
+ :association,
18
18
  :pre_processed,
19
19
  :subtype,
20
20
  :type,
@@ -411,7 +411,7 @@ module Mongoid
411
411
  def create_field_getter(name, meth, field)
412
412
  generated_methods.module_eval do
413
413
  re_define_method(meth) do
414
- raw = read_attribute(name)
414
+ raw = read_raw_attribute(name)
415
415
  if lazy_settable?(field, raw)
416
416
  write_attribute(name, field.eval_default(self))
417
417
  else
@@ -461,7 +461,7 @@ module Mongoid
461
461
  re_define_method("#{meth}=") do |value|
462
462
  val = write_attribute(name, value)
463
463
  if field.foreign_key?
464
- remove_ivar(field.metadata.name)
464
+ remove_ivar(field.association.name)
465
465
  end
466
466
  val
467
467
  end
@@ -480,7 +480,7 @@ module Mongoid
480
480
  def create_field_check(name, meth)
481
481
  generated_methods.module_eval do
482
482
  re_define_method("#{meth}?") do
483
- value = read_attribute(name)
483
+ value = read_raw_attribute(name)
484
484
  lookup_attribute_presence(name, value)
485
485
  end
486
486
  end
@@ -28,8 +28,11 @@ module Mongoid
28
28
  # @since 1.0.0
29
29
  def create_indexes
30
30
  return unless index_specifications
31
+
32
+ default_options = {background: Config.background_indexing}
33
+
31
34
  index_specifications.each do |spec|
32
- key, options = spec.key, spec.options
35
+ key, options = spec.key, default_options.merge(spec.options)
33
36
  if database = options[:database]
34
37
  with(database: database) do |klass|
35
38
  klass.collection.indexes(session: _session).create_one(key, options.except(:database))
@@ -160,8 +160,8 @@ module Mongoid
160
160
  #
161
161
  # @since 2.3.0
162
162
  def cascadable_children(kind, children = Set.new)
163
- embedded_relations.each_pair do |name, metadata|
164
- next unless metadata.cascading_callbacks?
163
+ embedded_relations.each_pair do |name, association|
164
+ next unless association.cascading_callbacks?
165
165
  without_autobuild do
166
166
  delayed_pulls = delayed_atomic_pulls[name]
167
167
  delayed_unsets = delayed_atomic_unsets[name]
@@ -170,7 +170,7 @@ module Mongoid
170
170
  relation = send(name)
171
171
  Array.wrap(relation).each do |child|
172
172
  next if children.include?(child)
173
- children.add(child) if cascadable_child?(kind, child, metadata)
173
+ children.add(child) if cascadable_child?(kind, child, association)
174
174
  child.send(:cascadable_children, kind, children)
175
175
  end
176
176
  end
@@ -189,9 +189,9 @@ module Mongoid
189
189
  # @return [ true, false ] If the child should fire the callback.
190
190
  #
191
191
  # @since 2.3.0
192
- def cascadable_child?(kind, child, metadata)
192
+ def cascadable_child?(kind, child, association)
193
193
  return false if kind == :initialize || kind == :find || kind == :touch
194
- return false if kind == :validate && metadata.validate?
194
+ return false if kind == :validate && association.validate?
195
195
  child.callback_executable?(kind) ? child.in_callback_state?(kind) : false
196
196
  end
197
197
 
@@ -2,7 +2,7 @@
2
2
  module Mongoid
3
3
  module Matchable
4
4
 
5
- # Defines behavior for handling $or expressions in embedded documents.
5
+ # Defines behavior for handling $and expressions in embedded documents.
6
6
  class And < Default
7
7
 
8
8
  # Does the supplied query match the attribute?
@@ -13,13 +13,19 @@ module Mongoid
13
13
  #
14
14
  # @return [ true, false ] If the values match.
15
15
  def _matches?(value)
16
- if !@attribute.is_a?(Array) || !value.kind_of?(Hash) || !value["$elemMatch"].kind_of?(Hash)
16
+ elem_match = value["$elemMatch"] || value[:$elemMatch]
17
+
18
+ if !@attribute.is_a?(Array) || !value.kind_of?(Hash) || !elem_match.kind_of?(Hash)
17
19
  return false
18
20
  end
19
21
 
20
22
  return @attribute.any? do |sub_document|
21
- value["$elemMatch"].all? do |k, v|
22
- Matchable.matcher(sub_document, k, v)._matches?(v)
23
+ elem_match.all? do |k, v|
24
+ if v.try(:first).try(:[],0) == "$not".freeze || v.try(:first).try(:[],0) == :$not
25
+ !Matchable.matcher(sub_document, k, v.first[1])._matches?(v.first[1])
26
+ else
27
+ Matchable.matcher(sub_document, k, v)._matches?(v)
28
+ end
23
29
  end
24
30
  end
25
31
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+ module Mongoid
4
+ module Matchable
5
+
6
+ # Performs equivalency checks.
7
+ class Eq < Default
8
+
9
+ # Return true if the attribute and first value are equal.
10
+ #
11
+ # @example Do the values match?
12
+ # matcher._matches?({ :key => 10 })
13
+ #
14
+ # @param [ Hash ] value The values to check.
15
+ #
16
+ # @return [ true, false ] True if matches, false if not.
17
+ def _matches?(value)
18
+ super(value.values.first)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  #
13
13
  # @param [ Hash ] value The values to check.
14
14
  #
15
- # @return [ true, false ] If a value exists.
15
+ # @return [ true, false ] True if matches, false if not.
16
16
  def _matches?(value)
17
17
  !super(value.values.first)
18
18
  end