mongoid_rails4 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 (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,639 @@
1
+ # encoding: utf-8
2
+ require "mongoid/relations/embedded/batchable"
3
+
4
+ module Mongoid
5
+ module Relations
6
+ module Embedded
7
+
8
+ # This class handles the behaviour for a document that embeds many other
9
+ # documents within in it as an array.
10
+ class Many < Relations::Many
11
+ include Batchable
12
+
13
+ # Appends a document or array of documents to the relation. Will set
14
+ # the parent and update the index in the process.
15
+ #
16
+ # @example Append a document.
17
+ # person.addresses << address
18
+ #
19
+ # @example Push a document.
20
+ # person.addresses.push(address)
21
+ #
22
+ # @param [ Document, Array<Document> ] *args Any number of documents.
23
+ def <<(*args)
24
+ docs = args.flatten
25
+ return concat(docs) if docs.size > 1
26
+ if doc = docs.first
27
+ append(doc)
28
+ doc.save if persistable? && !_assigning?
29
+ end
30
+ self
31
+ end
32
+ alias :push :<<
33
+
34
+ # Get this relation as as its representation in the database.
35
+ #
36
+ # @example Convert the relation to an attributes hash.
37
+ # person.addresses.as_document
38
+ #
39
+ # @return [ Array<Hash> ] The relation as stored in the db.
40
+ #
41
+ # @since 2.0.0.rc.1
42
+ def as_document
43
+ attributes = []
44
+ _unscoped.each do |doc|
45
+ attributes.push(doc.as_document)
46
+ end
47
+ attributes
48
+ end
49
+
50
+ # Appends an array of documents to the relation. Performs a batch
51
+ # insert of the documents instead of persisting one at a time.
52
+ #
53
+ # @example Concat with other documents.
54
+ # person.addresses.concat([ address_one, address_two ])
55
+ #
56
+ # @param [ Array<Document> ] docs The docs to add.
57
+ #
58
+ # @return [ Array<Document> ] The documents.
59
+ #
60
+ # @since 2.4.0
61
+ def concat(docs)
62
+ batch_insert(docs) unless docs.empty?
63
+ self
64
+ end
65
+
66
+ # Builds a new document in the relation and appends it to the target.
67
+ # Takes an optional type if you want to specify a subclass.
68
+ #
69
+ # @example Build a new document on the relation.
70
+ # person.people.build(:name => "Bozo")
71
+ #
72
+ # @overload build(attributes = {}, options = {}, type = nil)
73
+ # @param [ Hash ] attributes The attributes to build the document with.
74
+ # @param [ Class ] type Optional class to build the document with.
75
+ #
76
+ # @overload build(attributes = {}, type = nil)
77
+ # @param [ Hash ] attributes The attributes to build the document with.
78
+ # @param [ Class ] type Optional class to build the document with.
79
+ #
80
+ # @return [ Document ] The new document.
81
+ def build(attributes = {}, type = nil)
82
+ doc = Factory.build(type || metadata.klass, attributes)
83
+ append(doc)
84
+ doc.apply_post_processed_defaults
85
+ yield(doc) if block_given?
86
+ doc.run_callbacks(:build) { doc }
87
+ doc
88
+ end
89
+ alias :new :build
90
+
91
+ # Clear the relation. Will delete the documents from the db if they are
92
+ # already persisted.
93
+ #
94
+ # @example Clear the relation.
95
+ # person.addresses.clear
96
+ #
97
+ # @return [ Many ] The empty relation.
98
+ def clear
99
+ batch_clear(target.dup)
100
+ self
101
+ end
102
+
103
+ # Returns a count of the number of documents in the association that have
104
+ # actually been persisted to the database.
105
+ #
106
+ # Use #size if you want the total number of documents.
107
+ #
108
+ # @example Get the count of persisted documents.
109
+ # person.addresses.count
110
+ #
111
+ # @return [ Integer ] The total number of persisted embedded docs, as
112
+ # flagged by the #persisted? method.
113
+ def count
114
+ target.select { |doc| doc.persisted? }.size
115
+ end
116
+
117
+ # Delete the supplied document from the target. This method is proxied
118
+ # in order to reindex the array after the operation occurs.
119
+ #
120
+ # @example Delete the document from the relation.
121
+ # person.addresses.delete(address)
122
+ #
123
+ # @param [ Document ] document The document to be deleted.
124
+ #
125
+ # @return [ Document, nil ] The deleted document or nil if nothing deleted.
126
+ #
127
+ # @since 2.0.0.rc.1
128
+ def delete(document)
129
+ execute_callback :before_remove, document
130
+ doc = target.delete_one(document)
131
+ if doc && !_binding?
132
+ _unscoped.delete_one(doc)
133
+ if _assigning?
134
+ base.add_atomic_pull(doc)
135
+ else
136
+ doc.delete(suppress: true)
137
+ unbind_one(doc)
138
+ end
139
+ end
140
+ reindex
141
+ execute_callback :after_remove, document
142
+ doc
143
+ end
144
+
145
+ # Delete all the documents in the association without running callbacks.
146
+ #
147
+ # @example Delete all documents from the relation.
148
+ # person.addresses.delete_all
149
+ #
150
+ # @example Conditionally delete documents from the relation.
151
+ # person.addresses.delete_all({ :street => "Bond" })
152
+ #
153
+ # @param [ Hash ] conditions Conditions on which documents to delete.
154
+ #
155
+ # @return [ Integer ] The number of documents deleted.
156
+ def delete_all(conditions = {})
157
+ remove_all(conditions, :delete)
158
+ end
159
+
160
+ # Delete all the documents for which the provided block returns true.
161
+ #
162
+ # @example Delete the matching documents.
163
+ # person.addresses.delete_if do |doc|
164
+ # doc.state = "GA"
165
+ # end
166
+ #
167
+ # @return [ Many, Enumerator ] The relation or an enumerator if no
168
+ # block was provided.
169
+ #
170
+ # @since 3.1.0
171
+ def delete_if
172
+ if block_given?
173
+ target.each do |doc|
174
+ delete(doc) if yield(doc)
175
+ end
176
+ self
177
+ else
178
+ super
179
+ end
180
+ end
181
+
182
+ # Destroy all the documents in the association whilst running callbacks.
183
+ #
184
+ # @example Destroy all documents from the relation.
185
+ # person.addresses.destroy_all
186
+ #
187
+ # @example Conditionally destroy documents from the relation.
188
+ # person.addresses.destroy_all({ :street => "Bond" })
189
+ #
190
+ # @param [ Hash ] conditions Conditions on which documents to destroy.
191
+ #
192
+ # @return [ Integer ] The number of documents destroyed.
193
+ def destroy_all(conditions = {})
194
+ remove_all(conditions, :destroy)
195
+ end
196
+
197
+ # Determine if any documents in this relation exist in the database.
198
+ #
199
+ # @example Are there persisted documents?
200
+ # person.posts.exists?
201
+ #
202
+ # @return [ true, false ] True is persisted documents exist, false if not.
203
+ def exists?
204
+ count > 0
205
+ end
206
+
207
+ # Finds a document in this association through several different
208
+ # methods.
209
+ #
210
+ # @example Find a document by its id.
211
+ # person.addresses.find(Moped::BSON::ObjectId.new)
212
+ #
213
+ # @example Find documents for multiple ids.
214
+ # person.addresses.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
215
+ #
216
+ # @param [ Array<Object> ] args Various arguments.
217
+ #
218
+ # @return [ Array<Document>, Document ] A single or multiple documents.
219
+ def find(*args)
220
+ criteria.find(*args)
221
+ end
222
+
223
+ # Instantiate a new embeds_many relation.
224
+ #
225
+ # @example Create the new relation.
226
+ # Many.new(person, addresses, metadata)
227
+ #
228
+ # @param [ Document ] base The document this relation hangs off of.
229
+ # @param [ Array<Document> ] target The child documents of the relation.
230
+ # @param [ Metadata ] metadata The relation's metadata
231
+ #
232
+ # @return [ Many ] The proxy.
233
+ def initialize(base, target, metadata)
234
+ init(base, target, metadata) do
235
+ target.each_with_index do |doc, index|
236
+ integrate(doc)
237
+ doc._index = index
238
+ end
239
+ @_unscoped = target.dup
240
+ @target = scope(target)
241
+ end
242
+ end
243
+
244
+ # Get all the documents in the relation that are loaded into memory.
245
+ #
246
+ # @example Get the in memory documents.
247
+ # relation.in_memory
248
+ #
249
+ # @return [ Array<Document> ] The documents in memory.
250
+ #
251
+ # @since 2.1.0
252
+ def in_memory
253
+ target
254
+ end
255
+
256
+ # Pop documents off the relation. This can be a single document or
257
+ # multiples, and will automatically persist the changes.
258
+ #
259
+ # @example Pop a single document.
260
+ # relation.pop
261
+ #
262
+ # @example Pop multiple documents.
263
+ # relation.pop(3)
264
+ #
265
+ # @param [ Integer ] count The number of documents to pop, or 1 if not
266
+ # provided.
267
+ #
268
+ # @return [ Document, Array<Document> ] The popped document(s).
269
+ #
270
+ # @since 3.0.0
271
+ def pop(count = nil)
272
+ if count
273
+ if docs = target[target.size - count, target.size]
274
+ docs.each { |doc| delete(doc) }
275
+ end
276
+ else
277
+ delete(target[-1])
278
+ end
279
+ end
280
+
281
+ # Substitutes the supplied target documents for the existing documents
282
+ # in the relation.
283
+ #
284
+ # @example Substitute the relation's target.
285
+ # person.addresses.substitute([ address ])
286
+ #
287
+ # @param [ Array<Document> ] docs The replacement docs.
288
+ #
289
+ # @return [ Many ] The proxied relation.
290
+ #
291
+ # @since 2.0.0.rc.1
292
+ def substitute(docs)
293
+ batch_replace(docs)
294
+ self
295
+ end
296
+
297
+ # Return the relation with all previous scoping removed. This is the
298
+ # exact representation of the docs in the database.
299
+ #
300
+ # @example Get the unscoped documents.
301
+ # person.addresses.unscoped
302
+ #
303
+ # @return [ Criteria ] The unscoped relation.
304
+ #
305
+ # @since 2.4.0
306
+ def unscoped
307
+ criterion = klass.unscoped
308
+ criterion.embedded = true
309
+ criterion.documents = _unscoped.delete_if(&:marked_for_destruction?)
310
+ criterion
311
+ end
312
+
313
+ private
314
+
315
+ # Appends the document to the target array, updating the index on the
316
+ # document at the same time.
317
+ #
318
+ # @example Append to the document.
319
+ # relation.append(document)
320
+ #
321
+ # @param [ Document ] document The document to append to the target.
322
+ #
323
+ # @since 2.0.0.rc.1
324
+ def append(document)
325
+ execute_callback :before_add, document
326
+ target.push(*scope([document]))
327
+ _unscoped.push(document)
328
+ integrate(document)
329
+ document._index = _unscoped.size - 1
330
+ execute_callback :after_add, document
331
+ end
332
+
333
+ # Instantiate the binding associated with this relation.
334
+ #
335
+ # @example Create the binding.
336
+ # relation.binding([ address ])
337
+ #
338
+ # @param [ Array<Document> ] new_target The new documents to bind with.
339
+ #
340
+ # @return [ Binding ] The many binding.
341
+ #
342
+ # @since 2.0.0.rc.1
343
+ def binding
344
+ Bindings::Embedded::Many.new(base, target, metadata)
345
+ end
346
+
347
+ # Returns the criteria object for the target class with its documents set
348
+ # to target.
349
+ #
350
+ # @example Get a criteria for the relation.
351
+ # relation.criteria
352
+ #
353
+ # @return [ Criteria ] A new criteria.
354
+ def criteria
355
+ criterion = klass.scoped
356
+ criterion.embedded = true
357
+ criterion.documents = target
358
+ Many.apply_ordering(criterion, metadata)
359
+ end
360
+
361
+ # Deletes one document from the target and unscoped.
362
+ #
363
+ # @api private
364
+ #
365
+ # @example Delete one document.
366
+ # relation.delete_one(doc)
367
+ #
368
+ # @param [ Document ] document The document to delete.
369
+ #
370
+ # @since 2.4.7
371
+ def delete_one(document)
372
+ target.delete_one(document)
373
+ _unscoped.delete_one(document)
374
+ reindex
375
+ end
376
+
377
+ # Integrate the document into the relation. will set its metadata and
378
+ # attempt to bind the inverse.
379
+ #
380
+ # @example Integrate the document.
381
+ # relation.integrate(document)
382
+ #
383
+ # @param [ Document ] document The document to integrate.
384
+ #
385
+ # @since 2.1.0
386
+ def integrate(document)
387
+ characterize_one(document)
388
+ bind_one(document)
389
+ end
390
+
391
+ # If the target array does not respond to the supplied method then try to
392
+ # find a named scope or criteria on the class and send the call there.
393
+ #
394
+ # If the method exists on the array, use the default proxy behavior.
395
+ #
396
+ # @param [ Symbol, String ] name The name of the method.
397
+ # @param [ Array ] args The method args
398
+ # @param [ Proc ] block Optional block to pass.
399
+ #
400
+ # @return [ Criteria, Object ] A Criteria or return value from the target.
401
+ def method_missing(name, *args, &block)
402
+ return super if target.respond_to?(name)
403
+ klass.send(:with_scope, criteria) do
404
+ criteria.send(name, *args, &block)
405
+ end
406
+ end
407
+
408
+ # Are we able to persist this relation?
409
+ #
410
+ # @example Can we persist the relation?
411
+ # relation.persistable?
412
+ #
413
+ # @return [ true, false ] If the relation is persistable.
414
+ #
415
+ # @since 2.1.0
416
+ def persistable?
417
+ base.persisted? && !_binding?
418
+ end
419
+
420
+ # Reindex all the target elements. This is useful when performing
421
+ # operations on the proxied target directly and the indices need to
422
+ # match that on the database side.
423
+ #
424
+ # @example Reindex the relation.
425
+ # person.addresses.reindex
426
+ #
427
+ # @since 2.0.0.rc.1
428
+ def reindex
429
+ _unscoped.each_with_index do |doc, index|
430
+ doc._index = index
431
+ end
432
+ end
433
+
434
+ # Apply the metadata ordering or the default scoping to the provided
435
+ # documents.
436
+ #
437
+ # @example Apply scoping.
438
+ # person.addresses.scope(target)
439
+ #
440
+ # @param [ Array<Document> ] docs The documents to scope.
441
+ #
442
+ # @return [ Array<Document> ] The scoped docs.
443
+ #
444
+ # @since 2.4.0
445
+ def scope(docs)
446
+ return docs unless metadata.order || metadata.klass.default_scoping?
447
+ crit = metadata.klass.order_by(metadata.order)
448
+ crit.embedded = true
449
+ crit.documents = docs
450
+ crit.entries
451
+ end
452
+
453
+ # Remove all documents from the relation, either with a delete or a
454
+ # destroy depending on what this was called through.
455
+ #
456
+ # @example Destroy documents from the relation.
457
+ # relation.remove_all({ :num => 1 }, true)
458
+ #
459
+ # @param [ Hash ] conditions Conditions to filter by.
460
+ # @param [ true, false ] destroy If true then destroy, else delete.
461
+ #
462
+ # @return [ Integer ] The number of documents removed.
463
+ def remove_all(conditions = {}, method = :delete)
464
+ criteria = where(conditions || {})
465
+ removed = criteria.size
466
+ batch_remove(criteria, method)
467
+ removed
468
+ end
469
+
470
+ # Get the internal unscoped documents.
471
+ #
472
+ # @example Get the unscoped documents.
473
+ # relation._unscoped
474
+ #
475
+ # @return [ Array<Document> ] The unscoped documents.
476
+ #
477
+ # @since 2.4.0
478
+ def _unscoped
479
+ @_unscoped ||= []
480
+ end
481
+
482
+ # Set the internal unscoped documents.
483
+ #
484
+ # @example Set the unscoped documents.
485
+ # relation._unscoped = docs
486
+ #
487
+ # @param [ Array<Document> ] docs The documents.
488
+ #
489
+ # @return [ Array<Document ] The unscoped docs.
490
+ #
491
+ # @since 2.4.0
492
+ def _unscoped=(docs)
493
+ @_unscoped = docs
494
+ end
495
+
496
+ class << self
497
+
498
+ # Return the builder that is responsible for generating the documents
499
+ # that will be used by this relation.
500
+ #
501
+ # @example Get the builder.
502
+ # Embedded::Many.builder(meta, object)
503
+ #
504
+ # @param [ Document ] base The base document.
505
+ # @param [ Metadata ] meta The metadata of the relation.
506
+ # @param [ Document, Hash ] object A document or attributes to build
507
+ # with.
508
+ #
509
+ # @return [ Builder ] A newly instantiated builder object.
510
+ #
511
+ # @since 2.0.0.rc.1
512
+ def builder(base, meta, object)
513
+ Builders::Embedded::Many.new(base, meta, object)
514
+ end
515
+
516
+ # Returns true if the relation is an embedded one. In this case
517
+ # always true.
518
+ #
519
+ # @example Is the relation embedded?
520
+ # Embedded::Many.embedded?
521
+ #
522
+ # @return [ true ] true.
523
+ #
524
+ # @since 2.0.0.rc.1
525
+ def embedded?
526
+ true
527
+ end
528
+
529
+ # Returns the suffix of the foreign key field, either "_id" or "_ids".
530
+ #
531
+ # @example Get the suffix for the foreign key.
532
+ # Referenced::Many.foreign_key_suffix
533
+ #
534
+ # @return [ nil ] nil.
535
+ #
536
+ # @since 3.0.0
537
+ def foreign_key_suffix
538
+ nil
539
+ end
540
+
541
+ # Returns the macro for this relation. Used mostly as a helper in
542
+ # reflection.
543
+ #
544
+ # @example Get the relation macro.
545
+ # Mongoid::Relations::Embedded::Many.macro
546
+ #
547
+ # @return [ Symbol ] :embeds_many
548
+ #
549
+ # @since 2.0.0.rc.1
550
+ def macro
551
+ :embeds_many
552
+ end
553
+
554
+ # Return the nested builder that is responsible for generating the
555
+ # documents that will be used by this relation.
556
+ #
557
+ # @example Get the nested builder.
558
+ # NestedAttributes::Many.builder(attributes, options)
559
+ #
560
+ # @param [ Metadata ] metadata The relation metadata.
561
+ # @param [ Hash ] attributes The attributes to build with.
562
+ # @param [ Hash ] options The builder options.
563
+ #
564
+ # @option options [ true, false ] :allow_destroy Can documents be
565
+ # deleted?
566
+ # @option options [ Integer ] :limit Max number of documents to
567
+ # create at once.
568
+ # @option options [ Proc, Symbol ] :reject_if If documents match this
569
+ # option then they are ignored.
570
+ # @option options [ true, false ] :update_only Only existing documents
571
+ # can be modified.
572
+ #
573
+ # @return [ NestedBuilder ] The nested attributes builder.
574
+ #
575
+ # @since 2.0.0.rc.1
576
+ def nested_builder(metadata, attributes, options)
577
+ Builders::NestedAttributes::Many.new(metadata, attributes, options)
578
+ end
579
+
580
+ # Get the path calculator for the supplied document.
581
+ #
582
+ # @example Get the path calculator.
583
+ # Proxy.path(document)
584
+ #
585
+ # @param [ Document ] document The document to calculate on.
586
+ #
587
+ # @return [ Mongoid::Atomic::Paths::Embedded::Many ]
588
+ # The embedded many atomic path calculator.
589
+ #
590
+ # @since 2.1.0
591
+ def path(document)
592
+ Mongoid::Atomic::Paths::Embedded::Many.new(document)
593
+ end
594
+
595
+ # Tells the caller if this relation is one that stores the foreign
596
+ # key on its own objects.
597
+ #
598
+ # @example Does this relation store a foreign key?
599
+ # Embedded::Many.stores_foreign_key?
600
+ #
601
+ # @return [ false ] false.
602
+ #
603
+ # @since 2.0.0.rc.1
604
+ def stores_foreign_key?
605
+ false
606
+ end
607
+
608
+ # Get the valid options allowed with this relation.
609
+ #
610
+ # @example Get the valid options.
611
+ # Relation.valid_options
612
+ #
613
+ # @return [ Array<Symbol> ] The valid options.
614
+ #
615
+ # @since 2.1.0
616
+ def valid_options
617
+ [
618
+ :as, :cascade_callbacks, :cyclic, :order, :store_as,
619
+ :before_add, :after_add, :before_remove, :after_remove
620
+ ]
621
+ end
622
+
623
+ # Get the default validation setting for the relation. Determines if
624
+ # by default a validates associated will occur.
625
+ #
626
+ # @example Get the validation default.
627
+ # Proxy.validation_default
628
+ #
629
+ # @return [ true, false ] The validation default.
630
+ #
631
+ # @since 2.1.9
632
+ def validation_default
633
+ true
634
+ end
635
+ end
636
+ end
637
+ end
638
+ end
639
+ end