mongoid 3.1.7 → 4.0.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 (567) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +470 -9
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  6. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/atomic.rb +3 -14
  10. data/lib/mongoid/attributes/dynamic.rb +154 -0
  11. data/lib/mongoid/attributes/nested.rb +82 -0
  12. data/lib/mongoid/attributes/processing.rb +13 -66
  13. data/lib/mongoid/attributes.rb +63 -99
  14. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  15. data/lib/mongoid/composable.rb +105 -0
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  19. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  20. data/lib/mongoid/contextual/atomic.rb +53 -53
  21. data/lib/mongoid/contextual/geo_near.rb +1 -1
  22. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  23. data/lib/mongoid/contextual/memory.rb +23 -11
  24. data/lib/mongoid/contextual/mongo.rb +75 -57
  25. data/lib/mongoid/contextual/none.rb +90 -0
  26. data/lib/mongoid/contextual/text_search.rb +178 -0
  27. data/lib/mongoid/contextual.rb +2 -0
  28. data/lib/mongoid/copyable.rb +2 -3
  29. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  30. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  31. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  32. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  33. data/lib/mongoid/criteria/permission.rb +70 -0
  34. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  35. data/lib/mongoid/criteria.rb +39 -34
  36. data/lib/mongoid/document.rb +39 -24
  37. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  38. data/lib/mongoid/errors/document_not_found.rb +2 -1
  39. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  40. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  41. data/lib/mongoid/errors/invalid_value.rb +16 -0
  42. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  43. data/lib/mongoid/errors/readonly_document.rb +24 -0
  44. data/lib/mongoid/errors.rb +4 -1
  45. data/lib/mongoid/extensions/array.rb +3 -3
  46. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  47. data/lib/mongoid/extensions/boolean.rb +15 -17
  48. data/lib/mongoid/extensions/date.rb +1 -1
  49. data/lib/mongoid/extensions/date_time.rb +3 -3
  50. data/lib/mongoid/extensions/float.rb +2 -1
  51. data/lib/mongoid/extensions/hash.rb +3 -3
  52. data/lib/mongoid/extensions/integer.rb +1 -1
  53. data/lib/mongoid/extensions/object.rb +7 -7
  54. data/lib/mongoid/extensions/object_id.rb +5 -5
  55. data/lib/mongoid/extensions/range.rb +9 -3
  56. data/lib/mongoid/extensions/regexp.rb +1 -1
  57. data/lib/mongoid/extensions/set.rb +1 -1
  58. data/lib/mongoid/extensions/string.rb +6 -18
  59. data/lib/mongoid/extensions/symbol.rb +1 -1
  60. data/lib/mongoid/extensions/time.rb +3 -3
  61. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  62. data/lib/mongoid/extensions.rb +15 -7
  63. data/lib/mongoid/factory.rb +8 -6
  64. data/lib/mongoid/fields/foreign_key.rb +3 -3
  65. data/lib/mongoid/fields/localized.rb +1 -1
  66. data/lib/mongoid/fields/standard.rb +5 -17
  67. data/lib/mongoid/fields/validators/macro.rb +15 -5
  68. data/lib/mongoid/fields.rb +41 -8
  69. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  70. data/lib/mongoid/indexable/specification.rb +104 -0
  71. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  74. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  75. data/lib/mongoid/log_subscriber.rb +55 -0
  76. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  77. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  78. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  83. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  86. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  87. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  88. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  89. data/lib/mongoid/matchable.rb +152 -0
  90. data/lib/mongoid/persistable/creatable.rb +189 -0
  91. data/lib/mongoid/persistable/deletable.rb +149 -0
  92. data/lib/mongoid/persistable/destroyable.rb +60 -0
  93. data/lib/mongoid/persistable/incrementable.rb +36 -0
  94. data/lib/mongoid/persistable/logical.rb +38 -0
  95. data/lib/mongoid/persistable/poppable.rb +39 -0
  96. data/lib/mongoid/persistable/pullable.rb +55 -0
  97. data/lib/mongoid/persistable/pushable.rb +62 -0
  98. data/lib/mongoid/persistable/renamable.rb +35 -0
  99. data/lib/mongoid/persistable/savable.rb +52 -0
  100. data/lib/mongoid/persistable/settable.rb +33 -0
  101. data/lib/mongoid/persistable/unsettable.rb +36 -0
  102. data/lib/mongoid/persistable/updatable.rb +153 -0
  103. data/lib/mongoid/persistable/upsertable.rb +55 -0
  104. data/lib/mongoid/persistable.rb +216 -0
  105. data/lib/mongoid/positional.rb +71 -0
  106. data/lib/mongoid/query_cache.rb +255 -0
  107. data/lib/mongoid/railtie.rb +34 -60
  108. data/lib/mongoid/railties/database.rake +9 -25
  109. data/lib/mongoid/relations/accessors.rb +15 -51
  110. data/lib/mongoid/relations/auto_save.rb +15 -36
  111. data/lib/mongoid/relations/binding.rb +2 -25
  112. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  113. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  114. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  115. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  116. data/lib/mongoid/relations/builder.rb +1 -1
  117. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  118. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  119. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  120. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  121. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  122. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  123. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  124. data/lib/mongoid/relations/builders.rb +2 -2
  125. data/lib/mongoid/relations/cascading.rb +3 -5
  126. data/lib/mongoid/relations/constraint.rb +1 -1
  127. data/lib/mongoid/relations/conversions.rb +1 -1
  128. data/lib/mongoid/relations/counter_cache.rb +39 -15
  129. data/lib/mongoid/relations/eager/base.rb +149 -0
  130. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  131. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  132. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  133. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  134. data/lib/mongoid/relations/eager.rb +46 -0
  135. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  136. data/lib/mongoid/relations/embedded/in.rb +4 -4
  137. data/lib/mongoid/relations/embedded/many.rb +14 -32
  138. data/lib/mongoid/relations/embedded/one.rb +1 -1
  139. data/lib/mongoid/relations/macros.rb +3 -4
  140. data/lib/mongoid/relations/many.rb +51 -31
  141. data/lib/mongoid/relations/marshalable.rb +3 -3
  142. data/lib/mongoid/relations/metadata.rb +14 -79
  143. data/lib/mongoid/relations/nested_builder.rb +2 -2
  144. data/lib/mongoid/relations/one.rb +1 -1
  145. data/lib/mongoid/relations/options.rb +1 -0
  146. data/lib/mongoid/relations/polymorphic.rb +0 -1
  147. data/lib/mongoid/relations/proxy.rb +21 -41
  148. data/lib/mongoid/relations/referenced/in.rb +4 -20
  149. data/lib/mongoid/relations/referenced/many.rb +22 -35
  150. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  151. data/lib/mongoid/relations/referenced/one.rb +6 -25
  152. data/lib/mongoid/relations/synchronization.rb +4 -4
  153. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  154. data/lib/mongoid/relations/touchable.rb +34 -1
  155. data/lib/mongoid/relations.rb +11 -25
  156. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  157. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  158. data/lib/mongoid/selectable.rb +59 -0
  159. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  160. data/lib/mongoid/sessions/factory.rb +2 -0
  161. data/lib/mongoid/sessions/options.rb +185 -0
  162. data/lib/mongoid/sessions/storage_options.rb +140 -0
  163. data/lib/mongoid/sessions/thread_options.rb +19 -0
  164. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  165. data/lib/mongoid/sessions.rb +37 -345
  166. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  167. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  168. data/lib/mongoid/support/query_counter.rb +23 -0
  169. data/lib/mongoid/tasks/database.rake +31 -0
  170. data/lib/mongoid/tasks/database.rb +107 -0
  171. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  172. data/lib/mongoid/threaded.rb +26 -172
  173. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  174. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  175. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  176. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  178. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  179. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  180. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  182. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  183. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  184. data/lib/mongoid/version.rb +1 -1
  185. data/lib/mongoid.rb +10 -76
  186. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  187. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  188. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  189. data/lib/rails/generators/mongoid_generator.rb +3 -40
  190. data/lib/rails/mongoid.rb +0 -122
  191. data/lib/support/ruby_version.rb +1 -1
  192. data/spec/app/models/account.rb +2 -6
  193. data/spec/app/models/acolyte.rb +2 -1
  194. data/spec/app/models/actor.rb +0 -1
  195. data/spec/app/models/address.rb +8 -3
  196. data/spec/app/models/animal.rb +1 -1
  197. data/spec/app/models/appointment.rb +3 -3
  198. data/spec/app/models/article.rb +1 -4
  199. data/spec/app/models/audio.rb +5 -0
  200. data/spec/app/models/author.rb +0 -2
  201. data/spec/app/models/band.rb +3 -2
  202. data/spec/app/models/bar.rb +1 -0
  203. data/spec/app/models/book.rb +1 -0
  204. data/spec/app/models/building.rb +0 -2
  205. data/spec/app/models/building_address.rb +0 -2
  206. data/spec/app/models/bus.rb +1 -1
  207. data/spec/app/models/canvas.rb +1 -1
  208. data/spec/app/models/contextable_item.rb +5 -0
  209. data/spec/app/models/contractor.rb +0 -2
  210. data/spec/app/models/country_code.rb +1 -1
  211. data/spec/app/models/definition.rb +2 -2
  212. data/spec/app/models/dog.rb +1 -1
  213. data/spec/app/models/dragon.rb +4 -0
  214. data/spec/app/models/drug.rb +1 -3
  215. data/spec/app/models/dungeon.rb +4 -0
  216. data/spec/app/models/edit.rb +5 -0
  217. data/spec/app/models/even.rb +7 -0
  218. data/spec/app/models/event.rb +1 -1
  219. data/spec/app/models/filesystem.rb +1 -0
  220. data/spec/app/models/fish.rb +0 -1
  221. data/spec/app/models/fruits.rb +6 -0
  222. data/spec/app/models/game.rb +0 -2
  223. data/spec/app/models/house.rb +1 -3
  224. data/spec/app/models/id_key.rb +6 -0
  225. data/spec/app/models/item.rb +1 -5
  226. data/spec/app/models/jar.rb +1 -1
  227. data/spec/app/models/label.rb +4 -4
  228. data/spec/app/models/line_item.rb +1 -1
  229. data/spec/app/models/login.rb +1 -1
  230. data/spec/app/models/message.rb +8 -0
  231. data/spec/app/models/movie.rb +1 -0
  232. data/spec/app/models/name.rb +3 -3
  233. data/spec/app/models/note.rb +3 -1
  234. data/spec/app/models/odd.rb +7 -0
  235. data/spec/app/models/oscar.rb +1 -1
  236. data/spec/app/models/parent_doc.rb +1 -1
  237. data/spec/app/models/person.rb +16 -10
  238. data/spec/app/models/phone.rb +1 -3
  239. data/spec/app/models/player.rb +3 -3
  240. data/spec/app/models/post.rb +5 -3
  241. data/spec/app/models/preference.rb +1 -1
  242. data/spec/app/models/quiz.rb +0 -3
  243. data/spec/app/models/record.rb +10 -5
  244. data/spec/app/models/registry.rb +1 -1
  245. data/spec/app/models/server.rb +1 -1
  246. data/spec/app/models/service.rb +3 -3
  247. data/spec/app/models/sound.rb +5 -0
  248. data/spec/app/models/symptom.rb +1 -1
  249. data/spec/app/models/template.rb +1 -1
  250. data/spec/app/models/title.rb +0 -1
  251. data/spec/app/models/track.rb +5 -5
  252. data/spec/app/models/tree.rb +3 -3
  253. data/spec/app/models/video.rb +1 -5
  254. data/spec/app/models/wiki_page.rb +2 -5
  255. data/spec/app/models/word.rb +3 -0
  256. data/spec/app/models/word_origin.rb +1 -1
  257. data/spec/config/mongoid.yml +7 -8
  258. data/spec/helpers.rb +18 -0
  259. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  260. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  261. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  262. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  263. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  264. data/spec/mongoid/atomic_spec.rb +19 -19
  265. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  266. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  267. data/spec/mongoid/attributes_spec.rb +334 -434
  268. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  269. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  270. data/spec/mongoid/config/environment_spec.rb +3 -3
  271. data/spec/mongoid/config/options_spec.rb +6 -6
  272. data/spec/mongoid/config_spec.rb +24 -48
  273. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  274. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  275. data/spec/mongoid/contextual/atomic_spec.rb +59 -55
  276. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  277. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  278. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  279. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  280. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  281. data/spec/mongoid/contextual/none_spec.rb +127 -0
  282. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  283. data/spec/mongoid/copyable_spec.rb +56 -68
  284. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  285. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  286. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  287. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  288. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  289. data/spec/mongoid/criteria_spec.rb +713 -2419
  290. data/spec/mongoid/document_spec.rb +171 -121
  291. data/spec/mongoid/equality_spec.rb +22 -22
  292. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  293. data/spec/mongoid/errors/callback_spec.rb +3 -3
  294. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  295. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  296. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  297. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  308. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  311. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  312. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  313. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  314. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  315. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  325. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  326. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  327. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  328. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  329. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  330. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  331. data/spec/mongoid/errors/validations_spec.rb +7 -7
  332. data/spec/mongoid/extensions/array_spec.rb +61 -61
  333. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  334. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  335. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  336. data/spec/mongoid/extensions/date_spec.rb +13 -13
  337. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  338. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  339. data/spec/mongoid/extensions/float_spec.rb +29 -15
  340. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  341. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  342. data/spec/mongoid/extensions/module_spec.rb +2 -2
  343. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  344. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  345. data/spec/mongoid/extensions/object_spec.rb +26 -26
  346. data/spec/mongoid/extensions/range_spec.rb +61 -12
  347. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  348. data/spec/mongoid/extensions/set_spec.rb +4 -4
  349. data/spec/mongoid/extensions/string_spec.rb +35 -46
  350. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  351. data/spec/mongoid/extensions/time_spec.rb +49 -49
  352. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  353. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  354. data/spec/mongoid/extensions_spec.rb +29 -0
  355. data/spec/mongoid/factory_spec.rb +15 -15
  356. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  357. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  358. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  359. data/spec/mongoid/fields/localized_spec.rb +38 -23
  360. data/spec/mongoid/fields/standard_spec.rb +12 -12
  361. data/spec/mongoid/fields_spec.rb +263 -217
  362. data/spec/mongoid/findable_spec.rb +509 -0
  363. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  364. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  365. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  366. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  367. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  368. data/spec/mongoid/loggable_spec.rb +1 -1
  369. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  370. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  371. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  372. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  373. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  374. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  375. data/spec/mongoid/matchable/in_spec.rb +49 -0
  376. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  377. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  378. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  379. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  380. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  381. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  382. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  383. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  384. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  385. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  386. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  387. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  388. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  389. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  390. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  391. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  392. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  393. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  394. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  395. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  396. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  397. data/spec/mongoid/persistable_spec.rb +206 -0
  398. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  399. data/spec/mongoid/query_cache_spec.rb +263 -0
  400. data/spec/mongoid/railties/document_spec.rb +2 -2
  401. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  402. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  403. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  404. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  405. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  406. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  407. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  408. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  409. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  410. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  411. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  412. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  413. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  414. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  415. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  416. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  417. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  418. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  419. data/spec/mongoid/relations/builders_spec.rb +21 -21
  420. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  421. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  422. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  423. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  424. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  425. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  426. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  427. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  428. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  429. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  430. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  431. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  432. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  433. data/spec/mongoid/relations/eager_spec.rb +228 -0
  434. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  435. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  436. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  437. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  438. data/spec/mongoid/relations/macros_spec.rb +108 -102
  439. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  440. data/spec/mongoid/relations/options_spec.rb +1 -1
  441. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  442. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  443. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  444. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  445. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  446. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  447. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  448. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  449. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  450. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  451. data/spec/mongoid/relations_spec.rb +16 -15
  452. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  453. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  454. data/spec/mongoid/selectable_spec.rb +134 -0
  455. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  456. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  457. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  458. data/spec/mongoid/sessions/options_spec.rb +108 -0
  459. data/spec/mongoid/sessions_spec.rb +319 -178
  460. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  461. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  462. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  463. data/spec/mongoid/tasks/database_spec.rb +160 -0
  464. data/spec/mongoid/threaded_spec.rb +17 -70
  465. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  466. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  467. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  468. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  469. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  470. data/spec/mongoid/timestamps_spec.rb +9 -13
  471. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  472. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  473. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  474. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  475. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  476. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  477. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  478. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  479. data/spec/mongoid_spec.rb +8 -8
  480. data/spec/rails/mongoid_spec.rb +19 -350
  481. data/spec/spec_helper.rb +26 -15
  482. metadata +262 -247
  483. data/lib/mongoid/atomic/positionable.rb +0 -73
  484. data/lib/mongoid/components.rb +0 -92
  485. data/lib/mongoid/config/inflections.rb +0 -6
  486. data/lib/mongoid/contextual/eager.rb +0 -158
  487. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  488. data/lib/mongoid/identity_map.rb +0 -163
  489. data/lib/mongoid/json.rb +0 -16
  490. data/lib/mongoid/matchers/strategies.rb +0 -97
  491. data/lib/mongoid/matchers.rb +0 -32
  492. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  493. data/lib/mongoid/nested_attributes.rb +0 -78
  494. data/lib/mongoid/observer.rb +0 -192
  495. data/lib/mongoid/paranoia.rb +0 -136
  496. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  497. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  498. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  499. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  500. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  501. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  502. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  503. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  504. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  505. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  506. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  507. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  508. data/lib/mongoid/persistence/atomic.rb +0 -231
  509. data/lib/mongoid/persistence/deletion.rb +0 -31
  510. data/lib/mongoid/persistence/insertion.rb +0 -38
  511. data/lib/mongoid/persistence/modification.rb +0 -35
  512. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  513. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  514. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  515. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  516. data/lib/mongoid/persistence/operations/update.rb +0 -59
  517. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  518. data/lib/mongoid/persistence/operations.rb +0 -214
  519. data/lib/mongoid/persistence/upsertion.rb +0 -31
  520. data/lib/mongoid/persistence.rb +0 -357
  521. data/lib/mongoid/unit_of_work.rb +0 -61
  522. data/lib/mongoid/versioning.rb +0 -217
  523. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  524. data/lib/rack/mongoid.rb +0 -2
  525. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  526. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  527. data/spec/app/models/actor_observer.rb +0 -15
  528. data/spec/app/models/callback_recorder.rb +0 -25
  529. data/spec/app/models/paranoid_phone.rb +0 -25
  530. data/spec/app/models/paranoid_post.rb +0 -36
  531. data/spec/app/models/phone_observer.rb +0 -6
  532. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  533. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  534. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  535. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  536. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  537. data/spec/mongoid/finders_spec.rb +0 -321
  538. data/spec/mongoid/identity_map_spec.rb +0 -564
  539. data/spec/mongoid/json_spec.rb +0 -33
  540. data/spec/mongoid/matchers/in_spec.rb +0 -25
  541. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  542. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  543. data/spec/mongoid/observer_spec.rb +0 -290
  544. data/spec/mongoid/paranoia_spec.rb +0 -759
  545. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  546. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  547. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  548. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  549. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  550. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  551. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  552. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  553. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  554. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  555. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  556. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  557. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  558. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  559. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  560. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  561. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  562. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  563. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  564. data/spec/mongoid/persistence_spec.rb +0 -2279
  565. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  566. data/spec/mongoid/versioning_spec.rb +0 -540
  567. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -78,12 +78,8 @@ module Mongoid
78
78
  # @return [ Document ] The new document.
79
79
  #
80
80
  # @since 2.0.0.beta.1
81
- def build(attributes = {}, options = {}, type = nil)
82
- if options.is_a? Class
83
- options, type = {}, options
84
- end
85
-
86
- doc = Factory.build(type || klass, attributes, options)
81
+ def build(attributes = {}, type = nil)
82
+ doc = Factory.build(type || klass, attributes)
87
83
  append(doc)
88
84
  doc.apply_post_processed_defaults
89
85
  yield(doc) if block_given?
@@ -186,15 +182,15 @@ module Mongoid
186
182
  # conditions.
187
183
  #
188
184
  # @example Find by an id.
189
- # person.posts.find(Moped::BSON::ObjectId.new)
185
+ # person.posts.find(BSON::ObjectId.new)
190
186
  #
191
187
  # @example Find by multiple ids.
192
- # person.posts.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
188
+ # person.posts.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
193
189
  #
194
190
  # @note This will keep matching documents in memory for iteration
195
191
  # later.
196
192
  #
197
- # @param [ Moped::BSON::ObjectId, Array<Moped::BSON::ObjectId> ] arg The ids.
193
+ # @param [ BSON::ObjectId, Array<BSON::ObjectId> ] arg The ids.
198
194
  #
199
195
  # @return [ Document, Criteria ] The matching document(s).
200
196
  #
@@ -249,7 +245,7 @@ module Mongoid
249
245
  #
250
246
  # @since 2.0.0.beta.1
251
247
  def purge
252
- unless metadata.destructive?
248
+ unless __metadata.destructive?
253
249
  nullify
254
250
  else
255
251
  after_remove_error = nil
@@ -285,10 +281,10 @@ module Mongoid
285
281
  def substitute(replacement)
286
282
  if replacement
287
283
  new_docs, docs = replacement.compact, []
288
- new_ids = new_docs.map { |doc| doc.id }
284
+ new_ids = new_docs.map { |doc| doc._id }
289
285
  remove_not_in(new_ids)
290
286
  new_docs.each do |doc|
291
- docs.push(doc) if doc.send(foreign_key) != base.id
287
+ docs.push(doc) if doc.send(foreign_key) != base._id
292
288
  end
293
289
  concat(docs)
294
290
  else
@@ -308,7 +304,7 @@ module Mongoid
308
304
  # @since 2.4.0
309
305
  def unscoped
310
306
  klass.unscoped.where(
311
- foreign_key => Conversions.flag(base.id, metadata)
307
+ foreign_key => Conversions.flag(base._id, __metadata)
312
308
  )
313
309
  end
314
310
 
@@ -324,6 +320,8 @@ module Mongoid
324
320
  #
325
321
  # @since 2.0.0.rc.1
326
322
  def append(document)
323
+ document.with(@persistence_options) if @persistence_options
324
+
327
325
  execute_callback :before_add, document
328
326
  target.push(document)
329
327
  characterize_one(document)
@@ -342,7 +340,7 @@ module Mongoid
342
340
  #
343
341
  # @since 2.0.0.rc.1
344
342
  def binding
345
- Bindings::Referenced::Many.new(base, target, metadata)
343
+ Bindings::Referenced::Many.new(base, target, __metadata)
346
344
  end
347
345
 
348
346
  # Get the collection of the relation in question.
@@ -368,8 +366,8 @@ module Mongoid
368
366
  # @since 2.0.0.beta.1
369
367
  def criteria
370
368
  Many.criteria(
371
- metadata,
372
- Conversions.flag(base.send(metadata.primary_key), metadata),
369
+ __metadata,
370
+ Conversions.flag(base.send(__metadata.primary_key), __metadata),
373
371
  base.class
374
372
  )
375
373
  end
@@ -387,8 +385,8 @@ module Mongoid
387
385
  # @since 2.1.0
388
386
  def cascade!(document)
389
387
  if persistable?
390
- if metadata.destructive?
391
- document.send(metadata.dependent)
388
+ if __metadata.destructive?
389
+ document.send(__metadata.dependent)
392
390
  else
393
391
  document.save
394
392
  end
@@ -412,7 +410,7 @@ module Mongoid
412
410
  target.send(name, *args, &block)
413
411
  else
414
412
  klass.send(:with_scope, criteria) do
415
- criteria.send(name, *args, &block)
413
+ criteria.public_send(name, *args, &block)
416
414
  end
417
415
  end
418
416
  end
@@ -488,16 +486,16 @@ module Mongoid
488
486
  # @since 2.4.0
489
487
  def remove_not_in(ids)
490
488
  removed = criteria.not_in(_id: ids)
491
- if metadata.destructive?
489
+ if __metadata.destructive?
492
490
  removed.delete_all
493
491
  else
494
492
  removed.update_all(foreign_key => nil)
495
493
  end
496
494
  in_memory.each do |doc|
497
- if !ids.include?(doc.id)
495
+ if !ids.include?(doc._id)
498
496
  unbind_one(doc)
499
497
  target.delete(doc)
500
- if metadata.destructive?
498
+ if __metadata.destructive?
501
499
  doc.destroyed = true
502
500
  end
503
501
  end
@@ -571,19 +569,8 @@ module Mongoid
571
569
  )
572
570
  end
573
571
 
574
- # Eager load the relation based on the criteria.
575
- #
576
- # @example Eager load the criteria.
577
- # Proxy.eager_load(metadata, criteria)
578
- #
579
- # @param [ Metadata ] metadata The relation metadata.
580
- # @param [ Array<Object> ] ids The ids of the base docs.
581
- #
582
- # @return [ Criteria ] The criteria to eager load the relation.
583
- #
584
- # @since 2.2.0
585
- def eager_load(metadata, ids)
586
- eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_many(doc, key) }
572
+ def eager_load_klass
573
+ Relations::Eager::HasMany
587
574
  end
588
575
 
589
576
  # Returns true if the relation is an embedded one. In this case
@@ -29,7 +29,7 @@ module Mongoid
29
29
  return concat(docs) if docs.size > 1
30
30
  if doc = docs.first
31
31
  append(doc)
32
- base.add_to_set(foreign_key, doc.send(metadata.primary_key))
32
+ base.add_to_set(foreign_key => doc.send(__metadata.primary_key))
33
33
  if child_persistable?(doc)
34
34
  doc.save
35
35
  end
@@ -55,17 +55,17 @@ module Mongoid
55
55
  next unless doc
56
56
  append(doc)
57
57
  if persistable? || _creating?
58
- ids[doc.id] = true
58
+ ids[doc._id] = true
59
59
  save_or_delay(doc, docs, inserts)
60
60
  else
61
61
  existing = base.send(foreign_key)
62
- unless existing.include?(doc.id)
63
- existing.push(doc.id) and unsynced(base, foreign_key)
62
+ unless existing.include?(doc._id)
63
+ existing.push(doc._id) and unsynced(base, foreign_key)
64
64
  end
65
65
  end
66
66
  end
67
67
  if persistable? || _creating?
68
- base.push_all(foreign_key, ids.keys)
68
+ base.push(foreign_key => ids.keys)
69
69
  end
70
70
  persist_delayed(docs, inserts)
71
71
  self
@@ -77,26 +77,20 @@ module Mongoid
77
77
  # @example Build a new document on the relation.
78
78
  # person.posts.build(:title => "A new post")
79
79
  #
80
- # @overload build(attributes = {}, options = {}, type = nil)
80
+ # @overload build(attributes = {}, type = nil)
81
81
  # @param [ Hash ] attributes The attributes of the new document.
82
- # @param [ Hash ] options The scoped assignment options.
83
82
  # @param [ Class ] type The optional subclass to build.
84
83
  #
85
84
  # @overload build(attributes = {}, type = nil)
86
85
  # @param [ Hash ] attributes The attributes of the new document.
87
- # @param [ Hash ] options The scoped assignment options.
88
86
  # @param [ Class ] type The optional subclass to build.
89
87
  #
90
88
  # @return [ Document ] The new document.
91
89
  #
92
90
  # @since 2.0.0.beta.1
93
- def build(attributes = {}, options = {}, type = nil)
94
- if options.is_a? Class
95
- options, type = {}, options
96
- end
97
-
98
- doc = Factory.build(type || klass, attributes, options)
99
- base.send(foreign_key).push(doc.id)
91
+ def build(attributes = {}, type = nil)
92
+ doc = Factory.build(type || klass, attributes)
93
+ base.send(foreign_key).push(doc._id)
100
94
  append(doc)
101
95
  doc.apply_post_processed_defaults
102
96
  unsynced(doc, inverse_foreign_key)
@@ -120,7 +114,7 @@ module Mongoid
120
114
  def delete(document)
121
115
  doc = super
122
116
  if doc && persistable?
123
- base.pull(foreign_key, doc.send(metadata.primary_key))
117
+ base.pull(foreign_key => doc.send(__metadata.primary_key))
124
118
  target._unloaded = criteria
125
119
  unsynced(base, foreign_key)
126
120
  end
@@ -139,19 +133,16 @@ module Mongoid
139
133
  target.each do |doc|
140
134
  execute_callback :before_remove, doc
141
135
  end
142
- unless metadata.forced_nil_inverse?
143
- criteria.pull(inverse_foreign_key, base.id)
136
+ unless __metadata.forced_nil_inverse?
137
+ criteria.pull(inverse_foreign_key => base._id)
144
138
  end
145
139
  if persistable?
146
- base.set(
147
- foreign_key,
148
- base.send(foreign_key).clear
149
- )
140
+ base.set(foreign_key => base.send(foreign_key).clear)
150
141
  end
151
142
  after_remove_error = nil
152
143
  many_to_many = target.clear do |doc|
153
144
  unbind_one(doc)
154
- unless metadata.forced_nil_inverse?
145
+ unless __metadata.forced_nil_inverse?
155
146
  doc.changed_attributes.delete(inverse_foreign_key)
156
147
  end
157
148
  begin
@@ -230,7 +221,7 @@ module Mongoid
230
221
  #
231
222
  # @since 2.0.0.rc.1
232
223
  def binding
233
- Bindings::Referenced::ManyToMany.new(base, target, metadata)
224
+ Bindings::Referenced::ManyToMany.new(base, target, __metadata)
234
225
  end
235
226
 
236
227
  # Determine if the child document should be persisted.
@@ -247,7 +238,7 @@ module Mongoid
247
238
  # @since 3.0.20
248
239
  def child_persistable?(doc)
249
240
  (persistable? || _creating?) &&
250
- !(doc.persisted? && metadata.forced_nil_inverse?)
241
+ !(doc.persisted? && __metadata.forced_nil_inverse?)
251
242
  end
252
243
 
253
244
  # Returns the criteria object for the target class with its documents set
@@ -258,7 +249,7 @@ module Mongoid
258
249
  #
259
250
  # @return [ Criteria ] A new criteria.
260
251
  def criteria
261
- ManyToMany.criteria(metadata, base.send(foreign_key))
252
+ ManyToMany.criteria(__metadata, base.send(foreign_key))
262
253
  end
263
254
 
264
255
  # Flag the base as unsynced with respect to the foreign key.
@@ -320,22 +311,8 @@ module Mongoid
320
311
  )
321
312
  end
322
313
 
323
- # Get the criteria that is used to eager load a relation of this
324
- # type.
325
- #
326
- # @example Get the eager load criteria.
327
- # Proxy.eager_load(metadata, criteria)
328
- #
329
- # @param [ Metadata ] metadata The relation metadata.
330
- # @param [ Array<Object> ] ids The ids of the documents to load.
331
- #
332
- # @return [ Criteria ] The criteria to eager load the relation.
333
- #
334
- # @since 2.2.0
335
- def eager_load(metadata, ids)
336
- metadata.klass.any_in(_id: ids).each do |doc|
337
- IdentityMap.set(doc)
338
- end
314
+ def eager_load_klass
315
+ Relations::Eager::HasAndBelongsToMany
339
316
  end
340
317
 
341
318
  # Returns true if the relation is an embedded one. In this case
@@ -53,13 +53,13 @@ module Mongoid
53
53
  def substitute(replacement)
54
54
  unbind_one
55
55
  if persistable?
56
- if metadata.destructive?
57
- send(metadata.dependent)
56
+ if __metadata.destructive?
57
+ send(__metadata.dependent)
58
58
  else
59
59
  save if persisted?
60
60
  end
61
61
  end
62
- One.new(base, replacement, metadata) if replacement
62
+ One.new(base, replacement, __metadata) if replacement
63
63
  end
64
64
 
65
65
  private
@@ -73,7 +73,7 @@ module Mongoid
73
73
  #
74
74
  # @return [ Binding ] The binding object.
75
75
  def binding
76
- Bindings::Referenced::One.new(base, target, metadata)
76
+ Bindings::Referenced::One.new(base, target, __metadata)
77
77
  end
78
78
 
79
79
  # Are we able to persist this relation?
@@ -122,33 +122,14 @@ module Mongoid
122
122
  # @since 2.1.0
123
123
  def criteria(metadata, object, type = nil)
124
124
  crit = metadata.klass.where(metadata.foreign_key => object)
125
-
126
125
  if metadata.polymorphic?
127
126
  crit = crit.where(metadata.type => type.name)
128
127
  end
129
-
130
- inverse_metadata = metadata.inverse_metadata(metadata.klass)
131
- if inverse_metadata.inverse_of_field
132
- crit = crit.any_in(inverse_metadata.inverse_of_field => [metadata.name, nil])
133
- end
134
-
135
128
  crit
136
129
  end
137
130
 
138
- # Get the criteria that is used to eager load a relation of this
139
- # type.
140
- #
141
- # @example Get the eager load criteria.
142
- # Proxy.eager_load(metadata, criteria)
143
- #
144
- # @param [ Metadata ] metadata The relation metadata.
145
- # @param [ Array<Object> ] ids The ids of the base docs.
146
- #
147
- # @return [ Criteria ] The criteria to eager load the relation.
148
- #
149
- # @since 2.2.0
150
- def eager_load(metadata, ids)
151
- eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_one(doc, key) }
131
+ def eager_load_klass
132
+ Relations::Eager::HasOne
152
133
  end
153
134
 
154
135
  # Returns true if the relation is an embedded one. In this case
@@ -61,7 +61,7 @@ module Mongoid
61
61
  def remove_inverse_keys(meta)
62
62
  foreign_keys = send(meta.foreign_key)
63
63
  unless foreign_keys.nil? || foreign_keys.empty?
64
- meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key, id)
64
+ meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key => _id)
65
65
  end
66
66
  end
67
67
 
@@ -87,15 +87,15 @@ module Mongoid
87
87
  # had occurred.
88
88
  if meta.autosave?
89
89
  send(meta.name).in_memory.each do |doc|
90
- adds.delete_one(doc.id)
90
+ adds.delete_one(doc._id)
91
91
  end
92
92
  end
93
93
 
94
94
  unless adds.empty?
95
- meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key, id)
95
+ meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key => _id)
96
96
  end
97
97
  unless subs.empty?
98
- meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key, id)
98
+ meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key => _id)
99
99
  end
100
100
  end
101
101
  end
@@ -59,7 +59,7 @@ module Mongoid
59
59
  #
60
60
  # @since 2.1.0
61
61
  def <<(document)
62
- _added[document.id] = document
62
+ _added[document._id] = document
63
63
  self
64
64
  end
65
65
  alias :push :<<
@@ -110,9 +110,9 @@ module Mongoid
110
110
  #
111
111
  # @since 2.1.0
112
112
  def delete(document)
113
- doc = (_loaded.delete(document.id) || _added.delete(document.id))
113
+ doc = (_loaded.delete(document._id) || _added.delete(document._id))
114
114
  unless doc
115
- if _unloaded && _unloaded.where(_id: document.id).exists?
115
+ if _unloaded && _unloaded.where(_id: document._id).exists?
116
116
  yield(document) if block_given?
117
117
  return document
118
118
  end
@@ -128,7 +128,7 @@ module Mongoid
128
128
  #
129
129
  # @example Delete all matching documents.
130
130
  # enumerable.delete_if do |doc|
131
- # dod.id == id
131
+ # dod._id == _id
132
132
  # end
133
133
  #
134
134
  # @return [ Array<Document> ] The remaining docs.
@@ -138,8 +138,8 @@ module Mongoid
138
138
  load_all!
139
139
  deleted = in_memory.select(&block)
140
140
  deleted.each do |doc|
141
- _loaded.delete(doc.id)
142
- _added.delete(doc.id)
141
+ _loaded.delete(doc._id)
142
+ _added.delete(doc._id)
143
143
  end
144
144
  self
145
145
  end
@@ -179,8 +179,8 @@ module Mongoid
179
179
  end
180
180
  else
181
181
  unloaded_documents.each do |doc|
182
- document = _added.delete(doc.id) || _loaded.delete(doc.id) || doc
183
- _loaded[document.id] = document
182
+ document = _added.delete(doc._id) || _loaded.delete(doc._id) || doc
183
+ _loaded[document._id] = document
184
184
  yield(document)
185
185
  end
186
186
  end
@@ -237,7 +237,7 @@ module Mongoid
237
237
  else
238
238
  @_added, @executed = {}, true
239
239
  @_loaded = target.inject({}) do |_target, doc|
240
- _target[doc.id] = doc
240
+ _target[doc._id] = doc
241
241
  _target
242
242
  end
243
243
  end
@@ -255,7 +255,7 @@ module Mongoid
255
255
  # @since 3.0.0
256
256
  def include?(doc)
257
257
  return super unless _unloaded
258
- _unloaded.where(_id: doc.id).exists? || _added.has_key?(doc.id)
258
+ _unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
259
259
  end
260
260
 
261
261
  # Inspection will just inspect the entries for nice array-style
@@ -4,6 +4,39 @@ module Mongoid
4
4
  module Touchable
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ # Touch the document, in effect updating its updated_at timestamp and
8
+ # optionally the provided field to the current time. If any belongs_to
9
+ # relations exist with a touch option, they will be updated as well.
10
+ #
11
+ # @example Update the updated_at timestamp.
12
+ # document.touch
13
+ #
14
+ # @example Update the updated_at and provided timestamps.
15
+ # document.touch(:audited)
16
+ #
17
+ # @note This will not autobuild relations if those options are set.
18
+ #
19
+ # @param [ Symbol ] field The name of an additional field to update.
20
+ #
21
+ # @return [ true/false ] false if record is new_record otherwise true.
22
+ #
23
+ # @since 3.0.0
24
+ def touch(field = nil)
25
+ return false if _root.new_record?
26
+ current = Time.now
27
+ field = database_field_name(field)
28
+ write_attribute(:updated_at, current) if respond_to?("updated_at=")
29
+ write_attribute(field, current) if field
30
+
31
+ touches = touch_atomic_updates(field)
32
+ unless touches.empty?
33
+ selector = atomic_selector
34
+ _root.collection.where(selector).update(positionally(selector, touches))
35
+ end
36
+ run_callbacks(:touch)
37
+ true
38
+ end
39
+
7
40
  module ClassMethods
8
41
 
9
42
  # Add the metadata to the touchable relations if the touch option was
@@ -21,7 +54,7 @@ module Mongoid
21
54
  if metadata.touchable?
22
55
  name = metadata.name
23
56
  method_name = define_relation_touch_method(name)
24
- after_create method_name
57
+ after_save method_name
25
58
  after_destroy method_name
26
59
  after_touch method_name
27
60
  end
@@ -46,7 +46,8 @@ module Mongoid
46
46
  include Touchable
47
47
  include CounterCache
48
48
 
49
- attr_accessor :metadata
49
+ attr_accessor :__metadata
50
+ alias :relation_metadata :__metadata
50
51
 
51
52
  # Determine if the document itself is embedded in another document via the
52
53
  # proper channels. (If it has a parent document.)
@@ -70,7 +71,7 @@ module Mongoid
70
71
  #
71
72
  # @since 2.0.0.rc.1
72
73
  def embedded_many?
73
- metadata && metadata.macro == :embeds_many
74
+ __metadata && __metadata.macro == :embeds_many
74
75
  end
75
76
 
76
77
  # Determine if the document is part of an embeds_one relation.
@@ -82,7 +83,7 @@ module Mongoid
82
83
  #
83
84
  # @since 2.0.0.rc.1
84
85
  def embedded_one?
85
- metadata && metadata.macro == :embeds_one
86
+ __metadata && __metadata.macro == :embeds_one
86
87
  end
87
88
 
88
89
  # Get the metadata name for this document. If no metadata was defined
@@ -97,8 +98,8 @@ module Mongoid
97
98
  #
98
99
  # @since 3.0.0
99
100
  def metadata_name
100
- raise Errors::NoMetadata.new(self.class.name) unless metadata
101
- metadata.name
101
+ raise Errors::NoMetadata.new(self.class.name) unless __metadata
102
+ __metadata.name
102
103
  end
103
104
 
104
105
  # Determine if the document is part of an references_many relation.
@@ -110,7 +111,7 @@ module Mongoid
110
111
  #
111
112
  # @since 2.0.0.rc.1
112
113
  def referenced_many?
113
- metadata && metadata.macro == :has_many
114
+ __metadata && __metadata.macro == :has_many
114
115
  end
115
116
 
116
117
  # Determine if the document is part of an references_one relation.
@@ -122,7 +123,7 @@ module Mongoid
122
123
  #
123
124
  # @since 2.0.0.rc.1
124
125
  def referenced_one?
125
- metadata && metadata.macro == :has_one
126
+ __metadata && __metadata.macro == :has_one
126
127
  end
127
128
 
128
129
  # Convenience method for iterating through the loaded relations and
@@ -136,27 +137,12 @@ module Mongoid
136
137
  # @since 2.1.6
137
138
  def reload_relations
138
139
  relations.each_pair do |name, meta|
139
- if instance_variable_defined?("@#{name}")
140
- if _parent.nil? || instance_variable_get("@#{name}") != _parent
141
- remove_instance_variable("@#{name}")
140
+ if instance_variable_defined?("@_#{name}")
141
+ if _parent.nil? || instance_variable_get("@_#{name}") != _parent
142
+ remove_instance_variable("@_#{name}")
142
143
  end
143
144
  end
144
145
  end
145
146
  end
146
-
147
- module ClassMethods
148
-
149
- # This is convenience for librarys still on the old API.
150
- #
151
- # @example Get the associations.
152
- # Person.associations
153
- #
154
- # @return [ Hash ] The relations.
155
- #
156
- # @since 2.3.1
157
- def associations
158
- self.relations
159
- end
160
- end
161
147
  end
162
148
  end
@@ -1,7 +1,10 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
+
3
4
  # This module handles reloading behaviour of documents.
4
- module Reloading
5
+ #
6
+ # @since 4.0.0
7
+ module Reloadable
5
8
 
6
9
  # Reloads the +Document+ attributes from the database. If the document has
7
10
  # not been saved then an error will get raised if the configuration option
@@ -18,14 +21,13 @@ module Mongoid
18
21
  def reload
19
22
  reloaded = _reload
20
23
  if Mongoid.raise_not_found_error && reloaded.empty?
21
- raise Errors::DocumentNotFound.new(self.class, id, id)
24
+ raise Errors::DocumentNotFound.new(self.class, _id, _id)
22
25
  end
23
26
  @attributes = reloaded
24
27
  @attributes_before_type_cast = {}
25
28
  changed_attributes.clear
26
29
  apply_defaults
27
30
  reload_relations
28
- IdentityMap.set(self)
29
31
  run_callbacks(:find) unless _find_callbacks.empty?
30
32
  run_callbacks(:initialize) unless _initialize_callbacks.empty?
31
33
  self
@@ -55,7 +57,7 @@ module Mongoid
55
57
  #
56
58
  # @since 2.3.2
57
59
  def reload_root_document
58
- {}.merge(with(consistency: :strong).collection.find(_id: id).one || {})
60
+ {}.merge(with(read: :primary).collection.find(_id: _id).one || {})
59
61
  end
60
62
 
61
63
  # Reload the embedded document.
@@ -68,7 +70,7 @@ module Mongoid
68
70
  # @since 2.3.2
69
71
  def reload_embedded_document
70
72
  extract_embedded_attributes({}.merge(
71
- _root.with(consistency: :strong).collection.find(_id: _root.id).one
73
+ _root.with(read: :primary).collection.find(_id: _root._id).one
72
74
  ))
73
75
  end
74
76