mongoid 5.4.1 → 6.0.0.beta

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 (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -8,6 +8,18 @@ module Mongoid
8
8
  # multiple documents.
9
9
  class In < Relations::One
10
10
 
11
+ # The allowed options when defining this relation.
12
+ #
13
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
14
+ #
15
+ # @since 6.0.0
16
+ VALID_OPTIONS = [
17
+ :autobuild,
18
+ :cyclic,
19
+ :polymorphic,
20
+ :touch
21
+ ].freeze
22
+
11
23
  # Instantiate a new embedded_in relation.
12
24
  #
13
25
  # @example Create the new relation.
@@ -31,7 +43,7 @@ module Mongoid
31
43
  # @example Substitute the new document.
32
44
  # person.name.substitute(new_name)
33
45
  #
34
- # @param [ Document ] replacement A document to replace the target.
46
+ # @param [ Document ] other A document to replace the target.
35
47
  #
36
48
  # @return [ Document, nil ] The relation or nil.
37
49
  #
@@ -55,6 +67,8 @@ module Mongoid
55
67
  # @example Get the binding.
56
68
  # binding([ address ])
57
69
  #
70
+ # @param [ Proxy ] new_target The new documents to bind with.
71
+ #
58
72
  # @return [ Binding ] A binding object.
59
73
  #
60
74
  # @since 2.0.0.rc.1
@@ -207,7 +221,7 @@ module Mongoid
207
221
  #
208
222
  # @since 2.1.0
209
223
  def valid_options
210
- [ :autobuild, :cyclic, :polymorphic, :touch ]
224
+ VALID_OPTIONS
211
225
  end
212
226
 
213
227
  # Get the default validation setting for the relation. Determines if
@@ -10,6 +10,23 @@ module Mongoid
10
10
  class Many < Relations::Many
11
11
  include Batchable
12
12
 
13
+ # The allowed options when defining this relation.
14
+ #
15
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
16
+ #
17
+ # @since 6.0.0
18
+ VALID_OPTIONS = [
19
+ :as,
20
+ :cascade_callbacks,
21
+ :cyclic,
22
+ :order,
23
+ :store_as,
24
+ :before_add,
25
+ :after_add,
26
+ :before_remove,
27
+ :after_remove
28
+ ].freeze
29
+
13
30
  # Appends a document or array of documents to the relation. Will set
14
31
  # the parent and update the index in the process.
15
32
  #
@@ -19,8 +36,7 @@ module Mongoid
19
36
  # @example Push a document.
20
37
  # person.addresses.push(address)
21
38
  #
22
- # @param [ Document, Array<Document> ] args Any number of documents.
23
- #
39
+ # @param [ Document, Array<Document> ] *args Any number of documents.
24
40
  def <<(*args)
25
41
  docs = args.flatten
26
42
  return concat(docs) if docs.size > 1
@@ -60,7 +76,7 @@ module Mongoid
60
76
  #
61
77
  # @since 2.4.0
62
78
  def concat(docs)
63
- batch_push(docs) unless docs.empty?
79
+ batch_insert(docs) unless docs.empty?
64
80
  self
65
81
  end
66
82
 
@@ -338,6 +354,8 @@ module Mongoid
338
354
  # @example Create the binding.
339
355
  # relation.binding([ address ])
340
356
  #
357
+ # @param [ Array<Document> ] new_target The new documents to bind with.
358
+ #
341
359
  # @return [ Binding ] The many binding.
342
360
  #
343
361
  # @since 2.0.0.rc.1
@@ -460,7 +478,7 @@ module Mongoid
460
478
  # relation.remove_all({ :num => 1 }, true)
461
479
  #
462
480
  # @param [ Hash ] conditions Conditions to filter by.
463
- # @param [ true, false ] method
481
+ # @param [ true, false ] destroy If true then destroy, else delete.
464
482
  #
465
483
  # @return [ Integer ] The number of documents removed.
466
484
  def remove_all(conditions = {}, method = :delete)
@@ -617,10 +635,7 @@ module Mongoid
617
635
  #
618
636
  # @since 2.1.0
619
637
  def valid_options
620
- [
621
- :as, :cascade_callbacks, :cyclic, :order, :store_as,
622
- :before_add, :after_add, :before_remove, :after_remove
623
- ]
638
+ VALID_OPTIONS
624
639
  end
625
640
 
626
641
  # Get the default validation setting for the relation. Determines if
@@ -7,6 +7,19 @@ module Mongoid
7
7
  # relations.
8
8
  class One < Relations::One
9
9
 
10
+ # The allowed options when defining this relation.
11
+ #
12
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
13
+ #
14
+ # @since 6.0.0
15
+ VALID_OPTIONS = [
16
+ :autobuild,
17
+ :as,
18
+ :cascade_callbacks,
19
+ :cyclic,
20
+ :store_as
21
+ ].freeze
22
+
10
23
  # Instantiate a new embeds_one relation.
11
24
  #
12
25
  # @example Create the new proxy.
@@ -31,7 +44,7 @@ module Mongoid
31
44
  # @example Substitute the new document.
32
45
  # person.name.substitute(new_name)
33
46
  #
34
- # @param [ Document ] replacement A document to replace the target.
47
+ # @param [ Document ] other A document to replace the target.
35
48
  #
36
49
  # @return [ Document, nil ] The relation or nil.
37
50
  #
@@ -61,6 +74,8 @@ module Mongoid
61
74
  # @example Get the binding.
62
75
  # relation.binding([ address ])
63
76
  #
77
+ # @param [ Document ] new_target The new document to bind with.
78
+ #
64
79
  # @return [ Binding ] The relation's binding.
65
80
  #
66
81
  # @since 2.0.0.rc.1
@@ -200,7 +215,7 @@ module Mongoid
200
215
  #
201
216
  # @since 2.1.0
202
217
  def valid_options
203
- [ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
218
+ VALID_OPTIONS
204
219
  end
205
220
 
206
221
  # Get the default validation setting for the relation. Determines if
@@ -140,6 +140,7 @@ module Mongoid
140
140
  aliased_fields[name.to_s] = meta.foreign_key
141
141
  touchable(meta)
142
142
  add_counter_cache_callbacks(meta) if meta.counter_cached?
143
+ validates(name, presence: true) if require_association?(options)
143
144
  meta
144
145
  end
145
146
 
@@ -326,8 +327,7 @@ module Mongoid
326
327
  # Model.reference_one_to_one(:name, meta)
327
328
  #
328
329
  # @param [ Symbol ] name The name of the relation.
329
- # @param [ Symbol ] options The association options.
330
- # @param [ Metadata ] relation The relation.
330
+ # @param [ Metadata ] meta The relation metadata.
331
331
  #
332
332
  # @return [ Class ] The model class.
333
333
  #
@@ -350,9 +350,16 @@ module Mongoid
350
350
  # @param [ Symbol ] name The name of the relation.
351
351
  # @param [ Metadata ] metadata The metadata for the relation.
352
352
  def relate(name, metadata)
353
+ Fields::Validators::Macro.validate_relation(self, name)
353
354
  self.relations = relations.merge(name.to_s => metadata)
354
355
  getter(name, metadata).setter(name, metadata).existence_check(name)
355
356
  end
357
+
358
+ def require_association?(options = {})
359
+ required = options[:required] if options.key?(:required)
360
+ required = !options[:optional] if options.key?(:optional) && required.nil?
361
+ required.nil? ? Mongoid.belongs_to_required_by_default : required
362
+ end
356
363
  end
357
364
  end
358
365
  end
@@ -920,7 +920,7 @@ module Mongoid
920
920
  # @example Find the module from the parts.
921
921
  # metadata.find_from_parts([ "Namespace", "Module" ])
922
922
  #
923
- # @param [ Array<String> ] modules The modules.
923
+ # @param [ Array<String> ] The modules.
924
924
  #
925
925
  # @return [ String ] The matching module.
926
926
  #
@@ -1127,7 +1127,7 @@ module Mongoid
1127
1127
  # @example Find the inverses.
1128
1128
  # metadata.lookup_inverses(other)
1129
1129
  #
1130
- # @param [ Document ] other The inverse document.
1130
+ # @param [ Document ] : The inverse document.
1131
1131
  #
1132
1132
  # @return [ Array<String> ] The inverse names.
1133
1133
  def lookup_inverses(other)
@@ -1150,7 +1150,7 @@ module Mongoid
1150
1150
  # @example Find the inverse.
1151
1151
  # metadata.lookup_inverse(other)
1152
1152
  #
1153
- # @param [ Document ] other The inverse document.
1153
+ # @param [ Document ] : The inverse document.
1154
1154
  #
1155
1155
  # @return [ String ] The inverse name.
1156
1156
  #
@@ -25,7 +25,7 @@ module Mongoid
25
25
  # @example Is there a reject proc?
26
26
  # builder.reject?
27
27
  #
28
- # @param [ Document ] document The parent document of the relation
28
+ # @param The parent document of the relation
29
29
  # @param [ Hash ] attrs The attributes to check for rejection.
30
30
  #
31
31
  # @return [ true, false ] True and call proc or method if rejectable, false if not.
@@ -17,7 +17,7 @@ module Mongoid
17
17
  :name,
18
18
  :relation,
19
19
  :validate
20
- ]
20
+ ].freeze
21
21
 
22
22
  # Determine if the provided options are valid for the relation.
23
23
  #
@@ -32,7 +32,7 @@ module Mongoid
32
32
  #
33
33
  # @since 2.1.0
34
34
  def validate!(options)
35
- valid_options = options[:relation].valid_options.concat(COMMON)
35
+ valid_options = options[:relation]::VALID_OPTIONS + COMMON
36
36
  options.keys.each do |key|
37
37
  if !valid_options.include?(key)
38
38
  raise Errors::InvalidOptions.new(
@@ -84,35 +84,6 @@ module Mongoid
84
84
  target
85
85
  end
86
86
 
87
- # Tell the next persistence operation to store in a specific collection,
88
- # database or client.
89
- #
90
- # @example Save the current document to a different collection.
91
- # model.with(collection: "secondary").save
92
- #
93
- # @example Save the current document to a different database.
94
- # model.with(database: "secondary").save
95
- #
96
- # @example Save the current document to a different client.
97
- # model.with(client: "replica_set").save
98
- #
99
- # @example Save with a combination of options.
100
- # model.with(client: "sharded", database: "secondary").save
101
- #
102
- # @param [ Hash ] options The storage options.
103
- #
104
- # @option options [ String, Symbol ] :collection The collection name.
105
- # @option options [ String, Symbol ] :database The database name.
106
- # @option options [ String, Symbol ] :client The client name.
107
- #
108
- # @return [ Document ] The current document.
109
- #
110
- # @since 3.0.0
111
- def with(options)
112
- @persistence_options = options
113
- self
114
- end
115
-
116
87
  protected
117
88
 
118
89
  # Get the collection from the root of the hierarchy.
@@ -125,7 +96,6 @@ module Mongoid
125
96
  # @since 2.0.0
126
97
  def collection
127
98
  root = base._root
128
- root.with(@persistence_options)
129
99
  root.collection unless root.embedded?
130
100
  end
131
101
 
@@ -145,8 +115,7 @@ module Mongoid
145
115
  # to the target of the proxy. This can be overridden in special cases.
146
116
  #
147
117
  # @param [ String, Symbol ] name The name of the method.
148
- # @param [ Array ] args The arguments passed to the method.
149
- #
118
+ # @param [ Array ] *args The arguments passed to the method.
150
119
  def method_missing(name, *args, &block)
151
120
  target.send(name, *args, &block)
152
121
  end
@@ -184,7 +153,7 @@ module Mongoid
184
153
  # @example returns the before_add callback method name
185
154
  # callback_method(:before_add)
186
155
  #
187
- # @param [ Symbol ] callback_name Which callback
156
+ # @param [ Symbol ] which callback
188
157
  #
189
158
  # @return [ Array ] with callback methods to be executed, the array may have symbols and Procs
190
159
  #
@@ -10,6 +10,24 @@ module Mongoid
10
10
  class In < Relations::One
11
11
  include Evolvable
12
12
 
13
+ # The allowed options when defining this relation.
14
+ #
15
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
16
+ #
17
+ # @since 6.0.0
18
+ VALID_OPTIONS = [
19
+ :autobuild,
20
+ :autosave,
21
+ :dependent,
22
+ :foreign_key,
23
+ :index,
24
+ :polymorphic,
25
+ :primary_key,
26
+ :touch,
27
+ :optional,
28
+ :required
29
+ ].freeze
30
+
13
31
  # Instantiate a new referenced_in relation.
14
32
  #
15
33
  # @example Create the new relation.
@@ -44,7 +62,8 @@ module Mongoid
44
62
  # @example Substitute the relation.
45
63
  # name.substitute(new_name)
46
64
  #
47
- # @param [ Document, Array<Document> ] replacement The replacement.
65
+ # @param [ Document, Array<Document> ] new_target The replacement.
66
+ # @param [ true, false ] building Are we in build mode?
48
67
  #
49
68
  # @return [ In, nil ] The relation or nil.
50
69
  #
@@ -64,6 +83,8 @@ module Mongoid
64
83
  # @example Get the binding object.
65
84
  # binding([ address ])
66
85
  #
86
+ # @param [ Document, Array<Document> ] new_target The replacement.
87
+ #
67
88
  # @return [ Binding ] The binding object.
68
89
  #
69
90
  # @since 2.0.0.rc.1
@@ -264,16 +285,7 @@ module Mongoid
264
285
  #
265
286
  # @since 2.1.0
266
287
  def valid_options
267
- [
268
- :autobuild,
269
- :autosave,
270
- :dependent,
271
- :foreign_key,
272
- :index,
273
- :polymorphic,
274
- :primary_key,
275
- :touch
276
- ]
288
+ VALID_OPTIONS
277
289
  end
278
290
 
279
291
  # Get the default validation setting for the relation. Determines if
@@ -10,6 +10,24 @@ module Mongoid
10
10
  delegate :count, to: :criteria
11
11
  delegate :first, :in_memory, :last, :reset, :uniq, to: :target
12
12
 
13
+ # The allowed options when defining this relation.
14
+ #
15
+ # @return [ Array<Symbol> ] The allowed options when defining this relation.
16
+ #
17
+ # @since 6.0.0
18
+ VALID_OPTIONS = [
19
+ :after_add,
20
+ :after_remove,
21
+ :as,
22
+ :autosave,
23
+ :before_add,
24
+ :before_remove,
25
+ :dependent,
26
+ :foreign_key,
27
+ :order,
28
+ :primary_key
29
+ ].freeze
30
+
13
31
  # Appends a document or array of documents to the relation. Will set
14
32
  # the parent and update the index in the process.
15
33
  #
@@ -22,7 +40,7 @@ module Mongoid
22
40
  # @example Concat with other documents.
23
41
  # person.posts.concat([ post_one, post_two ])
24
42
  #
25
- # @param [ Document, Array<Document> ] args Any number of documents.
43
+ # @param [ Document, Array<Document> ] *args Any number of documents.
26
44
  #
27
45
  # @return [ Array<Document> ] The loaded docs.
28
46
  #
@@ -190,7 +208,7 @@ module Mongoid
190
208
  # @note This will keep matching documents in memory for iteration
191
209
  # later.
192
210
  #
193
- # @param [ BSON::ObjectId, Array<BSON::ObjectId> ] args The ids.
211
+ # @param [ BSON::ObjectId, Array<BSON::ObjectId> ] arg The ids.
194
212
  #
195
213
  # @return [ Document, Criteria ] The matching document(s).
196
214
  #
@@ -320,7 +338,6 @@ module Mongoid
320
338
  #
321
339
  # @since 2.0.0.rc.1
322
340
  def append(document)
323
- document.with(@persistence_options) if @persistence_options
324
341
  with_add_callbacks(document, already_related?(document)) do
325
342
  target.push(document)
326
343
  characterize_one(document)
@@ -368,6 +385,8 @@ module Mongoid
368
385
  # @example Get the binding.
369
386
  # relation.binding([ address ])
370
387
  #
388
+ # @param [ Array<Document> ] new_target The new documents to bind with.
389
+ #
371
390
  # @return [ Binding ] The binding.
372
391
  #
373
392
  # @since 2.0.0.rc.1
@@ -491,7 +510,7 @@ module Mongoid
491
510
  # person.posts.delete_all({ :title => "Testing" })
492
511
  #
493
512
  # @param [ Hash ] conditions Optional conditions to delete with.
494
- # @param [ Symbol ] method The deletion method to call.
513
+ # @param [ Symbol ] The deletion method to call.
495
514
  #
496
515
  # @return [ Integer ] The number of documents deleted.
497
516
  #
@@ -729,18 +748,7 @@ module Mongoid
729
748
  #
730
749
  # @since 2.1.0
731
750
  def valid_options
732
- [
733
- :after_add,
734
- :after_remove,
735
- :as,
736
- :autosave,
737
- :before_add,
738
- :before_remove,
739
- :dependent,
740
- :foreign_key,
741
- :order,
742
- :primary_key
743
- ]
751
+ VALID_OPTIONS
744
752
  end
745
753
 
746
754
  # Get the default validation setting for the relation. Determines if