mongoid 6.4.8 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +0 -26
  4. data/lib/config/locales/en.yml +17 -0
  5. data/lib/mongoid/association/accessors.rb +339 -0
  6. data/lib/mongoid/{relations/binding.rb → association/bindable.rb} +32 -52
  7. data/lib/mongoid/association/builders.rb +92 -0
  8. data/lib/mongoid/{relations/constraint.rb → association/constrainable.rb} +11 -22
  9. data/lib/mongoid/association/depending.rb +116 -0
  10. data/lib/mongoid/{relations/eager.rb → association/eager_loadable.rb} +11 -11
  11. data/lib/mongoid/{relations → association}/embedded/batchable.rb +21 -21
  12. data/lib/mongoid/association/embedded/cyclic.rb +109 -0
  13. data/lib/mongoid/association/embedded/embedded_in/binding.rb +56 -0
  14. data/lib/mongoid/{relations/builders/embedded/in.rb → association/embedded/embedded_in/buildable.rb} +12 -6
  15. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +121 -0
  16. data/lib/mongoid/association/embedded/embedded_in.rb +154 -0
  17. data/lib/mongoid/{relations/bindings/embedded/many.rb → association/embedded/embeds_many/binding.rb} +11 -9
  18. data/lib/mongoid/{relations/builders/embedded/many.rb → association/embedded/embeds_many/buildable.rb} +13 -7
  19. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +529 -0
  20. data/lib/mongoid/association/embedded/embeds_many.rb +210 -0
  21. data/lib/mongoid/{relations/bindings/embedded/one.rb → association/embedded/embeds_one/binding.rb} +12 -10
  22. data/lib/mongoid/{relations/builders/embedded/one.rb → association/embedded/embeds_one/buildable.rb} +13 -7
  23. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +130 -0
  24. data/lib/mongoid/association/embedded/embeds_one.rb +173 -0
  25. data/lib/mongoid/association/embedded.rb +4 -0
  26. data/lib/mongoid/association/macros.rb +204 -0
  27. data/lib/mongoid/{relations → association}/many.rb +20 -50
  28. data/lib/mongoid/{relations → association}/marshalable.rb +6 -4
  29. data/lib/mongoid/association/nested/many.rb +200 -0
  30. data/lib/mongoid/association/nested/nested_buildable.rb +72 -0
  31. data/lib/mongoid/association/nested/one.rb +127 -0
  32. data/lib/mongoid/association/nested.rb +15 -0
  33. data/lib/mongoid/{relations → association}/one.rb +6 -6
  34. data/lib/mongoid/association/options.rb +152 -0
  35. data/lib/mongoid/{relations → association}/proxy.rb +31 -58
  36. data/lib/mongoid/association/referenced/auto_save.rb +79 -0
  37. data/lib/mongoid/association/referenced/belongs_to/binding.rb +87 -0
  38. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +46 -0
  39. data/lib/mongoid/association/referenced/belongs_to/eager.rb +36 -0
  40. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +136 -0
  41. data/lib/mongoid/association/referenced/belongs_to.rb +248 -0
  42. data/lib/mongoid/association/referenced/counter_cache.rb +163 -0
  43. data/lib/mongoid/association/referenced/eager.rb +159 -0
  44. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +71 -0
  45. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +52 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +310 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +290 -0
  49. data/lib/mongoid/{relations/bindings/referenced/many.rb → association/referenced/has_many/binding.rb} +6 -5
  50. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  51. data/lib/mongoid/association/referenced/has_many/eager.rb +43 -0
  52. data/lib/mongoid/association/referenced/has_many/enumerable.rb +510 -0
  53. data/lib/mongoid/association/referenced/has_many/proxy.rb +578 -0
  54. data/lib/mongoid/association/referenced/has_many.rb +275 -0
  55. data/lib/mongoid/{relations/bindings/referenced/one.rb → association/referenced/has_one/binding.rb} +11 -8
  56. data/lib/mongoid/association/referenced/has_one/buildable.rb +60 -0
  57. data/lib/mongoid/association/referenced/has_one/eager.rb +35 -0
  58. data/lib/mongoid/{relations/builders/nested_attributes/one.rb → association/referenced/has_one/nested_builder.rb} +9 -9
  59. data/lib/mongoid/association/referenced/has_one/proxy.rb +113 -0
  60. data/lib/mongoid/association/referenced/has_one.rb +204 -0
  61. data/lib/mongoid/association/referenced/syncable.rb +170 -0
  62. data/lib/mongoid/association/referenced.rb +7 -0
  63. data/lib/mongoid/{relations → association}/reflections.rb +21 -17
  64. data/lib/mongoid/association/relatable.rb +415 -0
  65. data/lib/mongoid/association/touchable.rb +97 -0
  66. data/lib/mongoid/association.rb +150 -0
  67. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  68. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  69. data/lib/mongoid/atomic.rb +4 -4
  70. data/lib/mongoid/attributes/dynamic.rb +2 -2
  71. data/lib/mongoid/attributes/nested.rb +10 -10
  72. data/lib/mongoid/attributes/processing.rb +2 -2
  73. data/lib/mongoid/attributes/readonly.rb +2 -4
  74. data/lib/mongoid/attributes.rb +22 -13
  75. data/lib/mongoid/changeable.rb +1 -1
  76. data/lib/mongoid/clients/options.rb +1 -1
  77. data/lib/mongoid/clients/sessions.rb +2 -2
  78. data/lib/mongoid/composable.rb +4 -4
  79. data/lib/mongoid/config.rb +1 -0
  80. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  81. data/lib/mongoid/contextual/atomic.rb +1 -1
  82. data/lib/mongoid/contextual/geo_near.rb +1 -1
  83. data/lib/mongoid/contextual/map_reduce.rb +4 -4
  84. data/lib/mongoid/contextual/memory.rb +25 -7
  85. data/lib/mongoid/contextual/mongo.rb +13 -11
  86. data/lib/mongoid/copyable.rb +6 -6
  87. data/lib/mongoid/criteria/includable.rb +14 -14
  88. data/lib/mongoid/criteria/modifiable.rb +8 -14
  89. data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -1
  90. data/lib/mongoid/criteria/queryable/pipeline.rb +10 -5
  91. data/lib/mongoid/criteria/queryable/selectable.rb +10 -34
  92. data/lib/mongoid/criteria.rb +2 -2
  93. data/lib/mongoid/document.rb +6 -6
  94. data/lib/mongoid/errors/invalid_dependent_strategy.rb +32 -0
  95. data/lib/mongoid/errors/invalid_relation_option.rb +29 -0
  96. data/lib/mongoid/errors/unknown_model.rb +25 -0
  97. data/lib/mongoid/errors.rb +3 -0
  98. data/lib/mongoid/extensions/array.rb +5 -5
  99. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  100. data/lib/mongoid/extensions/hash.rb +5 -2
  101. data/lib/mongoid/extensions/object.rb +4 -4
  102. data/lib/mongoid/extensions/range.rb +1 -0
  103. data/lib/mongoid/extensions/regexp.rb +0 -1
  104. data/lib/mongoid/extensions/string.rb +1 -3
  105. data/lib/mongoid/extensions.rb +0 -4
  106. data/lib/mongoid/factory.rb +13 -3
  107. data/lib/mongoid/fields/foreign_key.rb +5 -5
  108. data/lib/mongoid/fields/standard.rb +2 -14
  109. data/lib/mongoid/fields/validators/macro.rb +1 -1
  110. data/lib/mongoid/fields.rb +3 -3
  111. data/lib/mongoid/indexable.rb +8 -5
  112. data/lib/mongoid/interceptable.rb +5 -5
  113. data/lib/mongoid/matchable/and.rb +1 -1
  114. data/lib/mongoid/matchable/elem_match.rb +9 -3
  115. data/lib/mongoid/matchable.rb +0 -3
  116. data/lib/mongoid/persistable/creatable.rb +2 -2
  117. data/lib/mongoid/persistable/deletable.rb +9 -8
  118. data/lib/mongoid/persistable/incrementable.rb +1 -1
  119. data/lib/mongoid/persistable/logical.rb +1 -1
  120. data/lib/mongoid/persistable/settable.rb +5 -5
  121. data/lib/mongoid/persistable/updatable.rb +2 -2
  122. data/lib/mongoid/persistable/upsertable.rb +1 -1
  123. data/lib/mongoid/persistable.rb +5 -6
  124. data/lib/mongoid/persistence_context.rb +1 -5
  125. data/lib/mongoid/query_cache.rb +19 -64
  126. data/lib/mongoid/railtie.rb +0 -17
  127. data/lib/mongoid/reloadable.rb +1 -1
  128. data/lib/mongoid/scopable.rb +3 -3
  129. data/lib/mongoid/serializable.rb +4 -4
  130. data/lib/mongoid/shardable.rb +1 -1
  131. data/lib/mongoid/tasks/database.rb +2 -2
  132. data/lib/mongoid/threaded.rb +0 -36
  133. data/lib/mongoid/traversable.rb +3 -3
  134. data/lib/mongoid/validatable/presence.rb +2 -2
  135. data/lib/mongoid/validatable/uniqueness.rb +4 -4
  136. data/lib/mongoid/validatable.rb +8 -8
  137. data/lib/mongoid/version.rb +1 -1
  138. data/lib/mongoid.rb +1 -1
  139. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +3 -0
  140. data/spec/app/models/animal.rb +2 -1
  141. data/spec/app/models/bomb.rb +1 -1
  142. data/spec/app/models/message.rb +1 -1
  143. data/spec/app/models/person.rb +5 -2
  144. data/spec/app/models/shipment_address.rb +1 -0
  145. data/spec/app/models/vertex.rb +6 -0
  146. data/spec/app/models/wiki_page.rb +1 -1
  147. data/spec/config/mongoid.yml +1 -0
  148. data/spec/mongoid/{relations → association}/accessors_spec.rb +1 -1
  149. data/spec/mongoid/{relations → association}/auto_save_spec.rb +60 -12
  150. data/spec/mongoid/{relations → association}/builders_spec.rb +1 -1
  151. data/spec/mongoid/association/constrainable_spec.rb +115 -0
  152. data/spec/mongoid/{relations → association}/counter_cache_spec.rb +1 -1
  153. data/spec/mongoid/association/depending_spec.rb +613 -0
  154. data/spec/mongoid/{relations → association}/eager_spec.rb +12 -12
  155. data/spec/mongoid/{relations → association/embedded}/cyclic_spec.rb +1 -1
  156. data/spec/mongoid/{relations/bindings/embedded/in_spec.rb → association/embedded/embedded_in/binding_spec.rb} +13 -13
  157. data/spec/mongoid/{relations/builders/embedded/in_spec.rb → association/embedded/embedded_in/buildable_spec.rb} +9 -9
  158. data/spec/mongoid/{relations/embedded/in_spec.rb → association/embedded/embedded_in/proxy_spec.rb} +5 -77
  159. data/spec/mongoid/association/embedded/embedded_in_spec.rb +843 -0
  160. data/spec/mongoid/{relations/bindings/embedded/many_spec.rb → association/embedded/embeds_many/binding_spec.rb} +3 -3
  161. data/spec/mongoid/{relations/builders/embedded/many_spec.rb → association/embedded/embeds_many/buildable_spec.rb} +17 -45
  162. data/spec/mongoid/{relations/embedded/many_spec.rb → association/embedded/embeds_many/proxy_spec.rb} +140 -428
  163. data/spec/mongoid/association/embedded/embeds_many_spec.rb +852 -0
  164. data/spec/mongoid/{relations/bindings/embedded/one_spec.rb → association/embedded/embeds_one/binding_spec.rb} +4 -4
  165. data/spec/mongoid/{relations/builders/embedded/one_spec.rb → association/embedded/embeds_one/buildable_spec.rb} +14 -34
  166. data/spec/mongoid/{relations/embedded/one_spec.rb → association/embedded/embeds_one/proxy_spec.rb} +39 -84
  167. data/spec/mongoid/association/embedded/embeds_one_spec.rb +908 -0
  168. data/spec/mongoid/{relations → association}/macros_spec.rb +148 -73
  169. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/many_spec.rb +16 -19
  170. data/spec/mongoid/{relations/builders/nested_attributes → association/nested}/one_spec.rb +17 -20
  171. data/spec/mongoid/association/options_spec.rb +1321 -0
  172. data/spec/mongoid/{relations → association}/polymorphic_spec.rb +7 -34
  173. data/spec/mongoid/{relations/bindings/referenced/in_spec.rb → association/referenced/belongs_to/binding_spec.rb} +7 -7
  174. data/spec/mongoid/{relations/builders/referenced/in_spec.rb → association/referenced/belongs_to/buildable_spec.rb} +46 -79
  175. data/spec/mongoid/{relations/eager/belongs_to_spec.rb → association/referenced/belongs_to/eager_spec.rb} +9 -9
  176. data/spec/mongoid/{relations/referenced/in_spec.rb → association/referenced/belongs_to/proxy_spec.rb} +57 -91
  177. data/spec/mongoid/association/referenced/belongs_to_spec.rb +1963 -0
  178. data/spec/mongoid/{relations/bindings/referenced/many_to_many_spec.rb → association/referenced/has_and_belongs_to_many/binding_spec.rb} +5 -5
  179. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +121 -0
  180. data/spec/mongoid/{relations/eager/has_and_belongs_to_many_spec.rb → association/referenced/has_and_belongs_to_many/eager_spec.rb} +5 -5
  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_spec.rb +1027 -0
  183. data/spec/mongoid/{relations/bindings/referenced/many_spec.rb → association/referenced/has_many/binding_spec.rb} +5 -5
  184. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +119 -0
  185. data/spec/mongoid/{relations/eager/has_many_spec.rb → association/referenced/has_many/eager_spec.rb} +26 -11
  186. data/spec/mongoid/{relations/targets → association/referenced/has_many}/enumerable_spec.rb +122 -1
  187. data/spec/mongoid/{relations/referenced/many_spec.rb → association/referenced/has_many/proxy_spec.rb} +28 -93
  188. data/spec/mongoid/association/referenced/has_many_spec.rb +1225 -0
  189. data/spec/mongoid/{relations/bindings/referenced/one_spec.rb → association/referenced/has_one/binding_spec.rb} +4 -4
  190. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +113 -0
  191. data/spec/mongoid/{relations/eager/has_one_spec.rb → association/referenced/has_one/eager_spec.rb} +10 -10
  192. data/spec/mongoid/{relations/referenced/one_spec.rb → association/referenced/has_one/proxy_spec.rb} +9 -109
  193. data/spec/mongoid/association/referenced/has_one_spec.rb +1244 -0
  194. data/spec/mongoid/{relations → association}/reflections_spec.rb +1 -12
  195. data/spec/mongoid/{relations/synchronization_spec.rb → association/syncable_spec.rb} +4 -2
  196. data/spec/mongoid/{relations → association}/touchable_spec.rb +19 -1
  197. data/spec/mongoid/{relations_spec.rb → association_spec.rb} +1 -1
  198. data/spec/mongoid/atomic/modifiers_spec.rb +2 -2
  199. data/spec/mongoid/atomic_spec.rb +4 -4
  200. data/spec/mongoid/attributes/nested_spec.rb +14 -12
  201. data/spec/mongoid/attributes/readonly_spec.rb +80 -125
  202. data/spec/mongoid/attributes_spec.rb +38 -2
  203. data/spec/mongoid/clients/factory_spec.rb +28 -52
  204. data/spec/mongoid/clients/options_spec.rb +65 -69
  205. data/spec/mongoid/clients/sessions_spec.rb +4 -13
  206. data/spec/mongoid/config_spec.rb +24 -0
  207. data/spec/mongoid/contextual/geo_near_spec.rb +0 -1
  208. data/spec/mongoid/contextual/memory_spec.rb +19 -0
  209. data/spec/mongoid/contextual/mongo_spec.rb +30 -5
  210. data/spec/mongoid/copyable_spec.rb +34 -0
  211. data/spec/mongoid/criteria/modifiable_spec.rb +183 -60
  212. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -3
  213. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +43 -0
  214. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +12 -0
  215. data/spec/mongoid/criteria/queryable/selectable_spec.rb +3 -42
  216. data/spec/mongoid/criteria/queryable/selector_spec.rb +2 -2
  217. data/spec/mongoid/criteria/scopable_spec.rb +0 -81
  218. data/spec/mongoid/criteria_spec.rb +16 -19
  219. data/spec/mongoid/document_spec.rb +2 -56
  220. data/spec/mongoid/extensions/array_spec.rb +11 -15
  221. data/spec/mongoid/extensions/big_decimal_spec.rb +9 -9
  222. data/spec/mongoid/extensions/hash_spec.rb +18 -1
  223. data/spec/mongoid/extensions/object_spec.rb +7 -11
  224. data/spec/mongoid/extensions/range_spec.rb +7 -0
  225. data/spec/mongoid/extensions/regexp_spec.rb +0 -23
  226. data/spec/mongoid/extensions/string_spec.rb +7 -35
  227. data/spec/mongoid/factory_spec.rb +19 -1
  228. data/spec/mongoid/fields/foreign_key_spec.rb +24 -32
  229. data/spec/mongoid/fields_spec.rb +2 -2
  230. data/spec/mongoid/findable_spec.rb +1 -1
  231. data/spec/mongoid/indexable_spec.rb +18 -8
  232. data/spec/mongoid/interceptable_spec.rb +22 -1
  233. data/spec/mongoid/matchable/elem_match_spec.rb +20 -0
  234. data/spec/mongoid/matchable_spec.rb +1 -26
  235. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  236. data/spec/mongoid/persistable/savable_spec.rb +2 -2
  237. data/spec/mongoid/persistable/settable_spec.rb +1 -35
  238. data/spec/mongoid/persistable_spec.rb +21 -6
  239. data/spec/mongoid/query_cache_spec.rb +16 -99
  240. data/spec/mongoid/relations/proxy_spec.rb +124 -124
  241. data/spec/mongoid/scopable_spec.rb +0 -13
  242. data/spec/mongoid/shardable_spec.rb +32 -12
  243. data/spec/mongoid/threaded_spec.rb +0 -68
  244. data/spec/mongoid/validatable/associated_spec.rb +1 -1
  245. data/spec/mongoid/validatable/presence_spec.rb +7 -6
  246. data/spec/mongoid/validatable_spec.rb +1 -1
  247. data/spec/spec_helper.rb +12 -14
  248. data.tar.gz.sig +1 -1
  249. metadata +192 -207
  250. metadata.gz.sig +0 -0
  251. data/lib/mongoid/matchable/nor.rb +0 -37
  252. data/lib/mongoid/railties/controller_runtime.rb +0 -86
  253. data/lib/mongoid/relations/accessors.rb +0 -267
  254. data/lib/mongoid/relations/auto_save.rb +0 -94
  255. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  256. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  257. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  258. data/lib/mongoid/relations/bindings.rb +0 -9
  259. data/lib/mongoid/relations/builder.rb +0 -57
  260. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  261. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  262. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  263. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  264. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  265. data/lib/mongoid/relations/builders.rb +0 -106
  266. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  267. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  268. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  269. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  270. data/lib/mongoid/relations/cascading.rb +0 -56
  271. data/lib/mongoid/relations/conversions.rb +0 -34
  272. data/lib/mongoid/relations/counter_cache.rb +0 -160
  273. data/lib/mongoid/relations/cyclic.rb +0 -107
  274. data/lib/mongoid/relations/eager/base.rb +0 -153
  275. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  276. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  277. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  278. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  279. data/lib/mongoid/relations/embedded/in.rb +0 -241
  280. data/lib/mongoid/relations/embedded/many.rb +0 -683
  281. data/lib/mongoid/relations/embedded/one.rb +0 -235
  282. data/lib/mongoid/relations/macros.rb +0 -367
  283. data/lib/mongoid/relations/metadata.rb +0 -1179
  284. data/lib/mongoid/relations/nested_builder.rb +0 -74
  285. data/lib/mongoid/relations/options.rb +0 -49
  286. data/lib/mongoid/relations/polymorphic.rb +0 -39
  287. data/lib/mongoid/relations/referenced/in.rb +0 -304
  288. data/lib/mongoid/relations/referenced/many.rb +0 -812
  289. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  290. data/lib/mongoid/relations/referenced/one.rb +0 -290
  291. data/lib/mongoid/relations/synchronization.rb +0 -169
  292. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  293. data/lib/mongoid/relations/targets.rb +0 -2
  294. data/lib/mongoid/relations/touchable.rb +0 -97
  295. data/lib/mongoid/relations.rb +0 -148
  296. data/spec/app/models/array_field.rb +0 -7
  297. data/spec/app/models/delegating_patient.rb +0 -16
  298. data/spec/integration/document_spec.rb +0 -22
  299. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  300. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  301. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  302. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  303. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  304. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  305. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  306. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  307. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  308. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  309. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  310. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  311. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  312. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  313. data/spec/mongoid/relations/options_spec.rb +0 -35
  314. data/spec/rails/controller_extension/controller_runtime_spec.rb +0 -110
  315. data/spec/support/cluster_config.rb +0 -158
  316. data/spec/support/constraints.rb +0 -101
  317. data/spec/support/macros.rb +0 -20
  318. data/spec/support/session_registry.rb +0 -50
  319. data/spec/support/spec_config.rb +0 -42
  320. /data/spec/mongoid/{relations → association}/embedded/dirty_spec.rb +0 -0
@@ -72,16 +72,21 @@ module Mongoid
72
72
  #
73
73
  # @example Add the unwind.
74
74
  # pipeline.unwind(:field)
75
+ # pipeline.unwind(document)
75
76
  #
76
- # @param [ String, Symbol ] field The name of the field.
77
+ # @param [ String, Symbol, Hash ] field_or_doc The name of the field or a document.
77
78
  #
78
79
  # @return [ Pipeline ] The pipeline.
79
80
  #
80
81
  # @since 2.0.0
81
- def unwind(field)
82
- normalized = field.to_s
83
- name = aliases[normalized] || normalized
84
- push("$unwind" => name.__mongo_expression__)
82
+ def unwind(field_or_doc)
83
+ unless field_or_doc.respond_to? :keys
84
+ normalized = field_or_doc.to_s
85
+ name = aliases[normalized] || normalized
86
+ push("$unwind" => name.__mongo_expression__)
87
+ else
88
+ push("$unwind" => field_or_doc)
89
+ end
85
90
  end
86
91
 
87
92
  private
@@ -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,21 +134,13 @@ module Mongoid
134
134
  ::Boolean.evolve(value)
135
135
  end
136
136
 
137
- # Add a $geoIntersects or $geoWithin selection. Symbol operators must
138
- # be used as shown in the examples to expand the criteria.
137
+ # Add a $geoIntersects or $geoWithin selection. Symbol operators must be used as shown in
138
+ # 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 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/
143
+ # @note The only valid geometry shape for a $geoWithin is :within_polygon
152
144
  #
153
145
  # @example Add a geo intersect criterion for a line.
154
146
  # query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
@@ -162,9 +154,6 @@ module Mongoid
162
154
  # @example Add a geo within criterion for a polygon.
163
155
  # query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
164
156
  #
165
- # @example Add a geo within criterion for a box.
166
- # query.geo_spacial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
167
- #
168
157
  # @param [ Hash ] criterion The criterion.
169
158
  #
170
159
  # @return [ Selectable ] The cloned selectable.
@@ -185,7 +174,6 @@ module Mongoid
185
174
  key :within_polygon, :override, "$geoWithin", "$geometry" do |value|
186
175
  { "type" => POLYGON, "coordinates" => value }
187
176
  end
188
- key :within_box, :override, "$geoWithin", "$box"
189
177
 
190
178
  # Add the $gt criterion to the selector.
191
179
  #
@@ -513,11 +501,6 @@ module Mongoid
513
501
  # @example Construct a text search selector with options.
514
502
  # selectable.text_search("testing", :$language => "fr")
515
503
  #
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
- #
521
504
  # @param [ String, Symbol ] terms A string of terms that MongoDB parses
522
505
  # and uses to query the text index.
523
506
  # @param [ Hash ] opts Text search options. See MongoDB documentation
@@ -529,19 +512,9 @@ module Mongoid
529
512
  def text_search(terms, opts = nil)
530
513
  clone.tap do |query|
531
514
  if terms
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
515
+ criterion = { :$text => { :$search => terms } }
516
+ criterion[:$text].merge!(opts) if opts
517
+ query.selector = criterion
545
518
  end
546
519
  end
547
520
  end
@@ -562,6 +535,9 @@ module Mongoid
562
535
  #
563
536
  # @since 1.0.0
564
537
  def where(criterion = nil)
538
+ # We need to save the criterion in an instance variable so Modifiable methods
539
+ # know how to create a polymorphic object.
540
+ @criterion = criterion
565
541
  criterion.is_a?(String) ? js_query(criterion) : expr_query(criterion)
566
542
  end
567
543
 
@@ -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,6 +13,7 @@ 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
18
 
19
19
  module Mongoid
@@ -190,11 +190,11 @@ module Mongoid
190
190
  #
191
191
  # @since 5.1.0
192
192
  def as_json(options = nil)
193
- rv = super
194
- if options && options[:compact]
195
- rv = rv.compact
193
+ if options && (options[:compact] == true)
194
+ super(options).reject! { |k,v| v.nil? }
195
+ else
196
+ super(options)
196
197
  end
197
- rv
198
198
  end
199
199
 
200
200
  # Returns an instance of the specified class with the attributes,
@@ -281,7 +281,7 @@ module Mongoid
281
281
  without_autobuild do
282
282
  relation, stored = send(name), meta.store_as
283
283
  if attributes.key?(stored) || !relation.blank?
284
- if relation
284
+ if !relation.nil?
285
285
  attributes[stored] = relation.send(:as_attributes)
286
286
  else
287
287
  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(object.to_s) : nil
56
+ object && object.numeric? ? ::BigDecimal.new(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,7 +17,6 @@ module Mongoid
17
17
  #
18
18
  # @since 3.0.0
19
19
  def mongoize(object)
20
- return nil if object.nil?
21
20
  ::Regexp.new(object)
22
21
  end
23
22
  end
@@ -82,9 +82,7 @@ module Mongoid
82
82
  #
83
83
  # @since 3.0.0
84
84
  def numeric?
85
- !!Float(self)
86
- rescue ArgumentError
87
- (self =~ /\A(?:NaN|-?Infinity)\z/) == 0
85
+ true if Float(self) rescue (self =~ /^NaN|\-?Infinity$/)
88
86
  end
89
87
 
90
88
  # Get the string as a getter string.
@@ -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,14 +28,17 @@ 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
- klass.collection.indexes(session: _session).create_one(key, options.except(:database))
38
+ klass.collection.indexes(session: session).create_one(key, options.except(:database))
36
39
  end
37
40
  else
38
- collection.indexes(session: _session).create_one(key, options)
41
+ collection.indexes(session: session).create_one(key, options)
39
42
  end
40
43
  end and true
41
44
  end
@@ -53,9 +56,9 @@ module Mongoid
53
56
  indexed_database_names.each do |database|
54
57
  with(database: database) do |klass|
55
58
  begin
56
- klass.collection.indexes(session: _session).each do |spec|
59
+ klass.collection.indexes(session: session).each do |spec|
57
60
  unless spec["name"] == "_id_"
58
- klass.collection.indexes(session: _session).drop_one(spec["key"])
61
+ klass.collection.indexes(session: session).drop_one(spec["key"])
59
62
  logger.info(
60
63
  "MONGOID: Removed index '#{spec["name"]}' on collection " +
61
64
  "'#{klass.collection.name}' in database '#{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