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
@@ -21,11 +21,11 @@ module Mongoid
21
21
  size == 0
22
22
  end
23
23
 
24
- # Creates a new document on the references many relation. This will
25
- # save the document if the parent has been persisted.
26
- #
27
- # @example Create and save the new document.
28
- # person.posts.create(:text => "Testing")
24
+ # Creates a new document on the references many relation. This will
25
+ # save the document if the parent has been persisted.
26
+ #
27
+ # @example Create and save the new document.
28
+ # person.posts.create(:text => "Testing")
29
29
  #
30
30
  # @overload create(attributes = nil, options = {}, type = nil)
31
31
  # @param [ Hash ] attributes The attributes to create with.
@@ -39,10 +39,14 @@ module Mongoid
39
39
  # @return [ Document ] The newly created document.
40
40
  #
41
41
  # @since 2.0.0.beta.1
42
- def create(attributes = nil, options = {}, type = nil, &block)
43
- doc = build(attributes, options, type, &block)
44
- base.persisted? ? doc.save : raise_unsaved(doc)
45
- doc
42
+ def create(attributes = nil, type = nil, &block)
43
+ if attributes.is_a?(::Array)
44
+ attributes.map { |attrs| create(attrs, type, &block) }
45
+ else
46
+ doc = build(attributes, type, &block)
47
+ base.persisted? ? doc.save : raise_unsaved(doc)
48
+ doc
49
+ end
46
50
  end
47
51
 
48
52
  # Creates a new document on the references many relation. This will
@@ -54,7 +58,6 @@ module Mongoid
54
58
  #
55
59
  # @overload create!(attributes = nil, options = {}, type = nil)
56
60
  # @param [ Hash ] attributes The attributes to create with.
57
- # @param [ Hash ] options The scoped assignment options.
58
61
  # @param [ Class ] type The optional type of document to create.
59
62
  #
60
63
  # @overload create!(attributes = nil, type = nil)
@@ -66,10 +69,14 @@ module Mongoid
66
69
  # @return [ Document ] The newly created document.
67
70
  #
68
71
  # @since 2.0.0.beta.1
69
- def create!(attributes = nil, options = {}, type = nil, &block)
70
- doc = build(attributes, options, type, &block)
71
- base.persisted? ? doc.save! : raise_unsaved(doc)
72
- doc
72
+ def create!(attributes = nil, type = nil, &block)
73
+ if attributes.is_a?(::Array)
74
+ attributes.map { |attrs| create!(attrs, type, &block) }
75
+ else
76
+ doc = build(attributes, type, &block)
77
+ base.persisted? ? doc.save! : raise_unsaved(doc)
78
+ doc
79
+ end
73
80
  end
74
81
 
75
82
  # Find the first document given the conditions, or creates a new document
@@ -78,9 +85,8 @@ module Mongoid
78
85
  # @example Find or create.
79
86
  # person.posts.find_or_create_by(:title => "Testing")
80
87
  #
81
- # @overload find_or_create_by(attributes = nil, options = {}, type = nil)
88
+ # @overload find_or_create_by(attributes = nil, type = nil)
82
89
  # @param [ Hash ] attributes The attributes to search or create with.
83
- # @param [ Hash ] options The scoped assignment options.
84
90
  # @param [ Class ] type The optional type of document to create.
85
91
  #
86
92
  # @overload find_or_create_by(attributes = nil, type = nil)
@@ -88,8 +94,8 @@ module Mongoid
88
94
  # @param [ Class ] type The optional type of document to create.
89
95
  #
90
96
  # @return [ Document ] An existing document or newly created one.
91
- def find_or_create_by(attrs = {}, options = {}, type = nil, &block)
92
- find_or(:create, attrs, options, type, &block)
97
+ def find_or_create_by(attrs = {}, type = nil, &block)
98
+ find_or(:create, attrs, type, &block)
93
99
  end
94
100
 
95
101
  # Find the first +Document+ given the conditions, or instantiates a new document
@@ -98,9 +104,8 @@ module Mongoid
98
104
  # @example Find or initialize.
99
105
  # person.posts.find_or_initialize_by(:title => "Test")
100
106
  #
101
- # @overload find_or_initialize_by(attributes = {}, options = {}, type = nil)
107
+ # @overload find_or_initialize_by(attributes = {}, type = nil)
102
108
  # @param [ Hash ] attributes The attributes to search or initialize with.
103
- # @param [ Hash ] options The scoped assignment options.
104
109
  # @param [ Class ] type The optional subclass to build.
105
110
  #
106
111
  # @overload find_or_initialize_by(attributes = {}, type = nil)
@@ -108,8 +113,8 @@ module Mongoid
108
113
  # @param [ Class ] type The optional subclass to build.
109
114
  #
110
115
  # @return [ Document ] An existing document or newly instantiated one.
111
- def find_or_initialize_by(attrs = {}, options = {}, type = nil, &block)
112
- find_or(:build, attrs, options, type, &block)
116
+ def find_or_initialize_by(attrs = {}, type = nil, &block)
117
+ find_or(:build, attrs, type, &block)
113
118
  end
114
119
 
115
120
  # This proxy can never be nil.
@@ -191,10 +196,9 @@ module Mongoid
191
196
  # @example Find or create|initialize.
192
197
  # person.addresses.find_or(:create, :street => "Bond")
193
198
  #
194
- # @overload find_or(method, attributes = {}, options = {}, type = nil)
199
+ # @overload find_or(method, attributes = {}, type = nil)
195
200
  # @param [ Symbol ] method The method name, create or new.
196
201
  # @param [ Hash ] attributes The attributes to search or build with.
197
- # @param [ Hash ] options The scoped assignment options.
198
202
  # @param [ Class ] type The optional subclass to build.
199
203
  #
200
204
  # @overload find_or(attributes = {}, type = nil)
@@ -203,14 +207,9 @@ module Mongoid
203
207
  # @param [ Class ] type The optional subclass to build.
204
208
  #
205
209
  # @return [ Document ] A matching document or a new/created one.
206
- def find_or(method, attrs = {}, options = {}, type = nil, &block)
207
- if options.is_a? Class
208
- options, type = {}, options
209
- end
210
-
210
+ def find_or(method, attrs = {}, type = nil, &block)
211
211
  attrs["_type"] = type.to_s if type
212
-
213
- where(attrs).first || send(method, attrs, options, type, &block)
212
+ where(attrs).first || send(method, attrs, type, &block)
214
213
  end
215
214
  end
216
215
  end
@@ -12,7 +12,7 @@ module Mongoid
12
12
  #
13
13
  # @since 3.0.15
14
14
  def marshal_dump
15
- [ base, target, metadata ]
15
+ [ base, target, __metadata ]
16
16
  end
17
17
 
18
18
  # Takes the provided data and sets it back on the proxy.
@@ -24,8 +24,8 @@ module Mongoid
24
24
  #
25
25
  # @since 3.0.15
26
26
  def marshal_load(data)
27
- @base, @target, @metadata = data
28
- extend_proxy(metadata.extension) if metadata.extension?
27
+ @base, @target, @__metadata = data
28
+ extend_proxy(__metadata.extension) if __metadata.extension?
29
29
  end
30
30
  end
31
31
  end
@@ -229,20 +229,6 @@ module Mongoid
229
229
  !!dependent
230
230
  end
231
231
 
232
- # Get the criteria needed to eager load this relation.
233
- #
234
- # @example Get the eager loading criteria.
235
- # metadata.eager_load(criteria)
236
- #
237
- # @param [ Array<Object> ] ids The ids of the returned parents.
238
- #
239
- # @return [ Criteria ] The eager loading criteria.
240
- #
241
- # @since 2.2.0
242
- def eager_load(ids)
243
- relation.eager_load(self, ids)
244
- end
245
-
246
232
  # Will determine if the relation is an embedded one or not. Currently
247
233
  # only checks against embeds one and many.
248
234
  #
@@ -398,8 +384,7 @@ module Mongoid
398
384
  order: #{order.inspect}
399
385
  polymorphic: #{polymorphic?}
400
386
  relation: #{relation}
401
- setter: #{setter}
402
- versioned: #{versioned?}>
387
+ setter: #{setter}>
403
388
  }
404
389
  end
405
390
 
@@ -460,21 +445,6 @@ module Mongoid
460
445
  !!inverse_class_name
461
446
  end
462
447
 
463
- # Is the inverse field bindable? Ie, do we have more than one definition
464
- # on the parent class with the same polymorphic name (as).
465
- #
466
- # @example Is the inverse of bindable?
467
- # metadata.inverse_of_bindable?
468
- #
469
- # @return [ true, false ] If the relation needs the inverse of field set.
470
- #
471
- # @since 3.0.6
472
- def inverse_field_bindable?
473
- @inverse_field_bindable ||= (inverse_klass.relations.values.count do |meta|
474
- meta.as == as
475
- end > 1)
476
- end
477
-
478
448
  # Used for relational many to many only. This determines the name of the
479
449
  # foreign key field on the inverse side of the relation, since in this
480
450
  # case there are keys on both sides.
@@ -579,31 +549,6 @@ module Mongoid
579
549
  @inverse_type_setter ||= inverse_type.__setter__
580
550
  end
581
551
 
582
- # Returns the name of the field in which to store the name of the inverse
583
- # field for the polymorphic relation.
584
- #
585
- # @example Get the name of the field.
586
- # metadata.inverse_of_field
587
- #
588
- # @return [ String ] The name of the field for storing the name of the
589
- # inverse field.
590
- #
591
- # @since 2.4.5
592
- def inverse_of_field
593
- @inverse_of_field ||= determine_inverse_for(:field)
594
- end
595
-
596
- # Gets the setter for the field that stores the name of the inverse field
597
- # on a polymorphic relation.
598
- #
599
- # @example Get the inverse type setter.
600
- # metadata.inverse_of_field_setter
601
- #
602
- # @return [ String ] The name of the setter.
603
- def inverse_of_field_setter
604
- @inverse_of_field_setter ||= inverse_of_field.__setter__
605
- end
606
-
607
552
  # This returns the key that is to be used to grab the attributes for the
608
553
  # relation or the foreign key or id that a referenced relation will use
609
554
  # to query for the object.
@@ -823,18 +768,6 @@ module Mongoid
823
768
  end
824
769
  end
825
770
 
826
- # Is this relation using Mongoid's internal versioning system?
827
- #
828
- # @example Is this relation versioned?
829
- # metadata.versioned?
830
- #
831
- # @return [ true, false ] If the relation uses Mongoid versioning.
832
- #
833
- # @since 2.1.0
834
- def versioned?
835
- !!self[:versioned]
836
- end
837
-
838
771
  # Returns the metadata itself. Here for compatibility with Rails
839
772
  # association metadata.
840
773
  #
@@ -977,9 +910,13 @@ module Mongoid
977
910
  # @since 3.0.0
978
911
  def find_from_parts(modules)
979
912
  modules.find do |mod|
980
- ActiveSupport::Inflector.constantize(mod).constants.include?(
981
- name.to_s.classify.to_sym
982
- )
913
+ if mod.blank?
914
+ false
915
+ else
916
+ ActiveSupport::Inflector.constantize(mod).constants.include?(
917
+ name.to_s.classify.to_sym
918
+ )
919
+ end
983
920
  end
984
921
  end
985
922
 
@@ -1033,15 +970,13 @@ module Mongoid
1033
970
  # @since 2.0.0.rc.1
1034
971
  def determine_foreign_key
1035
972
  return self[:foreign_key].to_s if self[:foreign_key]
1036
- suffix = relation.foreign_key_suffix
973
+ return nil if relation.embedded?
974
+
1037
975
  if relation.stores_foreign_key?
1038
976
  relation.foreign_key(name)
1039
977
  else
1040
- if polymorphic?
1041
- "#{self[:as]}#{suffix}"
1042
- else
1043
- inverse_of ? "#{inverse_of}#{suffix}" : inverse_class_name.foreign_key
1044
- end
978
+ suffix = relation.foreign_key_suffix
979
+ "#{inverse}#{suffix}"
1045
980
  end
1046
981
  end
1047
982
 
@@ -1112,8 +1047,8 @@ module Mongoid
1112
1047
  # @since 3.0.0
1113
1048
  def inverse_relation_candidates
1114
1049
  relations_metadata.select do |meta|
1115
- next if meta.versioned? || meta.name == name
1116
- meta.class_name == inverse_class_name
1050
+ next if meta.name == name
1051
+ (meta.class_name == inverse_class_name) && !meta.forced_nil_inverse?
1117
1052
  end
1118
1053
  end
1119
1054
 
@@ -63,11 +63,11 @@ module Mongoid
63
63
  # @param [ Class ] klass The class we're trying to convert for.
64
64
  # @param [ String ] id The id, usually coming from the form.
65
65
  #
66
- # @return [ Moped::BSON::ObjectId, String, Object ] The converted id.
66
+ # @return [ BSON::ObjectId, String, Object ] The converted id.
67
67
  #
68
68
  # @since 2.0.0.rc.6
69
69
  def convert_id(klass, id)
70
- klass.using_object_ids? ? Moped::BSON::ObjectId.mongoize(id) : id
70
+ klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
71
71
  end
72
72
  end
73
73
  end
@@ -42,6 +42,7 @@ module Mongoid
42
42
  )
43
43
  end
44
44
  end
45
+ true
45
46
  end
46
47
  end
47
48
  end
@@ -29,7 +29,6 @@ module Mongoid
29
29
  self.polymorphic = true
30
30
  if metadata.relation.stores_foreign_key?
31
31
  field(metadata.inverse_type, type: String)
32
- field(metadata.inverse_of_field, type: Symbol)
33
32
  end
34
33
  end
35
34
  self
@@ -12,16 +12,17 @@ module Mongoid
12
12
  # We undefine most methods to get them sent through to the target.
13
13
  instance_methods.each do |method|
14
14
  undef_method(method) unless
15
- method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy)/
15
+ method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy|extend_proxies)/
16
16
  end
17
17
 
18
18
  include Threaded::Lifecycle
19
19
  include Marshalable
20
20
 
21
- attr_accessor :base, :loaded, :metadata, :target
21
+ attr_accessor :base, :__metadata, :target
22
+ alias :relation_metadata :__metadata
22
23
 
23
24
  # Backwards compatibility with Mongoid beta releases.
24
- delegate :foreign_key, :inverse_foreign_key, to: :metadata
25
+ delegate :foreign_key, :inverse_foreign_key, to: :__metadata
25
26
  delegate :bind_one, :unbind_one, to: :binding
26
27
  delegate :collection_name, to: :base
27
28
 
@@ -37,9 +38,14 @@ module Mongoid
37
38
  #
38
39
  # @since 2.0.0.rc.1
39
40
  def init(base, target, metadata)
40
- @base, @target, @metadata = base, target, metadata
41
+ @base, @target, @__metadata = base, target, metadata
41
42
  yield(self) if block_given?
42
- extend_proxy(metadata.extension) if metadata.extension?
43
+ extend_proxies(metadata.extension) if metadata.extension?
44
+ end
45
+
46
+ # Allow extension to be an array and extend each module
47
+ def extend_proxies(*extension)
48
+ extension.flatten.each {|ext| extend_proxy(ext) }
43
49
  end
44
50
 
45
51
  # Get the class from the metadata, or return nil if no metadata present.
@@ -51,7 +57,7 @@ module Mongoid
51
57
  #
52
58
  # @since 3.0.15
53
59
  def klass
54
- metadata ? metadata.klass : nil
60
+ __metadata ? __metadata.klass : nil
55
61
  end
56
62
 
57
63
  # Resets the criteria inside the relation proxy. Used by many to many
@@ -103,7 +109,7 @@ module Mongoid
103
109
  #
104
110
  # @since 3.0.0
105
111
  def with(options)
106
- Threaded.set_persistence_options(klass, options)
112
+ @persistence_options = options
107
113
  self
108
114
  end
109
115
 
@@ -119,6 +125,7 @@ module Mongoid
119
125
  # @since 2.0.0
120
126
  def collection
121
127
  root = base._root
128
+ root.with(@persistence_options)
122
129
  root.collection unless root.embedded?
123
130
  end
124
131
 
@@ -131,7 +138,7 @@ module Mongoid
131
138
  #
132
139
  # @since 2.0.0.rc.4
133
140
  def characterize_one(document)
134
- document.metadata = metadata unless document.metadata
141
+ document.__metadata = __metadata unless document.__metadata
135
142
  end
136
143
 
137
144
  # Default behavior of method missing should be to delegate all calls
@@ -153,7 +160,7 @@ module Mongoid
153
160
  #
154
161
  # @since 2.0.0
155
162
  def raise_mixed
156
- raise Errors::MixedRelations.new(base.class, metadata.klass)
163
+ raise Errors::MixedRelations.new(base.class, __metadata.klass)
157
164
  end
158
165
 
159
166
  # When the base is not yet saved and the user calls create or create!
@@ -183,11 +190,12 @@ module Mongoid
183
190
  # @since 3.1.0
184
191
  def callback_method(callback_name)
185
192
  methods = []
186
- if metadata[callback_name]
187
- if metadata[callback_name].is_a? Array
188
- methods.concat(metadata[callback_name])
193
+ metadata = __metadata[callback_name]
194
+ if metadata
195
+ if metadata.is_a?(Array)
196
+ methods.concat(metadata)
189
197
  else
190
- methods << metadata[callback_name]
198
+ methods << metadata
191
199
  end
192
200
  end
193
201
  methods
@@ -230,34 +238,6 @@ module Mongoid
230
238
  def apply_ordering(criteria, metadata)
231
239
  metadata.order ? criteria.order_by(metadata.order) : criteria
232
240
  end
233
-
234
- # Get the criteria that is used to eager load a relation of this
235
- # type.
236
- #
237
- # @example Get the eager load criteria.
238
- # Proxy.eager_load(metadata, criteria)
239
- #
240
- # @param [ Metadata ] metadata The relation metadata.
241
- # @param [ Array<Object> ] ids The ids of the base docs.
242
- #
243
- # @return [ Criteria ] The criteria to eager load the relation.
244
- #
245
- # @since 2.2.0
246
- def eager_load_ids(metadata, ids)
247
- klass, foreign_key = metadata.klass, metadata.foreign_key
248
- eager_loaded = klass.any_in(foreign_key => ids).entries
249
- ids.each do |id|
250
- sel = { foreign_key => id }
251
- sel.merge!(metadata.type_relation) if klass.hereditary?
252
- IdentityMap.clear_many(klass, sel)
253
- end
254
- eager_loaded.each do |doc|
255
- base_id = doc.__send__(foreign_key)
256
- sel = { foreign_key => base_id }
257
- sel.merge!(metadata.type_relation) if klass.hereditary?
258
- yield(doc, sel)
259
- end
260
- end
261
241
  end
262
242
  end
263
243
  end
@@ -71,7 +71,7 @@ module Mongoid
71
71
  #
72
72
  # @since 2.0.0.rc.1
73
73
  def binding
74
- Bindings::Referenced::In.new(base, target, metadata)
74
+ Bindings::Referenced::In.new(base, target, __metadata)
75
75
  end
76
76
 
77
77
  # Normalize the value provided as a replacement for substitution.
@@ -88,7 +88,7 @@ module Mongoid
88
88
  # @since 3.1.5
89
89
  def normalize(replacement)
90
90
  return replacement if replacement.is_a?(Document)
91
- metadata.builder(klass, replacement).build
91
+ __metadata.builder(klass, replacement).build
92
92
  end
93
93
 
94
94
  # Are we able to persist this relation?
@@ -139,24 +139,8 @@ module Mongoid
139
139
  type.where(metadata.primary_key => object)
140
140
  end
141
141
 
142
- # Get the criteria that is used to eager load a relation of this
143
- # type.
144
- #
145
- # @example Get the eager load criteria.
146
- # Proxy.eager_load(metadata, criteria)
147
- #
148
- # @param [ Metadata ] metadata The relation metadata.
149
- # @param [ Array<Object> ] ids The ids of the target docs.
150
- #
151
- # @return [ Criteria ] The criteria to eager load the relation.
152
- #
153
- # @since 2.2.0
154
- def eager_load(metadata, ids)
155
- raise Errors::EagerLoad.new(metadata.name) if metadata.polymorphic?
156
- klass, _ = metadata.klass, metadata.foreign_key
157
- klass.any_in("_id" => ids.uniq).each do |doc|
158
- IdentityMap.set(doc)
159
- end
142
+ def eager_load_klass
143
+ Relations::Eager::BelongsTo
160
144
  end
161
145
 
162
146
  # Returns true if the relation is an embedded one. In this case
@@ -78,12 +78,8 @@ module Mongoid
78
78
  # @return [ Document ] The new document.
79
79
  #
80
80
  # @since 2.0.0.beta.1
81
- def build(attributes = {}, options = {}, type = nil)
82
- if options.is_a? Class
83
- options, type = {}, options
84
- end
85
-
86
- doc = Factory.build(type || klass, attributes, options)
81
+ def build(attributes = {}, type = nil)
82
+ doc = Factory.build(type || klass, attributes)
87
83
  append(doc)
88
84
  doc.apply_post_processed_defaults
89
85
  yield(doc) if block_given?
@@ -186,15 +182,15 @@ module Mongoid
186
182
  # conditions.
187
183
  #
188
184
  # @example Find by an id.
189
- # person.posts.find(Moped::BSON::ObjectId.new)
185
+ # person.posts.find(BSON::ObjectId.new)
190
186
  #
191
187
  # @example Find by multiple ids.
192
- # person.posts.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
188
+ # person.posts.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
193
189
  #
194
190
  # @note This will keep matching documents in memory for iteration
195
191
  # later.
196
192
  #
197
- # @param [ Moped::BSON::ObjectId, Array<Moped::BSON::ObjectId> ] arg The ids.
193
+ # @param [ BSON::ObjectId, Array<BSON::ObjectId> ] arg The ids.
198
194
  #
199
195
  # @return [ Document, Criteria ] The matching document(s).
200
196
  #
@@ -249,7 +245,7 @@ module Mongoid
249
245
  #
250
246
  # @since 2.0.0.beta.1
251
247
  def purge
252
- unless metadata.destructive?
248
+ unless __metadata.destructive?
253
249
  nullify
254
250
  else
255
251
  after_remove_error = nil
@@ -308,7 +304,7 @@ module Mongoid
308
304
  # @since 2.4.0
309
305
  def unscoped
310
306
  klass.unscoped.where(
311
- foreign_key => Conversions.flag(base.id, metadata)
307
+ foreign_key => Conversions.flag(base.id, __metadata)
312
308
  )
313
309
  end
314
310
 
@@ -324,6 +320,8 @@ module Mongoid
324
320
  #
325
321
  # @since 2.0.0.rc.1
326
322
  def append(document)
323
+ document.with(@persistence_options) if @persistence_options
324
+
327
325
  execute_callback :before_add, document
328
326
  target.push(document)
329
327
  characterize_one(document)
@@ -342,7 +340,7 @@ module Mongoid
342
340
  #
343
341
  # @since 2.0.0.rc.1
344
342
  def binding
345
- Bindings::Referenced::Many.new(base, target, metadata)
343
+ Bindings::Referenced::Many.new(base, target, __metadata)
346
344
  end
347
345
 
348
346
  # Get the collection of the relation in question.
@@ -368,8 +366,8 @@ module Mongoid
368
366
  # @since 2.0.0.beta.1
369
367
  def criteria
370
368
  Many.criteria(
371
- metadata,
372
- Conversions.flag(base.send(metadata.primary_key), metadata),
369
+ __metadata,
370
+ Conversions.flag(base.send(__metadata.primary_key), __metadata),
373
371
  base.class
374
372
  )
375
373
  end
@@ -387,8 +385,8 @@ module Mongoid
387
385
  # @since 2.1.0
388
386
  def cascade!(document)
389
387
  if persistable?
390
- if metadata.destructive?
391
- document.send(metadata.dependent)
388
+ if __metadata.destructive?
389
+ document.send(__metadata.dependent)
392
390
  else
393
391
  document.save
394
392
  end
@@ -412,7 +410,7 @@ module Mongoid
412
410
  target.send(name, *args, &block)
413
411
  else
414
412
  klass.send(:with_scope, criteria) do
415
- criteria.send(name, *args, &block)
413
+ criteria.public_send(name, *args, &block)
416
414
  end
417
415
  end
418
416
  end
@@ -488,7 +486,7 @@ module Mongoid
488
486
  # @since 2.4.0
489
487
  def remove_not_in(ids)
490
488
  removed = criteria.not_in(_id: ids)
491
- if metadata.destructive?
489
+ if __metadata.destructive?
492
490
  removed.delete_all
493
491
  else
494
492
  removed.update_all(foreign_key => nil)
@@ -497,7 +495,7 @@ module Mongoid
497
495
  if !ids.include?(doc.id)
498
496
  unbind_one(doc)
499
497
  target.delete(doc)
500
- if metadata.destructive?
498
+ if __metadata.destructive?
501
499
  doc.destroyed = true
502
500
  end
503
501
  end
@@ -571,19 +569,8 @@ module Mongoid
571
569
  )
572
570
  end
573
571
 
574
- # Eager load the relation based on the criteria.
575
- #
576
- # @example Eager load the criteria.
577
- # Proxy.eager_load(metadata, criteria)
578
- #
579
- # @param [ Metadata ] metadata The relation metadata.
580
- # @param [ Array<Object> ] ids The ids of the base docs.
581
- #
582
- # @return [ Criteria ] The criteria to eager load the relation.
583
- #
584
- # @since 2.2.0
585
- def eager_load(metadata, ids)
586
- eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_many(doc, key) }
572
+ def eager_load_klass
573
+ Relations::Eager::HasMany
587
574
  end
588
575
 
589
576
  # Returns true if the relation is an embedded one. In this case