mongoid 7.0.6 → 7.1.2

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 (849) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +13 -13
  5. data/README.md +23 -17
  6. data/Rakefile +2 -0
  7. data/lib/config/locales/en.yml +60 -51
  8. data/lib/mongoid.rb +10 -2
  9. data/lib/mongoid/association.rb +9 -6
  10. data/lib/mongoid/association/accessors.rb +95 -52
  11. data/lib/mongoid/association/bindable.rb +7 -5
  12. data/lib/mongoid/association/builders.rb +4 -3
  13. data/lib/mongoid/association/constrainable.rb +4 -2
  14. data/lib/mongoid/association/depending.rb +5 -2
  15. data/lib/mongoid/association/eager_loadable.rb +2 -0
  16. data/lib/mongoid/association/embedded.rb +3 -0
  17. data/lib/mongoid/association/embedded/batchable.rb +4 -2
  18. data/lib/mongoid/association/embedded/cyclic.rb +8 -6
  19. data/lib/mongoid/association/embedded/embedded_in.rb +6 -3
  20. data/lib/mongoid/association/embedded/embedded_in/binding.rb +4 -1
  21. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +8 -2
  22. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +15 -12
  23. data/lib/mongoid/association/embedded/embeds_many.rb +9 -5
  24. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -2
  25. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +9 -3
  26. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +50 -47
  27. data/lib/mongoid/association/embedded/embeds_one.rb +9 -5
  28. data/lib/mongoid/association/embedded/embeds_one/binding.rb +5 -2
  29. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +10 -4
  30. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +17 -14
  31. data/lib/mongoid/association/macros.rb +38 -36
  32. data/lib/mongoid/association/many.rb +14 -11
  33. data/lib/mongoid/association/marshalable.rb +3 -1
  34. data/lib/mongoid/association/nested.rb +4 -1
  35. data/lib/mongoid/association/nested/many.rb +17 -15
  36. data/lib/mongoid/association/nested/nested_buildable.rb +6 -3
  37. data/lib/mongoid/association/nested/one.rb +11 -9
  38. data/lib/mongoid/association/one.rb +3 -1
  39. data/lib/mongoid/association/options.rb +9 -6
  40. data/lib/mongoid/association/proxy.rb +31 -14
  41. data/lib/mongoid/association/referenced.rb +3 -0
  42. data/lib/mongoid/association/referenced/auto_save.rb +4 -1
  43. data/lib/mongoid/association/referenced/belongs_to.rb +6 -3
  44. data/lib/mongoid/association/referenced/belongs_to/binding.rb +3 -1
  45. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -3
  46. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -2
  47. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -14
  48. data/lib/mongoid/association/referenced/counter_cache.rb +2 -0
  49. data/lib/mongoid/association/referenced/eager.rb +37 -15
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +13 -6
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -6
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -2
  53. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -0
  54. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +25 -18
  55. data/lib/mongoid/association/referenced/has_many.rb +7 -4
  56. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -1
  57. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -2
  58. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -0
  59. data/lib/mongoid/association/referenced/has_many/enumerable.rb +11 -4
  60. data/lib/mongoid/association/referenced/has_many/proxy.rb +46 -43
  61. data/lib/mongoid/association/referenced/has_one.rb +5 -2
  62. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -2
  63. data/lib/mongoid/association/referenced/has_one/buildable.rb +8 -1
  64. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -0
  65. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +11 -9
  66. data/lib/mongoid/association/referenced/has_one/proxy.rb +17 -15
  67. data/lib/mongoid/association/referenced/syncable.rb +7 -5
  68. data/lib/mongoid/association/reflections.rb +7 -5
  69. data/lib/mongoid/association/relatable.rb +17 -14
  70. data/lib/mongoid/atomic.rb +15 -3
  71. data/lib/mongoid/atomic/modifiers.rb +24 -1
  72. data/lib/mongoid/atomic/paths.rb +2 -0
  73. data/lib/mongoid/atomic/paths/embedded.rb +2 -0
  74. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -2
  75. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -2
  76. data/lib/mongoid/atomic/paths/root.rb +4 -2
  77. data/lib/mongoid/attributes.rb +14 -13
  78. data/lib/mongoid/attributes/dynamic.rb +2 -0
  79. data/lib/mongoid/attributes/nested.rb +7 -5
  80. data/lib/mongoid/attributes/processing.rb +8 -6
  81. data/lib/mongoid/attributes/readonly.rb +3 -1
  82. data/lib/mongoid/cacheable.rb +3 -1
  83. data/lib/mongoid/changeable.rb +3 -1
  84. data/lib/mongoid/clients.rb +2 -0
  85. data/lib/mongoid/clients/factory.rb +1 -0
  86. data/lib/mongoid/clients/options.rb +2 -0
  87. data/lib/mongoid/clients/sessions.rb +3 -0
  88. data/lib/mongoid/clients/storage_options.rb +2 -0
  89. data/lib/mongoid/clients/validators.rb +2 -0
  90. data/lib/mongoid/clients/validators/storage.rb +2 -0
  91. data/lib/mongoid/composable.rb +4 -2
  92. data/lib/mongoid/config.rb +53 -10
  93. data/lib/mongoid/config/environment.rb +2 -0
  94. data/lib/mongoid/config/options.rb +20 -12
  95. data/lib/mongoid/config/validators.rb +2 -0
  96. data/lib/mongoid/config/validators/client.rb +2 -0
  97. data/lib/mongoid/config/validators/option.rb +2 -0
  98. data/lib/mongoid/contextual.rb +7 -4
  99. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  100. data/lib/mongoid/contextual/aggregable/mongo.rb +3 -1
  101. data/lib/mongoid/contextual/atomic.rb +24 -6
  102. data/lib/mongoid/contextual/command.rb +2 -0
  103. data/lib/mongoid/contextual/geo_near.rb +5 -3
  104. data/lib/mongoid/contextual/map_reduce.rb +5 -2
  105. data/lib/mongoid/contextual/memory.rb +4 -2
  106. data/lib/mongoid/contextual/mongo.rb +6 -1
  107. data/lib/mongoid/contextual/none.rb +2 -0
  108. data/lib/mongoid/contextual/queryable.rb +2 -0
  109. data/lib/mongoid/copyable.rb +3 -1
  110. data/lib/mongoid/criteria.rb +25 -4
  111. data/lib/mongoid/criteria/findable.rb +11 -1
  112. data/lib/mongoid/criteria/includable.rb +8 -6
  113. data/lib/mongoid/criteria/inspectable.rb +2 -0
  114. data/lib/mongoid/criteria/marshalable.rb +2 -0
  115. data/lib/mongoid/criteria/modifiable.rb +4 -1
  116. data/lib/mongoid/criteria/options.rb +2 -0
  117. data/lib/mongoid/criteria/permission.rb +2 -0
  118. data/lib/mongoid/criteria/queryable.rb +7 -2
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +93 -0
  121. data/lib/mongoid/criteria/queryable/extensions.rb +2 -0
  122. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  123. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  124. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  126. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  127. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  128. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  129. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
  130. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  131. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  132. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -5
  133. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  134. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -1
  135. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  136. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -2
  137. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -1
  138. data/lib/mongoid/criteria/queryable/key.rb +34 -6
  139. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +153 -11
  141. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  142. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -2
  144. data/lib/mongoid/criteria/queryable/selectable.rb +374 -90
  145. data/lib/mongoid/criteria/queryable/selector.rb +38 -5
  146. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +233 -0
  148. data/lib/mongoid/criteria/scopable.rb +2 -0
  149. data/lib/mongoid/document.rb +2 -0
  150. data/lib/mongoid/equality.rb +3 -2
  151. data/lib/mongoid/errors.rb +3 -0
  152. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  153. data/lib/mongoid/errors/callback.rb +2 -0
  154. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  155. data/lib/mongoid/errors/delete_restriction.rb +3 -2
  156. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  157. data/lib/mongoid/errors/document_not_found.rb +2 -0
  158. data/lib/mongoid/errors/eager_load.rb +6 -2
  159. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  160. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  161. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  162. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -0
  163. data/lib/mongoid/errors/invalid_field.rb +2 -0
  164. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  165. data/lib/mongoid/errors/invalid_find.rb +2 -0
  166. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  167. data/lib/mongoid/errors/invalid_index.rb +2 -0
  168. data/lib/mongoid/errors/invalid_options.rb +4 -2
  169. data/lib/mongoid/errors/invalid_path.rb +2 -0
  170. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  171. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  172. data/lib/mongoid/errors/invalid_relation_option.rb +4 -2
  173. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  174. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  175. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  176. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  177. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  178. data/lib/mongoid/errors/invalid_time.rb +2 -0
  179. data/lib/mongoid/errors/invalid_value.rb +2 -0
  180. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  181. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  182. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  183. data/lib/mongoid/errors/mongoid_error.rb +2 -0
  184. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  185. data/lib/mongoid/errors/no_client_config.rb +2 -0
  186. data/lib/mongoid/errors/no_client_database.rb +2 -0
  187. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  188. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  189. data/lib/mongoid/errors/no_default_client.rb +2 -0
  190. data/lib/mongoid/errors/no_environment.rb +2 -0
  191. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  192. data/lib/mongoid/errors/no_metadata.rb +2 -0
  193. data/lib/mongoid/errors/no_parent.rb +2 -0
  194. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  195. data/lib/mongoid/errors/readonly_document.rb +2 -0
  196. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  197. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  198. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  199. data/lib/mongoid/errors/unknown_model.rb +2 -0
  200. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  201. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  202. data/lib/mongoid/errors/validations.rb +2 -0
  203. data/lib/mongoid/evolvable.rb +3 -1
  204. data/lib/mongoid/extensions.rb +2 -0
  205. data/lib/mongoid/extensions/array.rb +23 -6
  206. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  207. data/lib/mongoid/extensions/boolean.rb +2 -0
  208. data/lib/mongoid/extensions/date.rb +13 -3
  209. data/lib/mongoid/extensions/date_time.rb +4 -3
  210. data/lib/mongoid/extensions/decimal128.rb +2 -0
  211. data/lib/mongoid/extensions/false_class.rb +2 -0
  212. data/lib/mongoid/extensions/float.rb +5 -3
  213. data/lib/mongoid/extensions/hash.rb +51 -9
  214. data/lib/mongoid/extensions/integer.rb +5 -3
  215. data/lib/mongoid/extensions/module.rb +2 -0
  216. data/lib/mongoid/extensions/nil_class.rb +2 -0
  217. data/lib/mongoid/extensions/object.rb +16 -4
  218. data/lib/mongoid/extensions/object_id.rb +2 -0
  219. data/lib/mongoid/extensions/range.rb +2 -0
  220. data/lib/mongoid/extensions/regexp.rb +3 -1
  221. data/lib/mongoid/extensions/set.rb +2 -0
  222. data/lib/mongoid/extensions/string.rb +18 -9
  223. data/lib/mongoid/extensions/symbol.rb +2 -0
  224. data/lib/mongoid/extensions/time.rb +14 -0
  225. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  226. data/lib/mongoid/extensions/true_class.rb +2 -0
  227. data/lib/mongoid/factory.rb +28 -5
  228. data/lib/mongoid/fields.rb +5 -2
  229. data/lib/mongoid/fields/foreign_key.rb +3 -1
  230. data/lib/mongoid/fields/localized.rb +2 -0
  231. data/lib/mongoid/fields/standard.rb +6 -3
  232. data/lib/mongoid/fields/validators.rb +2 -0
  233. data/lib/mongoid/fields/validators/macro.rb +13 -2
  234. data/lib/mongoid/findable.rb +9 -4
  235. data/lib/mongoid/indexable.rb +3 -1
  236. data/lib/mongoid/indexable/specification.rb +3 -1
  237. data/lib/mongoid/indexable/validators/options.rb +2 -0
  238. data/lib/mongoid/inspectable.rb +3 -1
  239. data/lib/mongoid/interceptable.rb +9 -3
  240. data/lib/mongoid/loggable.rb +13 -7
  241. data/lib/mongoid/matchable.rb +2 -0
  242. data/lib/mongoid/matchable/all.rb +2 -0
  243. data/lib/mongoid/matchable/and.rb +2 -0
  244. data/lib/mongoid/matchable/default.rb +2 -0
  245. data/lib/mongoid/matchable/elem_match.rb +2 -0
  246. data/lib/mongoid/matchable/eq.rb +1 -0
  247. data/lib/mongoid/matchable/exists.rb +2 -0
  248. data/lib/mongoid/matchable/gt.rb +2 -0
  249. data/lib/mongoid/matchable/gte.rb +2 -0
  250. data/lib/mongoid/matchable/in.rb +2 -0
  251. data/lib/mongoid/matchable/lt.rb +2 -0
  252. data/lib/mongoid/matchable/lte.rb +2 -0
  253. data/lib/mongoid/matchable/ne.rb +2 -0
  254. data/lib/mongoid/matchable/nin.rb +2 -0
  255. data/lib/mongoid/matchable/nor.rb +2 -1
  256. data/lib/mongoid/matchable/or.rb +2 -0
  257. data/lib/mongoid/matchable/regexp.rb +5 -2
  258. data/lib/mongoid/matchable/size.rb +2 -0
  259. data/lib/mongoid/persistable.rb +133 -15
  260. data/lib/mongoid/persistable/creatable.rb +3 -1
  261. data/lib/mongoid/persistable/deletable.rb +3 -1
  262. data/lib/mongoid/persistable/destroyable.rb +3 -1
  263. data/lib/mongoid/persistable/incrementable.rb +6 -2
  264. data/lib/mongoid/persistable/logical.rb +4 -1
  265. data/lib/mongoid/persistable/poppable.rb +3 -1
  266. data/lib/mongoid/persistable/pullable.rb +3 -1
  267. data/lib/mongoid/persistable/pushable.rb +14 -3
  268. data/lib/mongoid/persistable/renamable.rb +10 -3
  269. data/lib/mongoid/persistable/savable.rb +3 -1
  270. data/lib/mongoid/persistable/settable.rb +3 -1
  271. data/lib/mongoid/persistable/unsettable.rb +8 -3
  272. data/lib/mongoid/persistable/updatable.rb +3 -1
  273. data/lib/mongoid/persistable/upsertable.rb +3 -1
  274. data/lib/mongoid/persistence_context.rb +27 -15
  275. data/lib/mongoid/positional.rb +2 -0
  276. data/lib/mongoid/query_cache.rb +10 -9
  277. data/lib/mongoid/railtie.rb +3 -1
  278. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  279. data/lib/mongoid/railties/database.rake +9 -0
  280. data/lib/mongoid/reloadable.rb +4 -2
  281. data/lib/mongoid/scopable.rb +2 -1
  282. data/lib/mongoid/selectable.rb +3 -1
  283. data/lib/mongoid/serializable.rb +23 -13
  284. data/lib/mongoid/shardable.rb +59 -5
  285. data/lib/mongoid/stateful.rb +3 -1
  286. data/lib/mongoid/tasks/database.rake +12 -5
  287. data/lib/mongoid/tasks/database.rb +50 -0
  288. data/lib/mongoid/threaded.rb +2 -0
  289. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  290. data/lib/mongoid/timestamps.rb +3 -1
  291. data/lib/mongoid/timestamps/created.rb +3 -1
  292. data/lib/mongoid/timestamps/created/short.rb +2 -0
  293. data/lib/mongoid/timestamps/short.rb +2 -0
  294. data/lib/mongoid/timestamps/timeless.rb +6 -2
  295. data/lib/mongoid/timestamps/updated.rb +3 -1
  296. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  297. data/lib/mongoid/touchable.rb +20 -12
  298. data/lib/mongoid/traversable.rb +4 -2
  299. data/lib/mongoid/validatable.rb +7 -5
  300. data/lib/mongoid/validatable/associated.rb +4 -2
  301. data/lib/mongoid/validatable/format.rb +2 -0
  302. data/lib/mongoid/validatable/length.rb +2 -0
  303. data/lib/mongoid/validatable/localizable.rb +2 -0
  304. data/lib/mongoid/validatable/macros.rb +2 -0
  305. data/lib/mongoid/validatable/presence.rb +4 -2
  306. data/lib/mongoid/validatable/queryable.rb +2 -0
  307. data/lib/mongoid/validatable/uniqueness.rb +5 -3
  308. data/lib/mongoid/version.rb +2 -1
  309. data/lib/rails/generators/mongoid/config/config_generator.rb +2 -0
  310. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -29
  311. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  312. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  313. data/lib/rails/generators/mongoid_generator.rb +2 -0
  314. data/lib/rails/mongoid.rb +4 -2
  315. data/lib/support/ruby_version.rb +3 -0
  316. data/spec/app/models/account.rb +3 -0
  317. data/spec/app/models/acolyte.rb +3 -0
  318. data/spec/app/models/actor.rb +3 -0
  319. data/spec/app/models/actress.rb +3 -0
  320. data/spec/app/models/address.rb +3 -0
  321. data/spec/app/models/address_component.rb +3 -0
  322. data/spec/app/models/address_number.rb +3 -0
  323. data/spec/app/models/agency.rb +3 -0
  324. data/spec/app/models/agent.rb +3 -0
  325. data/spec/app/models/album.rb +3 -0
  326. data/spec/app/models/alert.rb +3 -0
  327. data/spec/app/models/animal.rb +3 -0
  328. data/spec/app/models/answer.rb +3 -0
  329. data/spec/app/models/appointment.rb +3 -0
  330. data/spec/app/models/array_field.rb +1 -0
  331. data/spec/app/models/article.rb +3 -0
  332. data/spec/app/models/artist.rb +3 -0
  333. data/spec/app/models/artwork.rb +3 -0
  334. data/spec/app/models/audio.rb +3 -0
  335. data/spec/app/models/augmentation.rb +3 -0
  336. data/spec/app/models/author.rb +3 -0
  337. data/spec/app/models/baby.rb +3 -0
  338. data/spec/app/models/band.rb +3 -0
  339. data/spec/app/models/bar.rb +3 -0
  340. data/spec/app/models/basic.rb +3 -0
  341. data/spec/app/models/bed.rb +3 -0
  342. data/spec/app/models/big_palette.rb +3 -0
  343. data/spec/app/models/birthday.rb +3 -0
  344. data/spec/app/models/bomb.rb +3 -0
  345. data/spec/app/models/book.rb +3 -0
  346. data/spec/app/models/breed.rb +3 -0
  347. data/spec/app/models/browser.rb +3 -0
  348. data/spec/app/models/building.rb +3 -0
  349. data/spec/app/models/building_address.rb +3 -0
  350. data/spec/app/models/bus.rb +3 -0
  351. data/spec/app/models/business.rb +3 -0
  352. data/spec/app/models/callback_test.rb +3 -0
  353. data/spec/app/models/canvas.rb +3 -0
  354. data/spec/app/models/car.rb +3 -0
  355. data/spec/app/models/cat.rb +3 -0
  356. data/spec/app/models/category.rb +3 -0
  357. data/spec/app/models/child.rb +3 -0
  358. data/spec/app/models/child_doc.rb +3 -0
  359. data/spec/app/models/church.rb +3 -0
  360. data/spec/app/models/circle.rb +3 -0
  361. data/spec/app/models/circuit.rb +3 -0
  362. data/spec/app/models/circus.rb +3 -0
  363. data/spec/app/models/code.rb +3 -0
  364. data/spec/app/models/coding.rb +4 -0
  365. data/spec/app/models/coding/pull_request.rb +12 -0
  366. data/spec/app/models/comment.rb +3 -0
  367. data/spec/app/models/company.rb +3 -0
  368. data/spec/app/models/consumption_period.rb +3 -0
  369. data/spec/app/models/contextable_item.rb +3 -0
  370. data/spec/app/models/contractor.rb +3 -0
  371. data/spec/app/models/cookie.rb +3 -0
  372. data/spec/app/models/country_code.rb +3 -0
  373. data/spec/app/models/courier_job.rb +3 -0
  374. data/spec/app/models/definition.rb +3 -0
  375. data/spec/app/models/delegating_patient.rb +16 -0
  376. data/spec/app/models/description.rb +3 -0
  377. data/spec/app/models/dictionary.rb +3 -0
  378. data/spec/app/models/division.rb +3 -0
  379. data/spec/app/models/doctor.rb +3 -0
  380. data/spec/app/models/dog.rb +3 -0
  381. data/spec/app/models/dokument.rb +3 -0
  382. data/spec/app/models/draft.rb +3 -0
  383. data/spec/app/models/dragon.rb +3 -0
  384. data/spec/app/models/driver.rb +3 -0
  385. data/spec/app/models/drug.rb +3 -0
  386. data/spec/app/models/dungeon.rb +3 -0
  387. data/spec/app/models/edit.rb +3 -0
  388. data/spec/app/models/email.rb +3 -0
  389. data/spec/app/models/employer.rb +3 -0
  390. data/spec/app/models/entry.rb +3 -0
  391. data/spec/app/models/eraser.rb +3 -0
  392. data/spec/app/models/even.rb +3 -0
  393. data/spec/app/models/event.rb +3 -0
  394. data/spec/app/models/exhibition.rb +3 -0
  395. data/spec/app/models/exhibitor.rb +3 -0
  396. data/spec/app/models/explosion.rb +3 -0
  397. data/spec/app/models/eye.rb +3 -0
  398. data/spec/app/models/eye_bowl.rb +3 -0
  399. data/spec/app/models/face.rb +3 -0
  400. data/spec/app/models/favorite.rb +3 -0
  401. data/spec/app/models/filesystem.rb +3 -0
  402. data/spec/app/models/fire_hydrant.rb +3 -0
  403. data/spec/app/models/firefox.rb +3 -0
  404. data/spec/app/models/fish.rb +3 -0
  405. data/spec/app/models/folder.rb +3 -0
  406. data/spec/app/models/folder_item.rb +3 -0
  407. data/spec/app/models/fruits.rb +3 -0
  408. data/spec/app/models/game.rb +3 -0
  409. data/spec/app/models/ghost.rb +3 -0
  410. data/spec/app/models/home.rb +3 -0
  411. data/spec/app/models/house.rb +3 -0
  412. data/spec/app/models/html_writer.rb +3 -0
  413. data/spec/app/models/id_key.rb +3 -0
  414. data/spec/app/models/image.rb +3 -0
  415. data/spec/app/models/implant.rb +3 -0
  416. data/spec/app/models/item.rb +3 -0
  417. data/spec/app/models/jar.rb +3 -0
  418. data/spec/app/models/kaleidoscope.rb +3 -0
  419. data/spec/app/models/kangaroo.rb +4 -1
  420. data/spec/app/models/label.rb +3 -0
  421. data/spec/app/models/language.rb +3 -0
  422. data/spec/app/models/lat_lng.rb +3 -0
  423. data/spec/app/models/league.rb +3 -0
  424. data/spec/app/models/learner.rb +3 -0
  425. data/spec/app/models/line_item.rb +3 -0
  426. data/spec/app/models/location.rb +3 -0
  427. data/spec/app/models/login.rb +3 -0
  428. data/spec/app/models/manufacturer.rb +3 -0
  429. data/spec/app/models/meat.rb +3 -0
  430. data/spec/app/models/membership.rb +3 -0
  431. data/spec/app/models/message.rb +3 -0
  432. data/spec/app/models/minim.rb +1 -1
  433. data/spec/app/models/mixed_drink.rb +3 -0
  434. data/spec/app/models/movie.rb +3 -0
  435. data/spec/app/models/my_hash.rb +3 -0
  436. data/spec/app/models/name.rb +3 -0
  437. data/spec/app/models/name_only.rb +9 -0
  438. data/spec/app/models/node.rb +3 -0
  439. data/spec/app/models/note.rb +3 -0
  440. data/spec/app/models/odd.rb +3 -0
  441. data/spec/app/models/ordered_post.rb +3 -0
  442. data/spec/app/models/ordered_preference.rb +3 -0
  443. data/spec/app/models/oscar.rb +3 -0
  444. data/spec/app/models/other_owner_object.rb +3 -0
  445. data/spec/app/models/override.rb +3 -0
  446. data/spec/app/models/ownable.rb +3 -0
  447. data/spec/app/models/owner.rb +3 -0
  448. data/spec/app/models/pack.rb +3 -0
  449. data/spec/app/models/page.rb +3 -0
  450. data/spec/app/models/page_question.rb +3 -0
  451. data/spec/app/models/palette.rb +3 -0
  452. data/spec/app/models/parent.rb +3 -0
  453. data/spec/app/models/parent_doc.rb +3 -0
  454. data/spec/app/models/passport.rb +3 -0
  455. data/spec/app/models/patient.rb +3 -0
  456. data/spec/app/models/pdf_writer.rb +3 -0
  457. data/spec/app/models/pencil.rb +3 -0
  458. data/spec/app/models/person.rb +3 -0
  459. data/spec/app/models/pet.rb +3 -0
  460. data/spec/app/models/pet_owner.rb +3 -0
  461. data/spec/app/models/phone.rb +3 -0
  462. data/spec/app/models/pizza.rb +3 -0
  463. data/spec/app/models/player.rb +3 -0
  464. data/spec/app/models/post.rb +3 -0
  465. data/spec/app/models/post_genre.rb +3 -0
  466. data/spec/app/models/powerup.rb +3 -0
  467. data/spec/app/models/preference.rb +3 -0
  468. data/spec/app/models/princess.rb +3 -0
  469. data/spec/app/models/product.rb +3 -0
  470. data/spec/app/models/profile.rb +3 -0
  471. data/spec/app/models/pronunciation.rb +3 -0
  472. data/spec/app/models/pub.rb +3 -0
  473. data/spec/app/models/publication.rb +5 -0
  474. data/spec/app/models/publication/encyclopedia.rb +12 -0
  475. data/spec/app/models/publication/review.rb +14 -0
  476. data/spec/app/models/purchase.rb +3 -0
  477. data/spec/app/models/question.rb +3 -0
  478. data/spec/app/models/quiz.rb +3 -0
  479. data/spec/app/models/rating.rb +3 -0
  480. data/spec/app/models/record.rb +3 -0
  481. data/spec/app/models/registry.rb +3 -0
  482. data/spec/app/models/role.rb +3 -0
  483. data/spec/app/models/root_category.rb +3 -0
  484. data/spec/app/models/sandwich.rb +3 -0
  485. data/spec/app/models/scheduler.rb +3 -0
  486. data/spec/app/models/seo.rb +3 -0
  487. data/spec/app/models/series.rb +3 -0
  488. data/spec/app/models/server.rb +3 -0
  489. data/spec/app/models/service.rb +3 -0
  490. data/spec/app/models/shape.rb +3 -0
  491. data/spec/app/models/shelf.rb +3 -0
  492. data/spec/app/models/shipment_address.rb +3 -0
  493. data/spec/app/models/shipping_container.rb +3 -0
  494. data/spec/app/models/shipping_pack.rb +3 -0
  495. data/spec/app/models/shop.rb +3 -0
  496. data/spec/app/models/short_agent.rb +3 -0
  497. data/spec/app/models/short_quiz.rb +3 -0
  498. data/spec/app/models/simple.rb +3 -0
  499. data/spec/app/models/slave.rb +3 -0
  500. data/spec/app/models/song.rb +3 -0
  501. data/spec/app/models/sound.rb +3 -0
  502. data/spec/app/models/square.rb +3 -0
  503. data/spec/app/models/staff.rb +3 -0
  504. data/spec/app/models/store_as_dup_test1.rb +3 -0
  505. data/spec/app/models/store_as_dup_test2.rb +3 -0
  506. data/spec/app/models/store_as_dup_test3.rb +1 -0
  507. data/spec/app/models/store_as_dup_test4.rb +1 -0
  508. data/spec/app/models/strategy.rb +3 -0
  509. data/spec/app/models/sub_item.rb +3 -0
  510. data/spec/app/models/subscription.rb +3 -0
  511. data/spec/app/models/survey.rb +3 -0
  512. data/spec/app/models/symptom.rb +3 -0
  513. data/spec/app/models/tag.rb +3 -0
  514. data/spec/app/models/target.rb +3 -0
  515. data/spec/app/models/template.rb +3 -0
  516. data/spec/app/models/thing.rb +3 -0
  517. data/spec/app/models/title.rb +3 -0
  518. data/spec/app/models/tool.rb +3 -0
  519. data/spec/app/models/topping.rb +3 -0
  520. data/spec/app/models/track.rb +3 -0
  521. data/spec/app/models/translation.rb +3 -0
  522. data/spec/app/models/tree.rb +3 -0
  523. data/spec/app/models/truck.rb +3 -0
  524. data/spec/app/models/updatable.rb +1 -0
  525. data/spec/app/models/user.rb +3 -0
  526. data/spec/app/models/user_account.rb +3 -0
  527. data/spec/app/models/validation_callback.rb +3 -0
  528. data/spec/app/models/vehicle.rb +3 -0
  529. data/spec/app/models/version.rb +3 -0
  530. data/spec/app/models/vertex.rb +4 -1
  531. data/spec/app/models/vet_visit.rb +3 -0
  532. data/spec/app/models/video.rb +3 -0
  533. data/spec/app/models/video_game.rb +3 -0
  534. data/spec/app/models/weapon.rb +3 -0
  535. data/spec/app/models/wiki_page.rb +3 -0
  536. data/spec/app/models/word.rb +3 -0
  537. data/spec/app/models/word_origin.rb +3 -0
  538. data/spec/app/models/writer.rb +3 -0
  539. data/spec/config/mongoid.yml +1 -0
  540. data/spec/integration/app_spec.rb +192 -0
  541. data/spec/integration/associations/belongs_to_spec.rb +3 -0
  542. data/spec/integration/associations/embedded_spec.rb +175 -0
  543. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  544. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  545. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  546. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  547. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  548. data/spec/integration/criteria/logical_spec.rb +94 -0
  549. data/spec/integration/document_spec.rb +22 -0
  550. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  551. data/spec/integration/shardable_spec.rb +133 -0
  552. data/spec/lite_spec_helper.rb +20 -5
  553. data/spec/mongoid/association/accessors_spec.rb +3 -0
  554. data/spec/mongoid/association/auto_save_spec.rb +3 -0
  555. data/spec/mongoid/association/builders_spec.rb +3 -0
  556. data/spec/mongoid/association/constrainable_spec.rb +3 -0
  557. data/spec/mongoid/association/counter_cache_spec.rb +3 -0
  558. data/spec/mongoid/association/depending_spec.rb +3 -0
  559. data/spec/mongoid/association/eager_spec.rb +3 -0
  560. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -0
  561. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -0
  562. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -0
  563. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +3 -0
  564. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +3 -0
  565. data/spec/mongoid/association/embedded/embedded_in_spec.rb +4 -1
  566. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +3 -0
  567. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +3 -0
  568. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +3 -0
  569. data/spec/mongoid/association/embedded/embeds_many_models.rb +53 -0
  570. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  571. data/spec/mongoid/association/embedded/embeds_many_spec.rb +14 -1
  572. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +3 -0
  573. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +3 -0
  574. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +3 -0
  575. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +3 -0
  576. data/spec/mongoid/association/embedded/embeds_one_models.rb +3 -0
  577. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  578. data/spec/mongoid/association/embedded/embeds_one_spec.rb +4 -3
  579. data/spec/mongoid/association/macros_spec.rb +3 -0
  580. data/spec/mongoid/association/nested/many_spec.rb +3 -0
  581. data/spec/mongoid/association/nested/one_spec.rb +3 -0
  582. data/spec/mongoid/association/options_spec.rb +3 -0
  583. data/spec/mongoid/association/polymorphic_spec.rb +3 -0
  584. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -0
  585. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +3 -0
  586. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +205 -10
  587. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +3 -0
  588. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
  589. data/spec/mongoid/association/referenced/belongs_to_spec.rb +3 -0
  590. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -0
  591. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +3 -0
  592. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +16 -0
  593. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +26 -5
  594. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +39 -15
  595. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -2
  596. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  597. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +26 -2
  598. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -0
  599. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +3 -0
  600. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +18 -3
  601. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +3 -0
  602. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  603. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +5 -1
  604. data/spec/mongoid/association/referenced/has_many_models.rb +3 -0
  605. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  606. data/spec/mongoid/association/referenced/has_many_spec.rb +3 -0
  607. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +3 -0
  608. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +3 -0
  609. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -3
  610. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +3 -0
  611. data/spec/mongoid/association/referenced/has_one_models.rb +3 -0
  612. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  613. data/spec/mongoid/association/referenced/has_one_spec.rb +3 -0
  614. data/spec/mongoid/association/reflections_spec.rb +3 -0
  615. data/spec/mongoid/association/syncable_spec.rb +3 -0
  616. data/spec/mongoid/association_spec.rb +3 -0
  617. data/spec/mongoid/atomic/modifiers_spec.rb +3 -0
  618. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  619. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  620. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  621. data/spec/mongoid/atomic/paths_spec.rb +3 -0
  622. data/spec/mongoid/atomic_spec.rb +3 -0
  623. data/spec/mongoid/attributes/nested_spec.rb +3 -0
  624. data/spec/mongoid/attributes/readonly_spec.rb +3 -0
  625. data/spec/mongoid/attributes_spec.rb +3 -0
  626. data/spec/mongoid/cacheable_spec.rb +3 -0
  627. data/spec/mongoid/changeable_spec.rb +26 -0
  628. data/spec/mongoid/clients/factory_spec.rb +38 -20
  629. data/spec/mongoid/clients/options_spec.rb +26 -15
  630. data/spec/mongoid/clients/sessions_spec.rb +11 -4
  631. data/spec/mongoid/clients/transactions_spec.rb +26 -11
  632. data/spec/mongoid/clients_spec.rb +5 -2
  633. data/spec/mongoid/composable_spec.rb +3 -0
  634. data/spec/mongoid/config/environment_spec.rb +3 -0
  635. data/spec/mongoid/config/options_spec.rb +23 -3
  636. data/spec/mongoid/config_spec.rb +39 -0
  637. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  638. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  639. data/spec/mongoid/contextual/atomic_spec.rb +120 -10
  640. data/spec/mongoid/contextual/geo_near_spec.rb +3 -0
  641. data/spec/mongoid/contextual/map_reduce_spec.rb +23 -5
  642. data/spec/mongoid/contextual/memory_spec.rb +3 -0
  643. data/spec/mongoid/contextual/mongo_spec.rb +81 -53
  644. data/spec/mongoid/contextual/none_spec.rb +3 -0
  645. data/spec/mongoid/copyable_spec.rb +3 -0
  646. data/spec/mongoid/copyable_spec_models.rb +3 -0
  647. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  648. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  649. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  650. data/spec/mongoid/criteria/modifiable_spec.rb +7 -3
  651. data/spec/mongoid/criteria/options_spec.rb +3 -0
  652. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  653. data/spec/mongoid/criteria/queryable/expandable_spec.rb +135 -0
  654. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  655. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  656. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  657. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -0
  658. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  659. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  660. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  661. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  662. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  663. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  664. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  665. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  666. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  667. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -0
  668. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
  669. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  670. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -1
  671. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  672. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +24 -16
  673. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +3 -0
  674. data/spec/mongoid/criteria/queryable/key_spec.rb +3 -0
  675. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +48 -12
  676. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  677. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  678. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +3 -0
  679. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  680. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1348 -281
  681. data/spec/mongoid/criteria/queryable/selectable_spec.rb +996 -2159
  682. data/spec/mongoid/criteria/queryable/selector_spec.rb +3 -0
  683. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  684. data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
  685. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  686. data/spec/mongoid/criteria_spec.rb +73 -2
  687. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  688. data/spec/mongoid/document_query_spec.rb +39 -0
  689. data/spec/mongoid/document_spec.rb +3 -0
  690. data/spec/mongoid/equality_spec.rb +3 -0
  691. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  692. data/spec/mongoid/errors/callback_spec.rb +3 -0
  693. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -0
  694. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  695. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  696. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  697. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  698. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  699. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  700. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  701. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  702. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  703. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  704. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  705. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  706. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  707. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  708. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  709. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  710. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  711. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  712. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  713. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  714. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -0
  715. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  716. data/spec/mongoid/errors/no_client_config_spec.rb +3 -0
  717. data/spec/mongoid/errors/no_client_database_spec.rb +3 -0
  718. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -0
  719. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  720. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  721. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  722. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  723. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  724. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  725. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  726. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  727. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  728. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  729. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  730. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  731. data/spec/mongoid/errors/validations_spec.rb +3 -0
  732. data/spec/mongoid/extensions/array_spec.rb +26 -43
  733. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  734. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  735. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  736. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  737. data/spec/mongoid/extensions/date_spec.rb +9 -160
  738. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  739. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  740. data/spec/mongoid/extensions/false_class_spec.rb +3 -0
  741. data/spec/mongoid/extensions/float_spec.rb +18 -3
  742. data/spec/mongoid/extensions/hash_spec.rb +106 -0
  743. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  744. data/spec/mongoid/extensions/module_spec.rb +3 -0
  745. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  746. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  747. data/spec/mongoid/extensions/object_spec.rb +14 -24
  748. data/spec/mongoid/extensions/range_spec.rb +3 -0
  749. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  750. data/spec/mongoid/extensions/set_spec.rb +3 -0
  751. data/spec/mongoid/extensions/string_spec.rb +60 -26
  752. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  753. data/spec/mongoid/extensions/time_spec.rb +30 -0
  754. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  755. data/spec/mongoid/extensions/true_class_spec.rb +3 -0
  756. data/spec/mongoid/extensions_spec.rb +3 -0
  757. data/spec/mongoid/factory_spec.rb +27 -0
  758. data/spec/mongoid/fields/foreign_key_spec.rb +3 -0
  759. data/spec/mongoid/fields/localized_spec.rb +3 -0
  760. data/spec/mongoid/fields/standard_spec.rb +3 -0
  761. data/spec/mongoid/fields_spec.rb +18 -0
  762. data/spec/mongoid/findable_spec.rb +3 -0
  763. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  764. data/spec/mongoid/indexable_spec.rb +9 -4
  765. data/spec/mongoid/inspectable_spec.rb +3 -0
  766. data/spec/mongoid/interceptable_spec.rb +65 -0
  767. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  768. data/spec/mongoid/loggable_spec.rb +3 -0
  769. data/spec/mongoid/matchable/all_spec.rb +3 -0
  770. data/spec/mongoid/matchable/and_spec.rb +3 -0
  771. data/spec/mongoid/matchable/default_spec.rb +4 -1
  772. data/spec/mongoid/matchable/elem_match_spec.rb +3 -0
  773. data/spec/mongoid/matchable/eq_spec.rb +1 -0
  774. data/spec/mongoid/matchable/exists_spec.rb +3 -0
  775. data/spec/mongoid/matchable/gt_spec.rb +3 -0
  776. data/spec/mongoid/matchable/gte_spec.rb +3 -0
  777. data/spec/mongoid/matchable/in_spec.rb +3 -0
  778. data/spec/mongoid/matchable/lt_spec.rb +3 -0
  779. data/spec/mongoid/matchable/lte_spec.rb +3 -0
  780. data/spec/mongoid/matchable/ne_spec.rb +3 -0
  781. data/spec/mongoid/matchable/nin_spec.rb +3 -0
  782. data/spec/mongoid/matchable/nor_spec.rb +1 -0
  783. data/spec/mongoid/matchable/or_spec.rb +3 -0
  784. data/spec/mongoid/matchable/regexp_spec.rb +5 -2
  785. data/spec/mongoid/matchable/size_spec.rb +3 -0
  786. data/spec/mongoid/matchable_spec.rb +5 -2
  787. data/spec/mongoid/persistable/creatable_spec.rb +3 -0
  788. data/spec/mongoid/persistable/deletable_spec.rb +3 -0
  789. data/spec/mongoid/persistable/destroyable_spec.rb +3 -0
  790. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  791. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  792. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  793. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  794. data/spec/mongoid/persistable/pushable_spec.rb +86 -1
  795. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  796. data/spec/mongoid/persistable/savable_spec.rb +3 -0
  797. data/spec/mongoid/persistable/settable_spec.rb +17 -0
  798. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  799. data/spec/mongoid/persistable/updatable_spec.rb +3 -0
  800. data/spec/mongoid/persistable/upsertable_spec.rb +3 -0
  801. data/spec/mongoid/persistable_spec.rb +85 -8
  802. data/spec/mongoid/persistence_context_spec.rb +3 -0
  803. data/spec/mongoid/positional_spec.rb +3 -0
  804. data/spec/mongoid/query_cache_middleware_spec.rb +48 -0
  805. data/spec/mongoid/query_cache_spec.rb +5 -45
  806. data/spec/mongoid/relations/proxy_spec.rb +4 -1
  807. data/spec/mongoid/reloadable_spec.rb +3 -0
  808. data/spec/mongoid/scopable_spec.rb +5 -1
  809. data/spec/mongoid/selectable_spec.rb +3 -0
  810. data/spec/mongoid/serializable_spec.rb +132 -18
  811. data/spec/mongoid/shardable_models.rb +61 -0
  812. data/spec/mongoid/shardable_spec.rb +72 -16
  813. data/spec/mongoid/stateful_spec.rb +3 -0
  814. data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
  815. data/spec/mongoid/tasks/database_spec.rb +4 -1
  816. data/spec/mongoid/threaded_spec.rb +3 -0
  817. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  818. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  819. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  820. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  821. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  822. data/spec/mongoid/timestamps_spec.rb +3 -0
  823. data/spec/mongoid/touchable_spec.rb +49 -3
  824. data/spec/mongoid/traversable_spec.rb +3 -0
  825. data/spec/mongoid/validatable/associated_spec.rb +3 -0
  826. data/spec/mongoid/validatable/format_spec.rb +3 -0
  827. data/spec/mongoid/validatable/length_spec.rb +3 -0
  828. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  829. data/spec/mongoid/validatable/presence_spec.rb +3 -0
  830. data/spec/mongoid/validatable/uniqueness_spec.rb +3 -0
  831. data/spec/mongoid/validatable_spec.rb +3 -0
  832. data/spec/mongoid_spec.rb +3 -0
  833. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  834. data/spec/rails/mongoid_spec.rb +5 -2
  835. data/spec/spec_helper.rb +21 -44
  836. data/spec/support/authorization.rb +3 -0
  837. data/spec/support/child_process_helper.rb +76 -0
  838. data/spec/support/cluster_config.rb +3 -3
  839. data/spec/support/constraints.rb +185 -30
  840. data/spec/support/expectations.rb +6 -1
  841. data/spec/support/helpers.rb +11 -0
  842. data/spec/support/lite_constraints.rb +22 -0
  843. data/spec/support/macros.rb +1 -0
  844. data/spec/support/shared/time.rb +54 -0
  845. data/spec/support/spec_config.rb +15 -4
  846. metadata +544 -472
  847. metadata.gz.sig +0 -0
  848. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  849. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -8,7 +10,7 @@ module Mongoid
8
10
  class Binding
9
11
  include Bindable
10
12
 
11
- # Binds the base object to the inverse of the relation. This is so we
13
+ # Binds the base object to the inverse of the association. This is so we
12
14
  # are referenced to the actual objects themselves on both sides.
13
15
  #
14
16
  # This case sets the association on the inverse object as well as the
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -16,11 +18,12 @@ module Mongoid
16
18
  # relation.build(meta, attrs)
17
19
  #
18
20
  # @param [ Object ] base The base object.
19
- # @param [ Object ] object The object to use to build the relation.
20
- # @param [ String ] type The type of the relation.
21
+ # @param [ Object ] object The object to use to build the association.
22
+ # @param [ String ] type The type of the association.
23
+ # @param [ nil ] selected_fields Must be nil.
21
24
  #
22
25
  # @return [ Document ] A single document.
23
- def build(base, object, type = nil)
26
+ def build(base, object, type = nil, selected_fields = nil)
24
27
  return object unless query?(object)
25
28
  execute_query(object, type)
26
29
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -10,8 +12,6 @@ module Mongoid
10
12
  private
11
13
 
12
14
  def preload
13
- raise Errors::EagerLoad.new(@association.name) if @association.polymorphic?
14
-
15
15
  @docs.each do |d|
16
16
  set_relation(d, nil)
17
17
  end
@@ -22,6 +22,44 @@ module Mongoid
22
22
  end
23
23
  end
24
24
 
25
+ # Retrieves the documents referenced by the association, and
26
+ # yields each one sequentially to the provided block. If the
27
+ # association is not polymorphic, all documents are retrieved in
28
+ # a single query. If the association is polymorphic, one query is
29
+ # issued per association target class.
30
+ def each_loaded_document(&block)
31
+ if @association.polymorphic?
32
+ keys_by_type_from_docs.each do |type, keys|
33
+ each_loaded_document_of_class(Object.const_get(type), keys, &block)
34
+ end
35
+ else
36
+ super
37
+ end
38
+ end
39
+
40
+ # Returns a map from association target class name to foreign key
41
+ # values for the documents of that association target class,
42
+ # as referenced by this association.
43
+ def keys_by_type_from_docs
44
+ inverse_type_field = @association.inverse_type
45
+
46
+ @docs.each_with_object({}) do |doc, keys_by_type|
47
+ next unless doc.respond_to?(inverse_type_field) && doc.respond_to?(group_by_key)
48
+ inverse_type_name = doc.send(inverse_type_field)
49
+ # If a particular document does not have a value for this
50
+ # association, inverse_type_name will be nil.
51
+ next if inverse_type_name.nil?
52
+
53
+ key_value = doc.send(group_by_key)
54
+ # If a document has the *_type field set but the corresponding
55
+ # *_id field not set, the key value here will be nil.
56
+ next unless key_value
57
+
58
+ keys_by_type[inverse_type_name] ||= []
59
+ keys_by_type[inverse_type_name].push(key_value)
60
+ end
61
+ end
62
+
25
63
  def group_by_key
26
64
  @association.foreign_key
27
65
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
5
7
  class BelongsTo
6
8
 
7
- # This class handles all behaviour for relations that are either
9
+ # This class handles all behavior for associations that are either
8
10
  # one-to-many or one-to-one, where the foreign key is stored on this side
9
- # of the relation and the reference is to document(s) in another
11
+ # of the association and the reference is to document(s) in another
10
12
  # collection.
11
13
  class Proxy < Association::One
12
14
  include Evolvable
@@ -16,9 +18,9 @@ module Mongoid
16
18
  # @example Create the new proxy.
17
19
  # Association::BelongsTo::Proxy.new(game, person, association)
18
20
  #
19
- # @param [ Document ] base The document this relation hangs off of.
21
+ # @param [ Document ] base The document this association hangs off of.
20
22
  # @param [ Document, Array<Document> ] target The target (parent) of the
21
- # relation.
23
+ # association.
22
24
  # @param [ Association ] association The association object.
23
25
  def initialize(base, target, association)
24
26
  init(base, target, association) do
@@ -31,7 +33,7 @@ module Mongoid
31
33
  # document by deleting the foreign key and the reference, orphaning
32
34
  # the target document in the process.
33
35
  #
34
- # @example Nullify the relation.
36
+ # @example Nullify the association.
35
37
  # person.game.nullify
36
38
  #
37
39
  def nullify
@@ -40,14 +42,14 @@ module Mongoid
40
42
  end
41
43
 
42
44
  # Substitutes the supplied target documents for the existing document
43
- # in the relation.
45
+ # in the association.
44
46
  #
45
- # @example Substitute the relation.
47
+ # @example Substitute the association.
46
48
  # name.substitute(new_name)
47
49
  #
48
50
  # @param [ Document, Array<Document> ] replacement The replacement.
49
51
  #
50
- # @return [ self, nil ] The relation or nil.
52
+ # @return [ self, nil ] The association or nil.
51
53
  #
52
54
  # @since 2.0.0.rc.1
53
55
  def substitute(replacement)
@@ -61,7 +63,7 @@ module Mongoid
61
63
 
62
64
  private
63
65
 
64
- # Instantiate the binding associated with this relation.
66
+ # Instantiate the binding associated with this association.
65
67
  #
66
68
  # @example Get the binding object.
67
69
  # binding([ address ])
@@ -90,12 +92,12 @@ module Mongoid
90
92
  _association.build(klass, replacement)
91
93
  end
92
94
 
93
- # Are we able to persist this relation?
95
+ # Are we able to persist this association?
94
96
  #
95
- # @example Can we persist the relation?
97
+ # @example Can we persist the association?
96
98
  # relation.persistable?
97
99
  #
98
- # @return [ true, false ] If the relation is persistable.
100
+ # @return [ true, false ] If the association is persistable.
99
101
  #
100
102
  # @since 2.1.0
101
103
  def persistable?
@@ -116,10 +118,10 @@ module Mongoid
116
118
  Eager.new(association, docs)
117
119
  end
118
120
 
119
- # Returns true if the relation is an embedded one. In this case
121
+ # Returns true if the association is an embedded one. In this case
120
122
  # always false.
121
123
  #
122
- # @example Is this relation embedded?
124
+ # @example Is this association embedded?
123
125
  # Association::BelongsTo::Proxy.embedded?
124
126
  #
125
127
  # @return [ false ] Always false.
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -15,7 +17,7 @@ module Mongoid
15
17
  # BelongsTo.new(association, parent_docs)
16
18
  #
17
19
  # @param [ Array<Association> ] associations Associations to eager load
18
- # @param [ Array<Document> ] docs Documents to preload the relations
20
+ # @param [ Array<Document> ] docs Documents to preload the associations
19
21
  #
20
22
  # @return [ Base ] The eager load preloader
21
23
  #
@@ -28,7 +30,7 @@ module Mongoid
28
30
 
29
31
  # Run the preloader.
30
32
  #
31
- # @example Preload the relations into the documents.
33
+ # @example Preload the associations into the documents.
32
34
  # loader.run
33
35
  #
34
36
  # @return [ Array ] The list of documents given.
@@ -45,11 +47,11 @@ module Mongoid
45
47
 
46
48
  protected
47
49
 
48
- # Preload the current relation.
50
+ # Preload the current association.
49
51
  #
50
52
  # This method should be implemented in the subclass
51
53
  #
52
- # @example Preload the current relation into the documents.
54
+ # @example Preload the current association into the documents.
53
55
  # loader.preload
54
56
  #
55
57
  # @since 4.0.0
@@ -57,17 +59,29 @@ module Mongoid
57
59
  raise NotImplementedError
58
60
  end
59
61
 
60
- # Run the preloader.
61
- #
62
- # @example Iterate over the documents loaded for the current relation
63
- # loader.each_loaded_document { |doc| }
62
+ # Retrieves the documents referenced by the association, and
63
+ # yields each one sequentially to the provided block. If the
64
+ # association is not polymorphic, all documents are retrieved in
65
+ # a single query. If the association is polymorphic, one query is
66
+ # issued per association target class.
64
67
  #
65
68
  # @since 4.0.0
66
- def each_loaded_document
67
- doc_keys = keys_from_docs
68
- return @association.klass.none if doc_keys.all?(&:nil?)
69
+ def each_loaded_document(&block)
70
+ each_loaded_document_of_class(@association.klass, keys_from_docs, &block)
71
+ end
69
72
 
70
- criteria = @association.klass.any_in(key => doc_keys)
73
+ # Retrieves the documents of the specified class, that have the
74
+ # foreign key included in the specified list of keys.
75
+ #
76
+ # When the documents are retrieved, the set of inclusions applied
77
+ # is the set of inclusions applied to the host document minus the
78
+ # association that is being eagerly loaded.
79
+ private def each_loaded_document_of_class(cls, keys)
80
+ # Note: keys should not include nil elements.
81
+ # Upstream code is responsible for eliminating nils from keys.
82
+ return cls.none if keys.empty?
83
+
84
+ criteria = cls.any_in(key => keys)
71
85
  criteria.inclusions = criteria.inclusions - [@association]
72
86
  criteria.each do |doc|
73
87
  yield doc
@@ -91,6 +105,9 @@ module Mongoid
91
105
 
92
106
  # Return a hash with the current documents grouped by key.
93
107
  #
108
+ # Documents that do not have a value for the association being loaded
109
+ # are not returned.
110
+ #
94
111
  # @example Return a hash with the current documents grouped by key.
95
112
  # loader.grouped_docs
96
113
  #
@@ -100,10 +117,15 @@ module Mongoid
100
117
  def grouped_docs
101
118
  @grouped_docs[@association.name] ||= @docs.group_by do |doc|
102
119
  doc.send(group_by_key) if doc.respond_to?(group_by_key)
120
+ end.reject do |k, v|
121
+ k.nil?
103
122
  end
104
123
  end
105
124
 
106
- # Group the documents and return the keys
125
+ # Group the documents and return the keys.
126
+ #
127
+ # This method omits nil keys (i.e. keys from documents that do not
128
+ # have a value for the association being loaded).
107
129
  #
108
130
  # @example
109
131
  # loader.keys_from_docs
@@ -131,10 +153,10 @@ module Mongoid
131
153
 
132
154
  # Set the pre-loaded document into its parent.
133
155
  #
134
- # @example Set docs into parent using the current relation name.
156
+ # @example Set docs into parent using the current association name.
135
157
  # loader.set_relation(doc, docs)
136
158
  #
137
- # @param [ Document ] doc The object to set the relation on
159
+ # @param [ Document ] doc The object to set the association on
138
160
  # @param [ Document, Array ] element to set into the parent
139
161
  #
140
162
  # @since 4.0.0
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require 'mongoid/association/referenced/has_and_belongs_to_many/binding'
2
5
  require 'mongoid/association/referenced/has_and_belongs_to_many/buildable'
3
6
  require 'mongoid/association/referenced/has_and_belongs_to_many/proxy'
@@ -31,7 +34,9 @@ module Mongoid
31
34
  :foreign_key,
32
35
  :index,
33
36
  :order,
34
- :primary_key
37
+ :primary_key,
38
+ :inverse_primary_key,
39
+ :inverse_foreign_key,
35
40
  ].freeze
36
41
 
37
42
  # The complete list of valid options for this association, including
@@ -89,7 +94,7 @@ module Mongoid
89
94
  # @since 7.0
90
95
  def validation_default; true; end
91
96
 
92
- # Are ids only saved on this side of the relation?
97
+ # Are ids only saved on this side of the association?
93
98
  #
94
99
  # @return [ true, false ] Whether this association has a forced nil inverse.
95
100
  #
@@ -105,7 +110,7 @@ module Mongoid
105
110
  # @since 7.0
106
111
  def stores_foreign_key?; true; end
107
112
 
108
- # Get the relation proxy class for this association type.
113
+ # Get the association proxy class for this association type.
109
114
  #
110
115
  # @return [ Association::HasAndBelongsToMany::Proxy ] The proxy class.
111
116
  #
@@ -124,9 +129,9 @@ module Mongoid
124
129
  default_foreign_key_field
125
130
  end
126
131
 
127
- # The criteria used for querying this relation.
132
+ # The criteria used for querying this association.
128
133
  #
129
- # @return [ Mongoid::Criteria ] The criteria used for querying this relation.
134
+ # @return [ Mongoid::Criteria ] The criteria used for querying this association.
130
135
  #
131
136
  # @since 7.0
132
137
  def criteria(base, id_list = nil)
@@ -140,7 +145,9 @@ module Mongoid
140
145
  #
141
146
  # @since 7.0
142
147
  def inverse_foreign_key
143
- if @options.key?(:inverse_of)
148
+ if @options.key?(:inverse_foreign_key)
149
+ @options[:inverse_foreign_key]
150
+ elsif @options.key?(:inverse_of)
144
151
  inverse_of ? "#{inverse_of.to_s.singularize}#{FOREIGN_KEY_SUFFIX}" : nil
145
152
  else
146
153
  "#{inverse_class_name.demodulize.underscore}#{FOREIGN_KEY_SUFFIX}"
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
5
7
  class HasAndBelongsToMany
6
8
 
7
- # Binding class for all has_and_belongs_to_many relations.
9
+ # Binding class for all has_and_belongs_to_many associations.
8
10
  class Binding
9
11
  include Bindable
10
12
 
11
- # Binds a single document with the inverse relation. Used
13
+ # Binds a single document with the inverse association. Used
12
14
  # specifically when appending to the proxy.
13
15
  #
14
16
  # @example Bind one document.
@@ -53,11 +55,15 @@ module Mongoid
53
55
 
54
56
  # Find the inverse id referenced by inverse_keys
55
57
  def inverse_record_id(doc)
56
- inverse_association = determine_inverse_association(doc)
57
- if inverse_association
58
- _base.__send__(inverse_association.primary_key)
58
+ if pk = _association.options[:inverse_primary_key]
59
+ _base.send(pk)
59
60
  else
60
- _base._id
61
+ inverse_association = determine_inverse_association(doc)
62
+ if inverse_association
63
+ _base.__send__(inverse_association.primary_key)
64
+ else
65
+ _base._id
66
+ end
61
67
  end
62
68
  end
63
69
 
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -16,11 +18,12 @@ module Mongoid
16
18
  # relation.build(association, attrs)
17
19
  #
18
20
  # @param [ Object ] base The base object.
19
- # @param [ Object ] object The object to use to build the relation.
21
+ # @param [ Object ] object The object to use to build the association.
20
22
  # @param [ String ] type Not used in this context.
23
+ # @param [ nil ] selected_fields Must be nil.
21
24
  #
22
25
  # @return [ Array<Document> ] The documents.
23
- def build(base, object, type = nil)
26
+ def build(base, object, type = nil, selected_fields = nil)
24
27
  if query?(object)
25
28
  query_criteria(object)
26
29
  else
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  # encoding: utf-8
3
+
2
4
  module Mongoid
3
5
  module Association
4
6
  module Referenced
5
7
  class HasAndBelongsToMany
6
8
 
7
- # This class defines the behaviour for all relations that are a
9
+ # This class defines the behavior for all associations that are a
8
10
  # many-to-many between documents in different collections.
9
11
  class Proxy < Referenced::HasMany::Proxy
10
12
 
11
- # Appends a document or array of documents to the relation. Will set
13
+ # Appends a document or array of documents to the association. Will set
12
14
  # the parent and update the index in the process.
13
15
  #
14
16
  # @example Append a document.
@@ -40,7 +42,7 @@ module Mongoid
40
42
 
41
43
  alias :push :<<
42
44
 
43
- # Appends an array of documents to the relation. Performs a batch
45
+ # Appends an array of documents to the association. Performs a batch
44
46
  # insert of the documents instead of persisting one at a time.
45
47
  #
46
48
  # @example Concat with other documents.
@@ -74,9 +76,9 @@ module Mongoid
74
76
  end
75
77
 
76
78
  # Build a new document from the attributes and append it to this
77
- # relation without saving.
79
+ # association without saving.
78
80
  #
79
- # @example Build a new document on the relation.
81
+ # @example Build a new document on the association.
80
82
  # person.posts.build(:title => "A new post")
81
83
  #
82
84
  # @param [ Hash ] attributes The attributes of the new document.
@@ -97,8 +99,8 @@ module Mongoid
97
99
 
98
100
  alias :new :build
99
101
 
100
- # Delete the document from the relation. This will set the foreign key
101
- # on the document to nil. If the dependent options on the relation are
102
+ # Delete the document from the association. This will set the foreign key
103
+ # on the document to nil. If the dependent options on the association are
102
104
  # :delete or :destroy the appropriate removal will occur.
103
105
  #
104
106
  # @example Delete the document.
@@ -123,7 +125,7 @@ module Mongoid
123
125
  # documents by deleting the foreign keys and the references, orphaning
124
126
  # the target documents in the process.
125
127
  #
126
- # @example Nullify the relation.
128
+ # @example Nullify the association.
127
129
  # person.preferences.nullify
128
130
  #
129
131
  # @param [ Array<Document> ] replacement The replacement documents.
@@ -134,13 +136,18 @@ module Mongoid
134
136
  execute_callback :before_remove, doc
135
137
  end
136
138
  unless _association.forced_nil_inverse?
139
+ if field = _association.options[:inverse_primary_key]
140
+ ipk = _base.send(field)
141
+ else
142
+ ipk = _base._id
143
+ end
137
144
  if replacement
138
145
  objects_to_clear = _base.send(foreign_key) - replacement.collect do |object|
139
146
  object.send(_association.primary_key)
140
147
  end
141
- criteria(objects_to_clear).pull(inverse_foreign_key => _base._id)
148
+ criteria(objects_to_clear).pull(inverse_foreign_key => ipk)
142
149
  else
143
- criteria.pull(inverse_foreign_key => _base._id)
150
+ criteria.pull(inverse_foreign_key => ipk)
144
151
  end
145
152
  end
146
153
  if persistable?
@@ -167,15 +174,15 @@ module Mongoid
167
174
  alias :purge :nullify
168
175
 
169
176
  # Substitutes the supplied target documents for the existing documents
170
- # in the relation. If the new target is nil, perform the necessary
177
+ # in the association. If the new target is nil, perform the necessary
171
178
  # deletion.
172
179
  #
173
- # @example Replace the relation.
180
+ # @example Replace the association.
174
181
  # person.preferences.substitute([ new_post ])
175
182
  #
176
183
  # @param [ Array<Document> ] replacement The replacement target.
177
184
  #
178
- # @return [ Many ] The relation.
185
+ # @return [ Many ] The association.
179
186
  #
180
187
  # @since 2.0.0.rc.1
181
188
  def substitute(replacement)
@@ -206,7 +213,7 @@ module Mongoid
206
213
  # Appends the document to the target array, updating the index on the
207
214
  # document at the same time.
208
215
  #
209
- # @example Append the document to the relation.
216
+ # @example Append the document to the association.
210
217
  # relation.append(document)
211
218
  #
212
219
  # @param [ Document ] document The document to append to the target.
@@ -220,7 +227,7 @@ module Mongoid
220
227
  execute_callback :after_add, document
221
228
  end
222
229
 
223
- # Instantiate the binding associated with this relation.
230
+ # Instantiate the binding associated with this association.
224
231
  #
225
232
  # @example Get the binding.
226
233
  # relation.binding([ address ])
@@ -252,7 +259,7 @@ module Mongoid
252
259
  # Returns the criteria object for the target class with its documents set
253
260
  # to target.
254
261
  #
255
- # @example Get a criteria for the relation.
262
+ # @example Get a criteria for the association.
256
263
  # relation.criteria
257
264
  #
258
265
  # @return [ Criteria ] A new criteria.
@@ -292,10 +299,10 @@ module Mongoid
292
299
  Eager.new(association, docs)
293
300
  end
294
301
 
295
- # Returns true if the relation is an embedded one. In this case
302
+ # Returns true if the association is an embedded one. In this case
296
303
  # always false.
297
304
  #
298
- # @example Is this relation embedded?
305
+ # @example Is this association embedded?
299
306
  # Referenced::ManyToMany.embedded?
300
307
  #
301
308
  # @return [ false ] Always false.