mongoid 3.1.6 → 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 (571) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +479 -8
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid.rb +10 -76
  6. data/lib/mongoid/atomic.rb +3 -14
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  9. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  10. data/lib/mongoid/atomic/paths/root.rb +0 -13
  11. data/lib/mongoid/attributes.rb +65 -101
  12. data/lib/mongoid/attributes/dynamic.rb +154 -0
  13. data/lib/mongoid/attributes/nested.rb +82 -0
  14. data/lib/mongoid/attributes/processing.rb +13 -66
  15. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  16. data/lib/mongoid/composable.rb +105 -0
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/config/options.rb +1 -1
  19. data/lib/mongoid/contextual.rb +2 -0
  20. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  21. data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
  22. data/lib/mongoid/contextual/atomic.rb +53 -53
  23. data/lib/mongoid/contextual/geo_near.rb +1 -1
  24. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  25. data/lib/mongoid/contextual/memory.rb +23 -11
  26. data/lib/mongoid/contextual/mongo.rb +75 -57
  27. data/lib/mongoid/contextual/none.rb +90 -0
  28. data/lib/mongoid/contextual/text_search.rb +178 -0
  29. data/lib/mongoid/copyable.rb +2 -3
  30. data/lib/mongoid/criteria.rb +39 -34
  31. data/lib/mongoid/criteria/#findable.rb# +141 -0
  32. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  33. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  34. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  35. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  36. data/lib/mongoid/criteria/permission.rb +70 -0
  37. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  38. data/lib/mongoid/document.rb +39 -24
  39. data/lib/mongoid/errors.rb +4 -1
  40. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  41. data/lib/mongoid/errors/document_not_found.rb +2 -1
  42. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  43. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  44. data/lib/mongoid/errors/invalid_value.rb +16 -0
  45. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  46. data/lib/mongoid/errors/readonly_document.rb +24 -0
  47. data/lib/mongoid/extensions.rb +15 -7
  48. data/lib/mongoid/extensions/array.rb +3 -3
  49. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  50. data/lib/mongoid/extensions/boolean.rb +15 -17
  51. data/lib/mongoid/extensions/date.rb +1 -1
  52. data/lib/mongoid/extensions/date_time.rb +3 -3
  53. data/lib/mongoid/extensions/float.rb +2 -1
  54. data/lib/mongoid/extensions/hash.rb +3 -3
  55. data/lib/mongoid/extensions/integer.rb +1 -1
  56. data/lib/mongoid/extensions/object.rb +7 -7
  57. data/lib/mongoid/extensions/object_id.rb +5 -5
  58. data/lib/mongoid/extensions/range.rb +9 -3
  59. data/lib/mongoid/extensions/regexp.rb +1 -1
  60. data/lib/mongoid/extensions/set.rb +1 -1
  61. data/lib/mongoid/extensions/string.rb +6 -18
  62. data/lib/mongoid/extensions/symbol.rb +1 -1
  63. data/lib/mongoid/extensions/time.rb +3 -3
  64. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  65. data/lib/mongoid/factory.rb +8 -6
  66. data/lib/mongoid/fields.rb +41 -8
  67. data/lib/mongoid/fields/foreign_key.rb +3 -3
  68. data/lib/mongoid/fields/localized.rb +1 -1
  69. data/lib/mongoid/fields/standard.rb +5 -17
  70. data/lib/mongoid/fields/validators/macro.rb +15 -5
  71. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/indexable/specification.rb +104 -0
  74. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  75. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  76. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  77. data/lib/mongoid/log_subscriber.rb +55 -0
  78. data/lib/mongoid/matchable.rb +152 -0
  79. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  81. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  86. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  87. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  88. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  89. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  90. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  91. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  92. data/lib/mongoid/persistable.rb +216 -0
  93. data/lib/mongoid/persistable/creatable.rb +189 -0
  94. data/lib/mongoid/persistable/deletable.rb +149 -0
  95. data/lib/mongoid/persistable/destroyable.rb +60 -0
  96. data/lib/mongoid/persistable/incrementable.rb +36 -0
  97. data/lib/mongoid/persistable/logical.rb +38 -0
  98. data/lib/mongoid/persistable/poppable.rb +39 -0
  99. data/lib/mongoid/persistable/pullable.rb +55 -0
  100. data/lib/mongoid/persistable/pushable.rb +62 -0
  101. data/lib/mongoid/persistable/renamable.rb +35 -0
  102. data/lib/mongoid/persistable/savable.rb +52 -0
  103. data/lib/mongoid/persistable/settable.rb +33 -0
  104. data/lib/mongoid/persistable/unsettable.rb +36 -0
  105. data/lib/mongoid/persistable/updatable.rb +153 -0
  106. data/lib/mongoid/persistable/upsertable.rb +55 -0
  107. data/lib/mongoid/positional.rb +71 -0
  108. data/lib/mongoid/query_cache.rb +255 -0
  109. data/lib/mongoid/railtie.rb +34 -60
  110. data/lib/mongoid/railties/database.rake +9 -25
  111. data/lib/mongoid/relations.rb +11 -25
  112. data/lib/mongoid/relations/accessors.rb +15 -51
  113. data/lib/mongoid/relations/auto_save.rb +15 -36
  114. data/lib/mongoid/relations/binding.rb +2 -25
  115. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  116. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  117. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  118. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  119. data/lib/mongoid/relations/builder.rb +1 -1
  120. data/lib/mongoid/relations/builders.rb +2 -2
  121. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  122. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  123. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  124. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  125. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  126. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  127. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  128. data/lib/mongoid/relations/cascading.rb +3 -5
  129. data/lib/mongoid/relations/constraint.rb +1 -1
  130. data/lib/mongoid/relations/conversions.rb +1 -1
  131. data/lib/mongoid/relations/counter_cache.rb +39 -15
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/eager/base.rb +149 -0
  134. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  135. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  136. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  137. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  138. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  139. data/lib/mongoid/relations/embedded/in.rb +4 -4
  140. data/lib/mongoid/relations/embedded/many.rb +14 -32
  141. data/lib/mongoid/relations/embedded/one.rb +1 -1
  142. data/lib/mongoid/relations/macros.rb +3 -4
  143. data/lib/mongoid/relations/many.rb +51 -31
  144. data/lib/mongoid/relations/marshalable.rb +3 -3
  145. data/lib/mongoid/relations/metadata.rb +14 -79
  146. data/lib/mongoid/relations/nested_builder.rb +2 -2
  147. data/lib/mongoid/relations/one.rb +1 -1
  148. data/lib/mongoid/relations/options.rb +1 -0
  149. data/lib/mongoid/relations/polymorphic.rb +0 -1
  150. data/lib/mongoid/relations/proxy.rb +21 -41
  151. data/lib/mongoid/relations/referenced/in.rb +4 -20
  152. data/lib/mongoid/relations/referenced/many.rb +22 -35
  153. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  154. data/lib/mongoid/relations/referenced/one.rb +6 -25
  155. data/lib/mongoid/relations/synchronization.rb +4 -4
  156. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  157. data/lib/mongoid/relations/touchable.rb +34 -1
  158. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  159. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  160. data/lib/mongoid/selectable.rb +59 -0
  161. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  162. data/lib/mongoid/sessions.rb +37 -345
  163. data/lib/mongoid/sessions/factory.rb +2 -0
  164. data/lib/mongoid/sessions/options.rb +185 -0
  165. data/lib/mongoid/sessions/storage_options.rb +140 -0
  166. data/lib/mongoid/sessions/thread_options.rb +19 -0
  167. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  168. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  169. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  170. data/lib/mongoid/support/query_counter.rb +23 -0
  171. data/lib/mongoid/tasks/database.rake +31 -0
  172. data/lib/mongoid/tasks/database.rb +107 -0
  173. data/lib/mongoid/threaded.rb +26 -172
  174. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  175. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  176. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  177. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  178. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  179. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  180. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  182. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  183. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  184. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  185. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  186. data/lib/mongoid/version.rb +1 -1
  187. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  188. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  189. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  190. data/lib/rails/generators/mongoid_generator.rb +3 -40
  191. data/lib/rails/mongoid.rb +0 -122
  192. data/lib/support/ruby_version.rb +1 -1
  193. data/spec/app/models/account.rb +2 -6
  194. data/spec/app/models/acolyte.rb +2 -1
  195. data/spec/app/models/actor.rb +0 -1
  196. data/spec/app/models/address.rb +8 -3
  197. data/spec/app/models/animal.rb +1 -1
  198. data/spec/app/models/appointment.rb +3 -3
  199. data/spec/app/models/article.rb +1 -4
  200. data/spec/app/models/audio.rb +5 -0
  201. data/spec/app/models/author.rb +0 -2
  202. data/spec/app/models/band.rb +3 -2
  203. data/spec/app/models/bar.rb +1 -0
  204. data/spec/app/models/book.rb +1 -0
  205. data/spec/app/models/building.rb +0 -2
  206. data/spec/app/models/building_address.rb +0 -2
  207. data/spec/app/models/bus.rb +1 -1
  208. data/spec/app/models/canvas.rb +1 -1
  209. data/spec/app/models/contextable_item.rb +5 -0
  210. data/spec/app/models/contractor.rb +0 -2
  211. data/spec/app/models/country_code.rb +1 -1
  212. data/spec/app/models/definition.rb +2 -2
  213. data/spec/app/models/dog.rb +1 -1
  214. data/spec/app/models/draft.rb +9 -0
  215. data/spec/app/models/dragon.rb +4 -0
  216. data/spec/app/models/drug.rb +1 -3
  217. data/spec/app/models/dungeon.rb +4 -0
  218. data/spec/app/models/edit.rb +5 -0
  219. data/spec/app/models/even.rb +7 -0
  220. data/spec/app/models/event.rb +1 -1
  221. data/spec/app/models/filesystem.rb +1 -0
  222. data/spec/app/models/fish.rb +0 -1
  223. data/spec/app/models/fruits.rb +6 -0
  224. data/spec/app/models/game.rb +0 -2
  225. data/spec/app/models/house.rb +1 -3
  226. data/spec/app/models/id_key.rb +6 -0
  227. data/spec/app/models/item.rb +1 -5
  228. data/spec/app/models/jar.rb +1 -1
  229. data/spec/app/models/label.rb +4 -4
  230. data/spec/app/models/line_item.rb +1 -1
  231. data/spec/app/models/login.rb +1 -1
  232. data/spec/app/models/message.rb +8 -0
  233. data/spec/app/models/movie.rb +1 -0
  234. data/spec/app/models/name.rb +3 -3
  235. data/spec/app/models/note.rb +3 -1
  236. data/spec/app/models/odd.rb +7 -0
  237. data/spec/app/models/oscar.rb +1 -1
  238. data/spec/app/models/parent_doc.rb +1 -1
  239. data/spec/app/models/person.rb +16 -10
  240. data/spec/app/models/phone.rb +1 -3
  241. data/spec/app/models/player.rb +3 -3
  242. data/spec/app/models/post.rb +5 -3
  243. data/spec/app/models/preference.rb +1 -1
  244. data/spec/app/models/quiz.rb +0 -3
  245. data/spec/app/models/record.rb +10 -5
  246. data/spec/app/models/registry.rb +1 -1
  247. data/spec/app/models/server.rb +1 -1
  248. data/spec/app/models/service.rb +3 -3
  249. data/spec/app/models/sound.rb +5 -0
  250. data/spec/app/models/symptom.rb +1 -1
  251. data/spec/app/models/template.rb +1 -1
  252. data/spec/app/models/title.rb +0 -1
  253. data/spec/app/models/track.rb +5 -5
  254. data/spec/app/models/tree.rb +3 -3
  255. data/spec/app/models/video.rb +1 -5
  256. data/spec/app/models/wiki_page.rb +2 -5
  257. data/spec/app/models/word.rb +3 -0
  258. data/spec/app/models/word_origin.rb +1 -1
  259. data/spec/config/mongoid.yml +7 -8
  260. data/spec/helpers.rb +18 -0
  261. data/spec/mongoid/#atomic_spec.rb# +365 -0
  262. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  263. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  264. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  265. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  266. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  267. data/spec/mongoid/atomic_spec.rb +19 -19
  268. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  269. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  270. data/spec/mongoid/attributes_spec.rb +349 -434
  271. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  272. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  273. data/spec/mongoid/config/environment_spec.rb +3 -3
  274. data/spec/mongoid/config/options_spec.rb +6 -6
  275. data/spec/mongoid/config_spec.rb +24 -48
  276. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  277. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  278. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  279. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  280. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  281. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  282. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  283. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  284. data/spec/mongoid/contextual/none_spec.rb +127 -0
  285. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  286. data/spec/mongoid/copyable_spec.rb +56 -68
  287. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  288. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  289. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  290. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  291. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  292. data/spec/mongoid/criteria_spec.rb +715 -2421
  293. data/spec/mongoid/document_spec.rb +171 -121
  294. data/spec/mongoid/equality_spec.rb +22 -22
  295. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  296. data/spec/mongoid/errors/callback_spec.rb +3 -3
  297. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  298. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  299. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  300. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  308. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  311. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  312. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  313. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  314. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  315. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  316. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  317. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  318. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  325. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  326. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  327. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  328. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  329. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  330. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  331. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  332. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  333. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  334. data/spec/mongoid/errors/validations_spec.rb +7 -7
  335. data/spec/mongoid/extensions/array_spec.rb +61 -61
  336. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  337. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  338. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  339. data/spec/mongoid/extensions/date_spec.rb +13 -13
  340. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  341. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  342. data/spec/mongoid/extensions/float_spec.rb +29 -15
  343. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  344. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  345. data/spec/mongoid/extensions/module_spec.rb +2 -2
  346. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  347. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  348. data/spec/mongoid/extensions/object_spec.rb +26 -26
  349. data/spec/mongoid/extensions/range_spec.rb +61 -12
  350. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  351. data/spec/mongoid/extensions/set_spec.rb +4 -4
  352. data/spec/mongoid/extensions/string_spec.rb +35 -46
  353. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  354. data/spec/mongoid/extensions/time_spec.rb +49 -49
  355. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  356. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  357. data/spec/mongoid/extensions_spec.rb +29 -0
  358. data/spec/mongoid/factory_spec.rb +15 -15
  359. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  360. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  361. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  362. data/spec/mongoid/fields/localized_spec.rb +38 -23
  363. data/spec/mongoid/fields/standard_spec.rb +12 -12
  364. data/spec/mongoid/fields_spec.rb +263 -217
  365. data/spec/mongoid/findable_spec.rb +509 -0
  366. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  367. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  368. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  369. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  370. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  371. data/spec/mongoid/loggable_spec.rb +1 -1
  372. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  373. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  374. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  375. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  376. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  377. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  378. data/spec/mongoid/matchable/in_spec.rb +49 -0
  379. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  380. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  381. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  382. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  383. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  384. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  385. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  386. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  387. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  388. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  389. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  390. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  391. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  392. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  393. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  394. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  395. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  396. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  397. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  398. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  399. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  400. data/spec/mongoid/persistable_spec.rb +206 -0
  401. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
  402. data/spec/mongoid/query_cache_spec.rb +263 -0
  403. data/spec/mongoid/railties/document_spec.rb +2 -2
  404. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  405. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  406. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  407. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  408. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  409. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  410. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  411. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  412. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  413. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  414. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  415. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  416. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  417. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  418. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  419. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  420. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  421. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  422. data/spec/mongoid/relations/builders_spec.rb +21 -21
  423. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  424. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  425. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  426. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  427. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  428. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  429. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  430. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  431. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  432. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  433. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  434. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  435. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  436. data/spec/mongoid/relations/eager_spec.rb +228 -0
  437. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  438. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  439. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  440. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  441. data/spec/mongoid/relations/macros_spec.rb +108 -102
  442. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  443. data/spec/mongoid/relations/options_spec.rb +1 -1
  444. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  445. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  446. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  447. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  448. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  449. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  450. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  451. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  452. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  453. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  454. data/spec/mongoid/relations_spec.rb +16 -15
  455. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  456. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  457. data/spec/mongoid/selectable_spec.rb +134 -0
  458. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  459. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  460. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  461. data/spec/mongoid/sessions/options_spec.rb +108 -0
  462. data/spec/mongoid/sessions_spec.rb +319 -178
  463. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  464. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  465. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  466. data/spec/mongoid/tasks/database_spec.rb +160 -0
  467. data/spec/mongoid/threaded_spec.rb +17 -70
  468. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  469. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  470. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  471. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  472. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  473. data/spec/mongoid/timestamps_spec.rb +9 -13
  474. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  475. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  476. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  477. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  478. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  479. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  480. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  481. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  482. data/spec/mongoid_spec.rb +8 -8
  483. data/spec/rails/mongoid_spec.rb +19 -335
  484. data/spec/spec_helper.rb +31 -13
  485. metadata +303 -283
  486. data/lib/mongoid/atomic/positionable.rb +0 -73
  487. data/lib/mongoid/components.rb +0 -92
  488. data/lib/mongoid/config/inflections.rb +0 -6
  489. data/lib/mongoid/contextual/eager.rb +0 -158
  490. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  491. data/lib/mongoid/identity_map.rb +0 -163
  492. data/lib/mongoid/json.rb +0 -16
  493. data/lib/mongoid/matchers.rb +0 -32
  494. data/lib/mongoid/matchers/strategies.rb +0 -97
  495. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  496. data/lib/mongoid/nested_attributes.rb +0 -78
  497. data/lib/mongoid/observer.rb +0 -192
  498. data/lib/mongoid/paranoia.rb +0 -136
  499. data/lib/mongoid/persistence.rb +0 -357
  500. data/lib/mongoid/persistence/atomic.rb +0 -231
  501. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  502. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  503. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  504. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  505. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  506. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  507. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  508. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  509. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  510. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  511. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  512. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  513. data/lib/mongoid/persistence/deletion.rb +0 -31
  514. data/lib/mongoid/persistence/insertion.rb +0 -38
  515. data/lib/mongoid/persistence/modification.rb +0 -35
  516. data/lib/mongoid/persistence/operations.rb +0 -214
  517. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  518. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  519. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  520. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  521. data/lib/mongoid/persistence/operations/update.rb +0 -59
  522. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  523. data/lib/mongoid/persistence/upsertion.rb +0 -31
  524. data/lib/mongoid/unit_of_work.rb +0 -61
  525. data/lib/mongoid/versioning.rb +0 -217
  526. data/lib/rack/mongoid.rb +0 -2
  527. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  528. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  529. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  530. data/spec/app/models/actor_observer.rb +0 -15
  531. data/spec/app/models/callback_recorder.rb +0 -25
  532. data/spec/app/models/paranoid_phone.rb +0 -25
  533. data/spec/app/models/paranoid_post.rb +0 -36
  534. data/spec/app/models/phone_observer.rb +0 -6
  535. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  536. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  537. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  538. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  539. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  540. data/spec/mongoid/finders_spec.rb +0 -321
  541. data/spec/mongoid/identity_map_spec.rb +0 -564
  542. data/spec/mongoid/json_spec.rb +0 -33
  543. data/spec/mongoid/matchers/in_spec.rb +0 -25
  544. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  545. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  546. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  547. data/spec/mongoid/observer_spec.rb +0 -290
  548. data/spec/mongoid/paranoia_spec.rb +0 -759
  549. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  550. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  551. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  552. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  553. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  554. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  555. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  556. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  557. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  558. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  559. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  560. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  561. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  562. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  563. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  564. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  565. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  566. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  567. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  568. data/spec/mongoid/persistence_spec.rb +0 -2279
  569. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  570. data/spec/mongoid/versioning_spec.rb +0 -540
  571. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -91,7 +91,7 @@ module Mongoid
91
91
  # @api private
92
92
  #
93
93
  # @example Bind the foreign key.
94
- # binding.bind_foreign_key(post, person.id)
94
+ # binding.bind_foreign_key(post, person._id)
95
95
  #
96
96
  # @param [ Document ] keyed The document that stores the foreign key.
97
97
  # @param [ Object ] id The id of the bound document.
@@ -157,27 +157,6 @@ module Mongoid
157
157
  end
158
158
  end
159
159
 
160
- # Bind the inverse of field, when in a polymorphic relation.
161
- #
162
- # @api private
163
- #
164
- # @example Bind the inverse of field.
165
- # binding.bind_inverse_of_field(doc)
166
- #
167
- # @param [ Document ] doc The document to bind.
168
- # @param [ String ] name The name of the relation.
169
- #
170
- # @since 3.0.0
171
- def bind_inverse_of_field(doc, name)
172
- if metadata.inverse_field_bindable?
173
- if inverse_metadata = metadata.inverse_metadata(doc)
174
- if setter = inverse_metadata.inverse_of_field_setter
175
- doc.you_must(setter, name)
176
- end
177
- end
178
- end
179
- end
180
-
181
160
  # Bind the provided document with the base from the parent relation.
182
161
  #
183
162
  # @api private
@@ -193,7 +172,6 @@ module Mongoid
193
172
  bind_foreign_key(doc, record_id(base))
194
173
  bind_polymorphic_type(doc, base.class.name)
195
174
  bind_inverse(doc, base)
196
- bind_inverse_of_field(doc, metadata.name)
197
175
  end
198
176
 
199
177
  def record_id(base)
@@ -215,7 +193,7 @@ module Mongoid
215
193
  def set_base_metadata
216
194
  inverse_metadata = metadata.inverse_metadata(target)
217
195
  if inverse_metadata != metadata && !inverse_metadata.nil?
218
- base.metadata = inverse_metadata
196
+ base.__metadata = inverse_metadata
219
197
  end
220
198
  end
221
199
 
@@ -234,7 +212,6 @@ module Mongoid
234
212
  bind_foreign_key(doc, nil)
235
213
  bind_polymorphic_type(doc, nil)
236
214
  bind_inverse(doc, nil)
237
- bind_inverse_of_field(doc, nil)
238
215
  end
239
216
  end
240
217
  end
@@ -24,7 +24,7 @@ module Mongoid
24
24
  #
25
25
  # @since 2.0.0.rc.1
26
26
  def bind_one
27
- base.metadata = metadata.inverse_metadata(target) unless base.metadata
27
+ base.__metadata = metadata.inverse_metadata(target) unless base.__metadata
28
28
  base.parentize(target)
29
29
  binding do
30
30
  if base.embedded_many?
@@ -23,9 +23,7 @@ module Mongoid
23
23
  def bind_one(doc)
24
24
  doc.parentize(base)
25
25
  binding do
26
- unless metadata.versioned?
27
- doc.do_or_do_not(metadata.inverse_setter(target), base)
28
- end
26
+ doc.do_or_do_not(metadata.inverse_setter(target), base)
29
27
  end
30
28
  end
31
29
 
@@ -25,11 +25,10 @@ module Mongoid
25
25
  bind_polymorphic_inverse_type(base, target.class.name)
26
26
  if inverse = metadata.inverse(target)
27
27
  if set_base_metadata
28
- bind_inverse_of_field(base, base.metadata_name)
29
28
  if base.referenced_many?
30
- target.__send__(inverse).push(base) unless Mongoid.using_identity_map?
29
+ target.__send__(inverse).push(base)
31
30
  else
32
- target.do_or_do_not(metadata.inverse_setter(target), base)
31
+ target.set_relation(inverse, base)
33
32
  end
34
33
  end
35
34
  end
@@ -47,18 +46,14 @@ module Mongoid
47
46
  def unbind_one
48
47
  binding do
49
48
  inverse = metadata.inverse(target)
50
- if !inverse && metadata.inverse_of_field
51
- inverse = base.__send__(metadata.inverse_of_field)
52
- end
53
49
  bind_foreign_key(base, nil)
54
50
  bind_polymorphic_inverse_type(base, nil)
55
- bind_inverse_of_field(base, nil)
56
51
  if inverse
57
52
  set_base_metadata
58
53
  if base.referenced_many?
59
54
  target.__send__(inverse).delete(base)
60
55
  else
61
- target.__send__("#{inverse}=", nil)
56
+ target.set_relation(inverse, nil)
62
57
  end
63
58
  end
64
59
  end
@@ -20,7 +20,9 @@ module Mongoid
20
20
  binding do
21
21
  inverse_keys = doc.you_must(metadata.inverse_foreign_key)
22
22
  if inverse_keys
23
- inverse_keys.push(inverse_record_id(doc))
23
+ unless inverse_keys.include?(inverse_record_id(doc))
24
+ inverse_keys.push(inverse_record_id(doc))
25
+ end
24
26
  doc.reset_relation_criteria(metadata.inverse)
25
27
  end
26
28
  base.synced[metadata.foreign_key] = true
@@ -53,7 +55,7 @@ module Mongoid
53
55
  if inverse_metadata
54
56
  base.__send__(inverse_metadata.primary_key)
55
57
  else
56
- base.id
58
+ base._id
57
59
  end
58
60
  end
59
61
 
@@ -17,7 +17,7 @@ module Mongoid
17
17
  #
18
18
  # @param [ Document ] base The base document.
19
19
  # @param [ Metdata ] metadata The metadata for the relation.
20
- # @param [ Hash, Moped::BSON::ObjectId ] object The attributes to build from or
20
+ # @param [ Hash, BSON::ObjectId ] object The attributes to build from or
21
21
  # id to query with.
22
22
  #
23
23
  # @since 2.0.0.rc.1
@@ -65,7 +65,7 @@ module Mongoid
65
65
  def builder(name, metadata)
66
66
  re_define_method("build_#{name}") do |*args|
67
67
  attributes, options = parse_args(*args)
68
- document = Factory.build(metadata.klass, attributes, options)
68
+ document = Factory.build(metadata.klass, attributes)
69
69
  _building do
70
70
  child = send("#{name}=", document)
71
71
  child.run_callbacks(:build)
@@ -90,7 +90,7 @@ module Mongoid
90
90
  def creator(name, metadata)
91
91
  re_define_method("create_#{name}") do |*args|
92
92
  attributes, options = parse_args(*args)
93
- document = Factory.build(metadata.klass, attributes, options)
93
+ document = Factory.build(metadata.klass, attributes)
94
94
  doc = send("#{name}=", document)
95
95
  doc.save
96
96
  save if new_record? && metadata.stores_foreign_key?
@@ -15,7 +15,7 @@ module Mongoid
15
15
  # @param [ String ] type Not used in this context.
16
16
  #
17
17
  # @return [ Document ] A single document.
18
- def build(type = nil)
18
+ def build(_type = nil)
19
19
  return object unless object.is_a?(Hash)
20
20
  if _loading? && base.persisted?
21
21
  Factory.from_db(klass, object)
@@ -16,7 +16,6 @@ module Mongoid
16
16
  # many.build(person)
17
17
  #
18
18
  # @param [ Document ] parent The parent document of the relation.
19
- # @param [ Hash ] options The mass assignment options.
20
19
  #
21
20
  # @return [ Array ] The attributes.
22
21
  def build(parent, options = {})
@@ -25,10 +24,10 @@ module Mongoid
25
24
  raise Errors::TooManyNestedAttributeRecords.new(existing, options[:limit])
26
25
  end
27
26
  attributes.each do |attrs|
28
- if attrs.respond_to?(:with_indifferent_access)
29
- process_attributes(parent, attrs.with_indifferent_access, options)
27
+ if attrs.is_a?(::Hash)
28
+ process_attributes(parent, attrs.with_indifferent_access)
30
29
  else
31
- process_attributes(parent, attrs[1].with_indifferent_access, options)
30
+ process_attributes(parent, attrs[1].with_indifferent_access)
32
31
  end
33
32
  end
34
33
  end
@@ -93,10 +92,9 @@ module Mongoid
93
92
  #
94
93
  # @param [ Document ] parent The parent document.
95
94
  # @param [ Hash ] attrs The single document attributes to process.
96
- # @param [ Hash ] options the mass assignment options.
97
95
  #
98
96
  # @since 2.0.0
99
- def process_attributes(parent, attrs, options)
97
+ def process_attributes(parent, attrs)
100
98
  return if reject?(parent, attrs)
101
99
  if id = attrs.extract_id
102
100
  first = existing.first
@@ -105,10 +103,10 @@ module Mongoid
105
103
  if destroyable?(attrs)
106
104
  destroy(parent, existing, doc)
107
105
  else
108
- update_document(doc, attrs, options)
106
+ update_document(doc, attrs)
109
107
  end
110
108
  else
111
- existing.push(Factory.build(metadata.klass, attrs, options)) unless destroyable?(attrs)
109
+ existing.push(Factory.build(metadata.klass, attrs)) unless destroyable?(attrs)
112
110
  end
113
111
  end
114
112
 
@@ -127,7 +125,7 @@ module Mongoid
127
125
  # @since 3.0.10
128
126
  def destroy(parent, relation, doc)
129
127
  doc.flagged_for_destroy = true
130
- if !doc.embedded? || parent.new_record? || doc.paranoid?
128
+ if !doc.embedded? || parent.new_record?
131
129
  destroy_document(relation, doc)
132
130
  else
133
131
  parent.flagged_destroys.push(->{ destroy_document(relation, doc) })
@@ -159,15 +157,14 @@ module Mongoid
159
157
  #
160
158
  # @param [ Document ] doc The document to update.
161
159
  # @param [ Hash ] attrs The attributes.
162
- # @param [ Hash ] options The options.
163
160
  #
164
161
  # @since 3.0.10
165
- def update_document(doc, attrs, options)
162
+ def update_document(doc, attrs)
166
163
  attrs.delete_id
167
164
  if metadata.embedded?
168
- doc.assign_attributes(attrs, options)
165
+ doc.assign_attributes(attrs)
169
166
  else
170
- doc.update_attributes(attrs, options)
167
+ doc.update_attributes(attrs)
171
168
  end
172
169
  end
173
170
  end
@@ -18,19 +18,18 @@ module Mongoid
18
18
  # document, or a removal of the relation.
19
19
  #
20
20
  # @param [ Document ] parent The parent document.
21
- # @param [ Hash ] options The mass assignment options.
22
21
  #
23
22
  # @return [ Document ] The built document.
24
23
  #
25
24
  # @since 2.0.0
26
- def build(parent, options = {})
25
+ def build(parent)
27
26
  return if reject?(parent, attributes)
28
27
  @existing = parent.send(metadata.name)
29
28
  if update?
30
29
  attributes.delete_id
31
- existing.assign_attributes(attributes, options)
30
+ existing.assign_attributes(attributes)
32
31
  elsif replace?
33
- parent.send(metadata.setter, Factory.build(metadata.klass, attributes, options))
32
+ parent.send(metadata.setter, Factory.build(metadata.klass, attributes))
34
33
  elsif delete?
35
34
  parent.send(metadata.setter, nil)
36
35
  end
@@ -40,7 +39,7 @@ module Mongoid
40
39
  # relations.
41
40
  #
42
41
  # @example Instantiate the builder.
43
- # One.new(metadata, attributes, options)
42
+ # One.new(metadata, attributes)
44
43
  #
45
44
  # @param [ Metadata ] metadata The relation metadata.
46
45
  # @param [ Hash ] attributes The attributes hash to attempt to set.
@@ -69,7 +68,7 @@ module Mongoid
69
68
  # @since 2.0.0
70
69
  def acceptable_id?
71
70
  id = convert_id(existing.class, attributes[:id])
72
- existing.id == id || id.nil? || (existing.id != id && update_only?)
71
+ existing._id == id || id.nil? || (existing._id != id && update_only?)
73
72
  end
74
73
 
75
74
  # Can the existing relation be deleted?
@@ -17,7 +17,7 @@ module Mongoid
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  model = type ? type.constantize : metadata.klass
20
- metadata.criteria(object, model).from_map_or_db
20
+ metadata.criteria(object, model).first
21
21
  end
22
22
  end
23
23
  end
@@ -17,8 +17,7 @@ module Mongoid
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  return [] if object.is_a?(Array)
20
- crit = metadata.criteria(Conversions.flag(object, metadata), base.class)
21
- IdentityMap.get_many(crit.klass, crit.send(:selector_with_type_selection)) || crit
20
+ metadata.criteria(Conversions.flag(object, metadata), base.class)
22
21
  end
23
22
  end
24
23
  end
@@ -17,8 +17,7 @@ module Mongoid
17
17
  def build(type = nil)
18
18
  return object.try(:dup) unless query?
19
19
  ids = object || []
20
- crit = metadata.criteria(ids, base.class)
21
- IdentityMap.get(crit.klass, ids) || crit
20
+ metadata.criteria(ids, base.class)
22
21
  end
23
22
 
24
23
  # Do we need to perform a database query? It will be so if the object we
@@ -17,7 +17,7 @@ module Mongoid
17
17
  def build(type = nil)
18
18
  return object unless query?
19
19
  return nil if base.new_record?
20
- metadata.criteria(Conversions.flag(object, metadata), base.class).from_map_or_db
20
+ metadata.criteria(Conversions.flag(object, metadata), base.class).first
21
21
  end
22
22
  end
23
23
  end
@@ -26,11 +26,9 @@ module Mongoid
26
26
  # @since 2.0.0.rc.1
27
27
  def cascade!
28
28
  cascades.each do |name|
29
- if !metadata || !metadata.versioned?
30
- if meta = relations[name]
31
- strategy = meta.cascade_strategy
32
- strategy.new(self, meta).cascade if strategy
33
- end
29
+ if meta = relations[name]
30
+ strategy = meta.cascade_strategy
31
+ strategy.new(self, meta).cascade if strategy
34
32
  end
35
33
  end
36
34
  end
@@ -37,7 +37,7 @@ module Mongoid
37
37
  return object if metadata.polymorphic?
38
38
  klass, field = metadata.klass, metadata.klass.fields["_id"]
39
39
  if klass.using_object_ids?
40
- Moped::BSON::ObjectId.mongoize(object)
40
+ BSON::ObjectId.mongoize(object)
41
41
  elsif object.is_a?(::Array)
42
42
  object.map!{ |obj| field.mongoize(obj) }
43
43
  else
@@ -20,7 +20,7 @@ module Mongoid
20
20
  # @since 2.3.0
21
21
  def flag(object, metadata)
22
22
  inverse = metadata.inverse_klass
23
- if inverse.using_object_ids? || object.is_a?(Moped::BSON::ObjectId)
23
+ if inverse.using_object_ids? || object.is_a?(BSON::ObjectId)
24
24
  object
25
25
  else
26
26
  if object.is_a?(String)
@@ -4,6 +4,20 @@ module Mongoid
4
4
  module CounterCache
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ # Reset the given counter using the .count() query from the
8
+ # db. This method is usuful in case that a counter got
9
+ # corrupted, or a new counter was added to the collection.
10
+ #
11
+ # @example Reset the given counter cache
12
+ # post.reset_counters(:comments)
13
+ #
14
+ # @param [ Symbol, Array ] One or more counter caches to reset
15
+ #
16
+ # @since 4.0.0
17
+ def reset_counters(*counters)
18
+ self.class.reset_counters(self, *counters)
19
+ end
20
+
7
21
  module ClassMethods
8
22
 
9
23
  # Reset the given counter using the .count() query from the
@@ -18,12 +32,12 @@ module Mongoid
18
32
  #
19
33
  # @since 3.1.0
20
34
  def reset_counters(id, *counters)
21
- object = find(id)
35
+ document = id.is_a?(Document) ? id : find(id)
22
36
  counters.each do |name|
23
37
  meta = reflect_on_association(name)
24
38
  inverse = meta.klass.reflect_on_association(meta.inverse)
25
39
  counter_name = inverse.counter_cache_column_name
26
- object.update_attribute(counter_name, object.send(name).count)
40
+ document.update_attribute(counter_name, document.send(name).count)
27
41
  end
28
42
  end
29
43
 
@@ -36,24 +50,22 @@ module Mongoid
36
50
  # :comments_count => 5, :likes_count => -2)
37
51
  #
38
52
  # @param [ String ] The id of the object to update.
39
- # @param [ Hash ] Key = counter_cahe and Value = factor.
53
+ # @param [ Hash ] Key = counter_cache and Value = factor.
40
54
  #
41
55
  # @since 3.1.0
42
56
  def update_counters(id, counters)
43
- counters.map do |key, value|
44
- where(:_id => id).inc(key, value)
45
- end
57
+ where(:_id => id).inc(counters)
46
58
  end
47
59
 
48
60
  # Increment the counter name from the entries that match the
49
61
  # id by one. This method is used on associations callbacks
50
- # when counter_cache is enable
62
+ # when counter_cache is enabled
51
63
  #
52
64
  # @example Increment comments counter
53
65
  # Post.increment_counter(:comments_count, '50e0edd97c71c17ea9000001')
54
66
  #
55
67
  # @param [ Symbol ] Counter cache name
56
- # @param [ String ] The id of the object that will be reset.
68
+ # @param [ String ] The id of the object that will have its counter incremented.
57
69
  #
58
70
  # @since 3.1.0
59
71
  def increment_counter(counter_name, id)
@@ -62,13 +74,13 @@ module Mongoid
62
74
 
63
75
  # Decrement the counter name from the entries that match the
64
76
  # id by one. This method is used on associations callbacks
65
- # when counter_cache is enable
77
+ # when counter_cache is enabled
66
78
  #
67
79
  # @example Decrement comments counter
68
80
  # Post.decrement_counter(:comments_count, '50e0edd97c71c17ea9000001')
69
81
  #
70
82
  # @param [ Symbol ] Counter cache name
71
- # @param [ String ] The id of the object that will be reset.
83
+ # @param [ String ] The id of the object that will have its counter decremented.
72
84
  #
73
85
  # @since 3.1.0
74
86
  def decrement_counter(counter_name, id)
@@ -82,7 +94,7 @@ module Mongoid
82
94
  # @api private
83
95
  #
84
96
  # @example Add the touchable.
85
- # Person.add_counter_callbacks(meta)
97
+ # Person.add_counter_cache_callbacks(meta)
86
98
  #
87
99
  # @param [ Metadata ] metadata The metadata for the relation.
88
100
  #
@@ -92,13 +104,25 @@ module Mongoid
92
104
  cache_column = meta.counter_cache_column_name.to_sym
93
105
 
94
106
  after_create do
95
- record = __send__(name)
96
- record.class.increment_counter(cache_column, record.id) if record.try(:persisted?)
107
+ if record = __send__(name)
108
+ record[cache_column] = (record[cache_column] || 0) + 1
109
+
110
+ if record.persisted?
111
+ record.class.increment_counter(cache_column, record._id)
112
+ record.remove_change(cache_column)
113
+ end
114
+ end
97
115
  end
98
116
 
99
117
  before_destroy do
100
- record = __send__(name)
101
- record.class.decrement_counter(cache_column, record.id) if record.try(:persisted?)
118
+ if record = __send__(name)
119
+ record[cache_column] = (record[cache_column] || 0) - 1
120
+
121
+ if record.persisted?
122
+ record.class.decrement_counter(cache_column, record._id)
123
+ record.remove_change(cache_column)
124
+ end
125
+ end
102
126
  end
103
127
  end
104
128
  end