mongoid 5.4.1 → 6.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
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