mongoid 3.1.6 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +432 -8
  3. data/README.md +5 -6
  4. data/lib/config/locales/en.yml +32 -18
  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 +1 -12
  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 -101
  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/mongo.rb +7 -9
  19. data/lib/mongoid/contextual/atomic.rb +53 -53
  20. data/lib/mongoid/contextual/geo_near.rb +1 -1
  21. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  22. data/lib/mongoid/contextual/memory.rb +18 -6
  23. data/lib/mongoid/contextual/mongo.rb +64 -56
  24. data/lib/mongoid/contextual/none.rb +90 -0
  25. data/lib/mongoid/contextual/text_search.rb +178 -0
  26. data/lib/mongoid/contextual.rb +2 -0
  27. data/lib/mongoid/copyable.rb +2 -3
  28. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  29. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  30. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  31. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  32. data/lib/mongoid/criteria/permission.rb +70 -0
  33. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  34. data/lib/mongoid/criteria.rb +39 -34
  35. data/lib/mongoid/document.rb +32 -17
  36. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  37. data/lib/mongoid/errors/document_not_found.rb +2 -1
  38. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  39. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  40. data/lib/mongoid/errors/invalid_value.rb +16 -0
  41. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  42. data/lib/mongoid/errors/readonly_document.rb +24 -0
  43. data/lib/mongoid/errors.rb +4 -1
  44. data/lib/mongoid/extensions/array.rb +3 -3
  45. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  46. data/lib/mongoid/extensions/boolean.rb +15 -17
  47. data/lib/mongoid/extensions/date.rb +1 -1
  48. data/lib/mongoid/extensions/date_time.rb +3 -3
  49. data/lib/mongoid/extensions/float.rb +2 -1
  50. data/lib/mongoid/extensions/hash.rb +3 -3
  51. data/lib/mongoid/extensions/integer.rb +1 -1
  52. data/lib/mongoid/extensions/object.rb +7 -7
  53. data/lib/mongoid/extensions/object_id.rb +5 -5
  54. data/lib/mongoid/extensions/range.rb +9 -3
  55. data/lib/mongoid/extensions/regexp.rb +1 -1
  56. data/lib/mongoid/extensions/set.rb +1 -1
  57. data/lib/mongoid/extensions/string.rb +6 -18
  58. data/lib/mongoid/extensions/symbol.rb +1 -1
  59. data/lib/mongoid/extensions/time.rb +3 -3
  60. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  61. data/lib/mongoid/extensions.rb +2 -7
  62. data/lib/mongoid/factory.rb +8 -6
  63. data/lib/mongoid/fields/foreign_key.rb +3 -3
  64. data/lib/mongoid/fields/localized.rb +1 -1
  65. data/lib/mongoid/fields/standard.rb +5 -17
  66. data/lib/mongoid/fields/validators/macro.rb +15 -5
  67. data/lib/mongoid/fields.rb +41 -8
  68. data/lib/mongoid/{finders.rb → findable.rb} +8 -2
  69. data/lib/mongoid/indexable/specification.rb +104 -0
  70. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  71. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  72. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  73. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  74. data/lib/mongoid/log_subscriber.rb +55 -0
  75. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  76. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  77. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  78. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  82. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  85. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  86. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  87. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  88. data/lib/mongoid/matchable.rb +152 -0
  89. data/lib/mongoid/persistable/creatable.rb +188 -0
  90. data/lib/mongoid/persistable/deletable.rb +149 -0
  91. data/lib/mongoid/persistable/destroyable.rb +60 -0
  92. data/lib/mongoid/persistable/incrementable.rb +36 -0
  93. data/lib/mongoid/persistable/logical.rb +38 -0
  94. data/lib/mongoid/persistable/poppable.rb +39 -0
  95. data/lib/mongoid/persistable/pullable.rb +55 -0
  96. data/lib/mongoid/persistable/pushable.rb +62 -0
  97. data/lib/mongoid/persistable/renamable.rb +35 -0
  98. data/lib/mongoid/persistable/savable.rb +52 -0
  99. data/lib/mongoid/persistable/settable.rb +33 -0
  100. data/lib/mongoid/persistable/unsettable.rb +36 -0
  101. data/lib/mongoid/persistable/updatable.rb +152 -0
  102. data/lib/mongoid/persistable/upsertable.rb +55 -0
  103. data/lib/mongoid/persistable.rb +216 -0
  104. data/lib/mongoid/positional.rb +71 -0
  105. data/lib/mongoid/query_cache.rb +247 -0
  106. data/lib/mongoid/railtie.rb +32 -45
  107. data/lib/mongoid/railties/database.rake +9 -25
  108. data/lib/mongoid/relations/accessors.rb +13 -49
  109. data/lib/mongoid/relations/auto_save.rb +15 -36
  110. data/lib/mongoid/relations/binding.rb +1 -24
  111. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  112. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  113. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  115. data/lib/mongoid/relations/builder.rb +1 -1
  116. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  117. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  118. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  119. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  120. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  121. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  122. data/lib/mongoid/relations/builders.rb +2 -2
  123. data/lib/mongoid/relations/cascading.rb +3 -5
  124. data/lib/mongoid/relations/constraint.rb +1 -1
  125. data/lib/mongoid/relations/conversions.rb +1 -1
  126. data/lib/mongoid/relations/counter_cache.rb +39 -15
  127. data/lib/mongoid/relations/eager/base.rb +149 -0
  128. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  129. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  130. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  131. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  134. data/lib/mongoid/relations/embedded/in.rb +4 -4
  135. data/lib/mongoid/relations/embedded/many.rb +14 -32
  136. data/lib/mongoid/relations/embedded/one.rb +1 -1
  137. data/lib/mongoid/relations/macros.rb +3 -4
  138. data/lib/mongoid/relations/many.rb +30 -31
  139. data/lib/mongoid/relations/marshalable.rb +3 -3
  140. data/lib/mongoid/relations/metadata.rb +14 -79
  141. data/lib/mongoid/relations/nested_builder.rb +2 -2
  142. data/lib/mongoid/relations/options.rb +1 -0
  143. data/lib/mongoid/relations/polymorphic.rb +0 -1
  144. data/lib/mongoid/relations/proxy.rb +21 -41
  145. data/lib/mongoid/relations/referenced/in.rb +4 -20
  146. data/lib/mongoid/relations/referenced/many.rb +19 -32
  147. data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
  148. data/lib/mongoid/relations/referenced/one.rb +6 -25
  149. data/lib/mongoid/relations/synchronization.rb +3 -3
  150. data/lib/mongoid/relations/touchable.rb +34 -1
  151. data/lib/mongoid/relations.rb +11 -25
  152. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  153. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  154. data/lib/mongoid/selectable.rb +59 -0
  155. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  156. data/lib/mongoid/sessions/factory.rb +2 -0
  157. data/lib/mongoid/sessions/options.rb +180 -0
  158. data/lib/mongoid/sessions/storage_options.rb +140 -0
  159. data/lib/mongoid/sessions/thread_options.rb +19 -0
  160. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  161. data/lib/mongoid/sessions.rb +37 -345
  162. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  163. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  164. data/lib/mongoid/support/query_counter.rb +23 -0
  165. data/lib/mongoid/tasks/database.rake +31 -0
  166. data/lib/mongoid/tasks/database.rb +107 -0
  167. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  168. data/lib/mongoid/threaded.rb +0 -157
  169. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  170. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  171. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  172. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  173. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  174. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  175. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  176. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  178. data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
  179. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  180. data/lib/mongoid/version.rb +1 -1
  181. data/lib/mongoid.rb +10 -76
  182. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
  183. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  184. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  185. data/lib/rails/generators/mongoid_generator.rb +3 -40
  186. data/lib/rails/mongoid.rb +0 -122
  187. data/lib/support/ruby_version.rb +1 -1
  188. data/spec/app/models/account.rb +2 -6
  189. data/spec/app/models/acolyte.rb +2 -1
  190. data/spec/app/models/actor.rb +0 -1
  191. data/spec/app/models/address.rb +8 -3
  192. data/spec/app/models/animal.rb +1 -1
  193. data/spec/app/models/appointment.rb +3 -3
  194. data/spec/app/models/article.rb +1 -4
  195. data/spec/app/models/audio.rb +5 -0
  196. data/spec/app/models/author.rb +0 -2
  197. data/spec/app/models/band.rb +3 -2
  198. data/spec/app/models/bar.rb +1 -0
  199. data/spec/app/models/book.rb +1 -0
  200. data/spec/app/models/building.rb +0 -2
  201. data/spec/app/models/building_address.rb +0 -2
  202. data/spec/app/models/bus.rb +1 -1
  203. data/spec/app/models/canvas.rb +1 -1
  204. data/spec/app/models/contractor.rb +0 -2
  205. data/spec/app/models/country_code.rb +1 -1
  206. data/spec/app/models/definition.rb +2 -2
  207. data/spec/app/models/dog.rb +1 -1
  208. data/spec/app/models/draft.rb +9 -0
  209. data/spec/app/models/dragon.rb +4 -0
  210. data/spec/app/models/drug.rb +1 -3
  211. data/spec/app/models/dungeon.rb +4 -0
  212. data/spec/app/models/edit.rb +5 -0
  213. data/spec/app/models/even.rb +7 -0
  214. data/spec/app/models/event.rb +1 -1
  215. data/spec/app/models/filesystem.rb +1 -0
  216. data/spec/app/models/fish.rb +0 -1
  217. data/spec/app/models/fruits.rb +6 -0
  218. data/spec/app/models/game.rb +0 -2
  219. data/spec/app/models/house.rb +1 -3
  220. data/spec/app/models/item.rb +1 -5
  221. data/spec/app/models/jar.rb +1 -1
  222. data/spec/app/models/label.rb +4 -4
  223. data/spec/app/models/line_item.rb +1 -1
  224. data/spec/app/models/login.rb +1 -1
  225. data/spec/app/models/message.rb +8 -0
  226. data/spec/app/models/movie.rb +1 -0
  227. data/spec/app/models/name.rb +3 -3
  228. data/spec/app/models/note.rb +3 -1
  229. data/spec/app/models/odd.rb +7 -0
  230. data/spec/app/models/oscar.rb +1 -1
  231. data/spec/app/models/parent_doc.rb +1 -1
  232. data/spec/app/models/person.rb +16 -10
  233. data/spec/app/models/phone.rb +1 -3
  234. data/spec/app/models/player.rb +3 -3
  235. data/spec/app/models/post.rb +5 -3
  236. data/spec/app/models/preference.rb +1 -1
  237. data/spec/app/models/quiz.rb +0 -3
  238. data/spec/app/models/record.rb +10 -5
  239. data/spec/app/models/registry.rb +1 -1
  240. data/spec/app/models/server.rb +1 -1
  241. data/spec/app/models/service.rb +3 -3
  242. data/spec/app/models/sound.rb +5 -0
  243. data/spec/app/models/symptom.rb +1 -1
  244. data/spec/app/models/template.rb +1 -1
  245. data/spec/app/models/title.rb +0 -1
  246. data/spec/app/models/track.rb +5 -5
  247. data/spec/app/models/tree.rb +3 -3
  248. data/spec/app/models/video.rb +1 -5
  249. data/spec/app/models/wiki_page.rb +2 -5
  250. data/spec/app/models/word.rb +3 -0
  251. data/spec/app/models/word_origin.rb +1 -1
  252. data/spec/config/mongoid.yml +7 -8
  253. data/spec/helpers.rb +18 -0
  254. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  255. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  256. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  257. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  258. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  259. data/spec/mongoid/atomic_spec.rb +19 -19
  260. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  261. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  262. data/spec/mongoid/attributes_spec.rb +315 -436
  263. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  264. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  265. data/spec/mongoid/config/environment_spec.rb +3 -3
  266. data/spec/mongoid/config/options_spec.rb +6 -6
  267. data/spec/mongoid/config_spec.rb +24 -48
  268. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  269. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  270. data/spec/mongoid/contextual/atomic_spec.rb +68 -58
  271. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  272. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  273. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  274. data/spec/mongoid/contextual/memory_spec.rb +151 -94
  275. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  276. data/spec/mongoid/contextual/none_spec.rb +127 -0
  277. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  278. data/spec/mongoid/copyable_spec.rb +56 -68
  279. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  280. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  281. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  282. data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
  283. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  284. data/spec/mongoid/criteria_spec.rb +578 -2295
  285. data/spec/mongoid/document_spec.rb +166 -120
  286. data/spec/mongoid/equality_spec.rb +22 -22
  287. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  288. data/spec/mongoid/errors/callback_spec.rb +3 -3
  289. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  290. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  291. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  292. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  293. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  294. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  295. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  296. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  297. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  303. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  306. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  307. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  308. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  309. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  310. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  311. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  312. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  313. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  314. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  315. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  319. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  321. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  323. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  324. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  325. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  326. data/spec/mongoid/errors/validations_spec.rb +7 -7
  327. data/spec/mongoid/extensions/array_spec.rb +61 -61
  328. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  329. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  330. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  331. data/spec/mongoid/extensions/date_spec.rb +13 -13
  332. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  333. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  334. data/spec/mongoid/extensions/float_spec.rb +29 -15
  335. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  336. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  337. data/spec/mongoid/extensions/module_spec.rb +2 -2
  338. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  339. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  340. data/spec/mongoid/extensions/object_spec.rb +26 -26
  341. data/spec/mongoid/extensions/range_spec.rb +61 -12
  342. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  343. data/spec/mongoid/extensions/set_spec.rb +4 -4
  344. data/spec/mongoid/extensions/string_spec.rb +35 -46
  345. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  346. data/spec/mongoid/extensions/time_spec.rb +49 -49
  347. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  348. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  349. data/spec/mongoid/extensions_spec.rb +15 -0
  350. data/spec/mongoid/factory_spec.rb +15 -15
  351. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  352. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  353. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  354. data/spec/mongoid/fields/localized_spec.rb +38 -23
  355. data/spec/mongoid/fields/standard_spec.rb +12 -12
  356. data/spec/mongoid/fields_spec.rb +263 -217
  357. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
  358. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  359. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  360. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  361. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  362. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  363. data/spec/mongoid/loggable_spec.rb +1 -1
  364. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  365. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  366. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  367. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  368. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  369. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  370. data/spec/mongoid/matchable/in_spec.rb +49 -0
  371. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  372. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  373. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  374. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  375. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  376. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  377. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  378. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  379. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  380. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  381. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  382. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  383. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  384. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  385. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  386. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  387. data/spec/mongoid/persistable/savable_spec.rb +461 -0
  388. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  389. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  390. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  391. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  392. data/spec/mongoid/persistable_spec.rb +206 -0
  393. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  394. data/spec/mongoid/query_cache_spec.rb +231 -0
  395. data/spec/mongoid/railties/document_spec.rb +2 -2
  396. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  397. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  398. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  399. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  400. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  401. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  402. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  403. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  404. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  405. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  406. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  407. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  408. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  409. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  410. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  411. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  412. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  413. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  414. data/spec/mongoid/relations/builders_spec.rb +21 -21
  415. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  416. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  417. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  418. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  419. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  420. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  421. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  422. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  423. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  424. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  425. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  426. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  427. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  428. data/spec/mongoid/relations/eager_spec.rb +228 -0
  429. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  430. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  431. data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
  432. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  433. data/spec/mongoid/relations/macros_spec.rb +108 -102
  434. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  435. data/spec/mongoid/relations/options_spec.rb +1 -1
  436. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  437. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  438. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  439. data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
  440. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
  441. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  442. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  443. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  444. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  445. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  446. data/spec/mongoid/relations_spec.rb +16 -15
  447. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  448. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  449. data/spec/mongoid/selectable_spec.rb +134 -0
  450. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  451. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  452. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  453. data/spec/mongoid/sessions/options_spec.rb +107 -0
  454. data/spec/mongoid/sessions_spec.rb +289 -178
  455. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  456. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  457. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  458. data/spec/mongoid/tasks/database_spec.rb +160 -0
  459. data/spec/mongoid/threaded_spec.rb +17 -70
  460. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  461. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  462. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  463. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  464. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  465. data/spec/mongoid/timestamps_spec.rb +9 -13
  466. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  467. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  468. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  469. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  470. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  471. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  472. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  473. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  474. data/spec/mongoid_spec.rb +8 -8
  475. data/spec/rails/mongoid_spec.rb +19 -335
  476. data/spec/spec_helper.rb +29 -13
  477. metadata +296 -283
  478. data/lib/mongoid/atomic/positionable.rb +0 -73
  479. data/lib/mongoid/components.rb +0 -92
  480. data/lib/mongoid/config/inflections.rb +0 -6
  481. data/lib/mongoid/contextual/eager.rb +0 -158
  482. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  483. data/lib/mongoid/identity_map.rb +0 -163
  484. data/lib/mongoid/json.rb +0 -16
  485. data/lib/mongoid/matchers/strategies.rb +0 -97
  486. data/lib/mongoid/matchers.rb +0 -32
  487. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  488. data/lib/mongoid/nested_attributes.rb +0 -78
  489. data/lib/mongoid/observer.rb +0 -192
  490. data/lib/mongoid/paranoia.rb +0 -136
  491. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  492. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  493. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  494. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  495. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  496. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  497. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  498. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  499. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  500. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  501. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  502. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  503. data/lib/mongoid/persistence/atomic.rb +0 -231
  504. data/lib/mongoid/persistence/deletion.rb +0 -31
  505. data/lib/mongoid/persistence/insertion.rb +0 -38
  506. data/lib/mongoid/persistence/modification.rb +0 -35
  507. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  508. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  509. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  510. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  511. data/lib/mongoid/persistence/operations/update.rb +0 -59
  512. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  513. data/lib/mongoid/persistence/operations.rb +0 -214
  514. data/lib/mongoid/persistence/upsertion.rb +0 -31
  515. data/lib/mongoid/persistence.rb +0 -357
  516. data/lib/mongoid/unit_of_work.rb +0 -61
  517. data/lib/mongoid/versioning.rb +0 -217
  518. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  519. data/lib/rack/mongoid.rb +0 -2
  520. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  521. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  522. data/spec/app/models/actor_observer.rb +0 -15
  523. data/spec/app/models/callback_recorder.rb +0 -25
  524. data/spec/app/models/paranoid_phone.rb +0 -25
  525. data/spec/app/models/paranoid_post.rb +0 -36
  526. data/spec/app/models/phone_observer.rb +0 -6
  527. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  528. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  529. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  530. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  531. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  532. data/spec/mongoid/identity_map_spec.rb +0 -564
  533. data/spec/mongoid/json_spec.rb +0 -33
  534. data/spec/mongoid/matchers/in_spec.rb +0 -25
  535. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  536. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  537. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  538. data/spec/mongoid/observer_spec.rb +0 -290
  539. data/spec/mongoid/paranoia_spec.rb +0 -759
  540. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  541. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  542. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  543. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  544. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  545. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  546. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  547. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  548. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  549. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  550. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  551. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  552. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  553. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  554. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  555. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  556. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  557. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  558. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  559. data/spec/mongoid/persistence_spec.rb +0 -2279
  560. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  561. data/spec/mongoid/versioning_spec.rb +0 -540
  562. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -7,11 +7,6 @@ module Mongoid
7
7
  module AutoSave
8
8
  extend ActiveSupport::Concern
9
9
 
10
- included do
11
- class_attribute :autosaved_relations
12
- self.autosaved_relations = []
13
- end
14
-
15
10
  # Used to prevent infinite loops in associated autosaves.
16
11
  #
17
12
  # @example Is the document autosaved?
@@ -44,15 +39,8 @@ module Mongoid
44
39
  # document.changed_for_autosave?
45
40
  #
46
41
  # @since 3.1.3
47
- def changed_for_autosave?
48
- new_record? || changed? || marked_for_destruction?
49
- end
50
-
51
- # Returns the relation, if it exists
52
- #
53
- # @since 3.1.3
54
- def relation_changed_for_autosave(metadata)
55
- ivar(metadata.name) if self.class.autosaved_relations.include?(metadata.name)
42
+ def changed_for_autosave?(doc)
43
+ doc.new_record? || doc.changed? || doc.marked_for_destruction?
56
44
  end
57
45
 
58
46
  module ClassMethods
@@ -68,39 +56,30 @@ module Mongoid
68
56
  #
69
57
  # @since 2.0.0.rc.1
70
58
  def autosave(metadata)
71
- if metadata.autosave? && autosavable?(metadata)
72
- autosaved_relations.push(metadata.name)
73
- set_callback :save, :after, unless: :autosaved? do |document|
74
- # @todo: Durran: Remove with Rails 4 after callback termination.
59
+ if metadata.autosave? && !metadata.embedded?
60
+ save_method = :"autosave_documents_for_#{metadata.name}"
61
+ define_method(save_method) do
62
+
75
63
  if before_callback_halted?
76
64
  self.before_callback_halted = false
77
65
  else
78
66
  __autosaving__ do
79
- if document.changed_for_autosave? || relation = document.relation_changed_for_autosave(metadata)
80
- relation = document.__send__(metadata.name) unless relation
81
- (relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc|
82
- doc.save
83
- end if relation
67
+ if relation = ivar(metadata.name)
68
+ options = persistence_options || {}
69
+ if :belongs_to == metadata.macro
70
+ relation.with(options).save if changed_for_autosave?(relation)
71
+ else
72
+ Array(relation).each { |d| d.with(options).save if changed_for_autosave?(d) }
73
+ end
84
74
  end
85
75
  end
86
76
  end
87
77
  end
78
+
79
+ after_save save_method, unless: :autosaved?
88
80
  end
89
81
  end
90
82
 
91
- # Can the autosave be added?
92
- #
93
- # @example Can the autosave be added?
94
- # Person.autosavable?(metadata)
95
- #
96
- # @param [ Metadata ] metadata The relation metadata.
97
- #
98
- # @return [ true, false ] If the autosave is able to be added.
99
- #
100
- # @since 3.0.0
101
- def autosavable?(metadata)
102
- !autosaved_relations.include?(metadata.name) && !metadata.embedded?
103
- end
104
83
  end
105
84
  end
106
85
  end
@@ -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
@@ -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
@@ -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.
@@ -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
@@ -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?
@@ -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