mongoid 5.4.1 → 6.1.1

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 (260) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3 -3
  3. data/lib/config/locales/en.yml +19 -0
  4. data/lib/mongoid.rb +4 -4
  5. data/lib/mongoid/atomic.rb +2 -2
  6. data/lib/mongoid/atomic/modifiers.rb +8 -12
  7. data/lib/mongoid/attributes.rb +22 -21
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/cacheable.rb +36 -0
  10. data/lib/mongoid/changeable.rb +36 -0
  11. data/lib/mongoid/clients.rb +8 -63
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/storage_options.rb +1 -69
  14. data/lib/mongoid/composable.rb +29 -3
  15. data/lib/mongoid/config.rb +1 -0
  16. data/lib/mongoid/contextual/atomic.rb +5 -8
  17. data/lib/mongoid/contextual/map_reduce.rb +0 -4
  18. data/lib/mongoid/contextual/memory.rb +2 -2
  19. data/lib/mongoid/contextual/mongo.rb +40 -22
  20. data/lib/mongoid/contextual/none.rb +12 -0
  21. data/lib/mongoid/copyable.rb +13 -6
  22. data/lib/mongoid/criteria.rb +5 -2
  23. data/lib/mongoid/criteria/marshalable.rb +2 -2
  24. data/lib/mongoid/criteria/modifiable.rb +17 -1
  25. data/lib/mongoid/criteria/options.rb +25 -0
  26. data/lib/mongoid/criteria/queryable.rb +87 -0
  27. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  28. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  46. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  47. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  48. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  49. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  50. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  51. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  52. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  53. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  54. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  55. data/lib/mongoid/document.rb +30 -37
  56. data/lib/mongoid/errors.rb +2 -0
  57. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  58. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  59. data/lib/mongoid/errors/invalid_field.rb +2 -2
  60. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  61. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  62. data/lib/mongoid/evolvable.rb +1 -1
  63. data/lib/mongoid/extensions.rb +0 -4
  64. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  65. data/lib/mongoid/extensions/date.rb +4 -1
  66. data/lib/mongoid/extensions/decimal128.rb +3 -3
  67. data/lib/mongoid/extensions/hash.rb +1 -0
  68. data/lib/mongoid/extensions/string.rb +4 -3
  69. data/lib/mongoid/extensions/time.rb +4 -1
  70. data/lib/mongoid/fields/validators/macro.rb +18 -0
  71. data/lib/mongoid/findable.rb +2 -2
  72. data/lib/mongoid/indexable.rb +15 -13
  73. data/lib/mongoid/interceptable.rb +5 -22
  74. data/lib/mongoid/matchable.rb +13 -7
  75. data/lib/mongoid/matchable/all.rb +2 -2
  76. data/lib/mongoid/matchable/and.rb +3 -3
  77. data/lib/mongoid/matchable/default.rb +2 -2
  78. data/lib/mongoid/matchable/elem_match.rb +28 -0
  79. data/lib/mongoid/matchable/exists.rb +2 -2
  80. data/lib/mongoid/matchable/gt.rb +4 -2
  81. data/lib/mongoid/matchable/gte.rb +4 -2
  82. data/lib/mongoid/matchable/in.rb +2 -2
  83. data/lib/mongoid/matchable/lt.rb +4 -2
  84. data/lib/mongoid/matchable/lte.rb +4 -2
  85. data/lib/mongoid/matchable/ne.rb +2 -2
  86. data/lib/mongoid/matchable/nin.rb +2 -2
  87. data/lib/mongoid/matchable/or.rb +3 -3
  88. data/lib/mongoid/matchable/regexp.rb +3 -3
  89. data/lib/mongoid/matchable/size.rb +2 -2
  90. data/lib/mongoid/persistable.rb +3 -5
  91. data/lib/mongoid/persistable/creatable.rb +2 -2
  92. data/lib/mongoid/persistable/deletable.rb +1 -1
  93. data/lib/mongoid/persistable/settable.rb +1 -1
  94. data/lib/mongoid/persistable/updatable.rb +5 -12
  95. data/lib/mongoid/persistable/upsertable.rb +1 -1
  96. data/lib/mongoid/persistence_context.rb +215 -0
  97. data/lib/mongoid/query_cache.rb +3 -6
  98. data/lib/mongoid/relations/accessors.rb +3 -0
  99. data/lib/mongoid/relations/auto_save.rb +12 -4
  100. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  101. data/lib/mongoid/relations/counter_cache.rb +15 -5
  102. data/lib/mongoid/relations/eager.rb +6 -11
  103. data/lib/mongoid/relations/eager/base.rb +3 -3
  104. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  105. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  106. data/lib/mongoid/relations/embedded/batchable.rb +12 -36
  107. data/lib/mongoid/relations/embedded/in.rb +13 -1
  108. data/lib/mongoid/relations/embedded/many.rb +28 -10
  109. data/lib/mongoid/relations/embedded/one.rb +14 -1
  110. data/lib/mongoid/relations/macros.rb +9 -1
  111. data/lib/mongoid/relations/metadata.rb +3 -3
  112. data/lib/mongoid/relations/options.rb +2 -2
  113. data/lib/mongoid/relations/proxy.rb +1 -31
  114. data/lib/mongoid/relations/referenced/in.rb +19 -10
  115. data/lib/mongoid/relations/referenced/many.rb +23 -17
  116. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  117. data/lib/mongoid/relations/referenced/one.rb +15 -1
  118. data/lib/mongoid/relations/synchronization.rb +11 -11
  119. data/lib/mongoid/relations/touchable.rb +6 -3
  120. data/lib/mongoid/reloadable.rb +1 -1
  121. data/lib/mongoid/serializable.rb +1 -1
  122. data/lib/mongoid/traversable.rb +1 -1
  123. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  124. data/lib/mongoid/version.rb +1 -1
  125. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +14 -3
  126. data/spec/app/models/album.rb +5 -1
  127. data/spec/app/models/artist.rb +21 -0
  128. data/spec/app/models/book.rb +2 -1
  129. data/spec/app/models/dokument.rb +1 -0
  130. data/spec/app/models/ordered_post.rb +5 -0
  131. data/spec/app/models/oscar.rb +1 -2
  132. data/spec/app/models/page.rb +1 -1
  133. data/spec/app/models/person.rb +3 -3
  134. data/spec/app/models/princess.rb +2 -0
  135. data/spec/app/models/record.rb +1 -0
  136. data/spec/app/models/subscription.rb +1 -0
  137. data/spec/app/models/thing.rb +1 -1
  138. data/spec/config/mongoid.yml +15 -0
  139. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  140. data/spec/mongoid/atomic_spec.rb +17 -17
  141. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  142. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  143. data/spec/mongoid/attributes_spec.rb +90 -5
  144. data/spec/mongoid/cacheable_spec.rb +112 -0
  145. data/spec/mongoid/changeable_spec.rb +58 -0
  146. data/spec/mongoid/clients/factory_spec.rb +31 -3
  147. data/spec/mongoid/clients/options_spec.rb +382 -96
  148. data/spec/mongoid/clients_spec.rb +243 -101
  149. data/spec/mongoid/composable_spec.rb +7 -0
  150. data/spec/mongoid/config_spec.rb +67 -11
  151. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  152. data/spec/mongoid/contextual/mongo_spec.rb +165 -20
  153. data/spec/mongoid/contextual/none_spec.rb +15 -0
  154. data/spec/mongoid/copyable_spec.rb +13 -4
  155. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  156. data/spec/mongoid/criteria/options_spec.rb +29 -0
  157. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  158. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  159. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  160. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  161. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  162. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  163. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  164. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  165. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  166. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  167. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  168. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  169. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  170. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  171. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  172. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  173. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  174. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  175. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  176. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  177. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  178. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  179. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  180. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  181. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  182. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  183. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  184. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  185. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4174 -0
  186. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  187. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  188. data/spec/mongoid/criteria_spec.rb +152 -21
  189. data/spec/mongoid/document_spec.rb +37 -88
  190. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  191. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  192. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  193. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  194. data/spec/mongoid/extensions/date_spec.rb +2 -6
  195. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  196. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  197. data/spec/mongoid/extensions/float_spec.rb +8 -1
  198. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  199. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  200. data/spec/mongoid/extensions/object_spec.rb +11 -0
  201. data/spec/mongoid/extensions/string_spec.rb +21 -0
  202. data/spec/mongoid/extensions/time_spec.rb +2 -6
  203. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  204. data/spec/mongoid/findable_spec.rb +46 -1
  205. data/spec/mongoid/indexable_spec.rb +15 -3
  206. data/spec/mongoid/interceptable_spec.rb +68 -10
  207. data/spec/mongoid/matchable/all_spec.rb +4 -4
  208. data/spec/mongoid/matchable/and_spec.rb +10 -10
  209. data/spec/mongoid/matchable/default_spec.rb +12 -12
  210. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  211. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  212. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  213. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  214. data/spec/mongoid/matchable/in_spec.rb +5 -5
  215. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  216. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  217. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  218. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  219. data/spec/mongoid/matchable/or_spec.rb +7 -7
  220. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  221. data/spec/mongoid/matchable/size_spec.rb +3 -3
  222. data/spec/mongoid/matchable_spec.rb +173 -53
  223. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  224. data/spec/mongoid/persistable/deletable_spec.rb +16 -1
  225. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  226. data/spec/mongoid/persistable/savable_spec.rb +35 -30
  227. data/spec/mongoid/persistable/settable_spec.rb +45 -29
  228. data/spec/mongoid/persistable/updatable_spec.rb +184 -5
  229. data/spec/mongoid/persistence_context_spec.rb +680 -0
  230. data/spec/mongoid/positional_spec.rb +10 -10
  231. data/spec/mongoid/query_cache_spec.rb +89 -0
  232. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  233. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  234. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  235. data/spec/mongoid/relations/builders_spec.rb +37 -10
  236. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  237. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  238. data/spec/mongoid/relations/eager_spec.rb +40 -0
  239. data/spec/mongoid/relations/embedded/many_spec.rb +63 -47
  240. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  241. data/spec/mongoid/relations/macros_spec.rb +395 -7
  242. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  243. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +13 -25
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  247. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  248. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  249. data/spec/mongoid/reloadable_spec.rb +51 -0
  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 +18 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +20 -11
  255. metadata +524 -469
  256. checksums.yaml.gz.sig +0 -0
  257. data.tar.gz.sig +0 -0
  258. data/lib/mongoid/clients/thread_options.rb +0 -19
  259. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  260. metadata.gz.sig +0 -0
@@ -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
 
@@ -197,7 +198,7 @@ module Mongoid
197
198
  reference(meta, Array)
198
199
  autosave(meta)
199
200
  validates_relation(meta)
200
- synced(meta)
201
+ _synced(meta)
201
202
  meta
202
203
  end
203
204
 
@@ -350,9 +351,16 @@ module Mongoid
350
351
  # @param [ Symbol ] name The name of the relation.
351
352
  # @param [ Metadata ] metadata The metadata for the relation.
352
353
  def relate(name, metadata)
354
+ Fields::Validators::Macro.validate_relation(self, name)
353
355
  self.relations = relations.merge(name.to_s => metadata)
354
356
  getter(name, metadata).setter(name, metadata).existence_check(name)
355
357
  end
358
+
359
+ def require_association?(options = {})
360
+ required = options[:required] if options.key?(:required)
361
+ required = !options[:optional] if options.key?(:optional) && required.nil?
362
+ required.nil? ? Mongoid.belongs_to_required_by_default : required
363
+ end
356
364
  end
357
365
  end
358
366
  end
@@ -778,10 +778,10 @@ module Mongoid
778
778
  #
779
779
  # @since 2.0.0.rc.1
780
780
  def validate?
781
- unless self[:validate].nil?
782
- self[:validate]
783
- else
781
+ if self[:validate].nil?
784
782
  self[:validate] = relation.validation_default
783
+ else
784
+ self[:validate]
785
785
  end
786
786
  end
787
787
 
@@ -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(
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # We undefine most methods to get them sent through to the target.
13
13
  instance_methods.each do |method|
14
14
  undef_method(method) unless
15
- method =~ /(^__|^send|^object_id|^respond_to|^tap|^public_send|extend_proxy|extend_proxies)/
15
+ method =~ /^(__.*|send|object_id|equal\?|respond_to\?|tap|public_send|extend_proxy|extend_proxies)$/
16
16
  end
17
17
 
18
18
  include Threaded::Lifecycle
@@ -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
 
@@ -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.
@@ -264,16 +282,7 @@ module Mongoid
264
282
  #
265
283
  # @since 2.1.0
266
284
  def valid_options
267
- [
268
- :autobuild,
269
- :autosave,
270
- :dependent,
271
- :foreign_key,
272
- :index,
273
- :polymorphic,
274
- :primary_key,
275
- :touch
276
- ]
285
+ VALID_OPTIONS
277
286
  end
278
287
 
279
288
  # 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
  #
@@ -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)
@@ -500,7 +517,7 @@ module Mongoid
500
517
  selector = conditions || {}
501
518
  removed = klass.send(method, selector.merge!(criteria.selector))
502
519
  target.delete_if do |doc|
503
- if doc.matches?(selector)
520
+ if doc._matches?(selector)
504
521
  unbind_one(doc) and true
505
522
  end
506
523
  end
@@ -550,7 +567,7 @@ module Mongoid
550
567
  if doc.new_record? && doc.valid?(:create)
551
568
  doc.run_before_callbacks(:save, :create)
552
569
  docs.push(doc)
553
- inserts.push(doc.as_document)
570
+ inserts.push(doc.send(:as_attributes))
554
571
  else
555
572
  doc.save
556
573
  end
@@ -729,18 +746,7 @@ module Mongoid
729
746
  #
730
747
  # @since 2.1.0
731
748
  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
- ]
749
+ VALID_OPTIONS
744
750
  end
745
751
 
746
752
  # Get the default validation setting for the relation. Determines if
@@ -795,8 +801,8 @@ module Mongoid
795
801
  # @since 3.0.0
796
802
  def with_inverse_field_criterion(criteria, metadata)
797
803
  inverse_metadata = metadata.inverse_metadata(metadata.klass)
798
- if inverse_metadata.try(:inverse_of_field)
799
- criteria.any_in(inverse_metadata.inverse_of_field => [ metadata.name, nil ])
804
+ if inverse_metadata.try(:inverse_of)
805
+ criteria.any_in(inverse_metadata.inverse_of => [ metadata.name, nil ])
800
806
  else
801
807
  criteria
802
808
  end
@@ -7,6 +7,24 @@ module Mongoid
7
7
  # many-to-many between documents in different collections.
8
8
  class ManyToMany < Many
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
+ :after_add,
17
+ :after_remove,
18
+ :autosave,
19
+ :before_add,
20
+ :before_remove,
21
+ :dependent,
22
+ :foreign_key,
23
+ :index,
24
+ :order,
25
+ :primary_key
26
+ ].freeze
27
+
10
28
  # Appends a document or array of documents to the relation. Will set
11
29
  # the parent and update the index in the process.
12
30
  #
@@ -266,7 +284,7 @@ module Mongoid
266
284
  #
267
285
  # @since 3.0.0
268
286
  def unsynced(doc, key)
269
- doc.synced[key] = false
287
+ doc._synced[key] = false
270
288
  true
271
289
  end
272
290
 
@@ -439,18 +457,7 @@ module Mongoid
439
457
  #
440
458
  # @since 2.1.0
441
459
  def valid_options
442
- [
443
- :after_add,
444
- :after_remove,
445
- :autosave,
446
- :before_add,
447
- :before_remove,
448
- :dependent,
449
- :foreign_key,
450
- :index,
451
- :order,
452
- :primary_key
453
- ]
460
+ VALID_OPTIONS
454
461
  end
455
462
 
456
463
  # Get the default validation setting for the relation. Determines if
@@ -7,6 +7,20 @@ module Mongoid
7
7
  # one-to-one between documents in different collections.
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
+ :as,
17
+ :autobuild,
18
+ :autosave,
19
+ :dependent,
20
+ :foreign_key,
21
+ :primary_key
22
+ ].freeze
23
+
10
24
  # Instantiate a new references_one relation. Will set the foreign key
11
25
  # and the base on the inverse object.
12
26
  #
@@ -254,7 +268,7 @@ module Mongoid
254
268
  #
255
269
  # @since 2.1.0
256
270
  def valid_options
257
- [ :as, :autobuild, :autosave, :dependent, :foreign_key, :primary_key ]
271
+ VALID_OPTIONS
258
272
  end
259
273
 
260
274
  # Get the default validation setting for the relation. Determines if
@@ -11,41 +11,41 @@ module Mongoid
11
11
  # the key has changed and the relation bindings have not been run.
12
12
  #
13
13
  # @example Are the foreign keys syncable?
14
- # document.syncable?(metadata)
14
+ # document._syncable??(metadata)
15
15
  #
16
16
  # @param [ Metadata ] metadata The relation metadata.
17
17
  #
18
18
  # @return [ true, false ] If we can sync.
19
19
  #
20
20
  # @since 2.1.0
21
- def syncable?(metadata)
22
- !synced?(metadata.foreign_key) && send(metadata.foreign_key_check)
21
+ def _syncable?(metadata)
22
+ !_synced?(metadata.foreign_key) && send(metadata.foreign_key_check)
23
23
  end
24
24
 
25
25
  # Get the synced foreign keys.
26
26
  #
27
27
  # @example Get the synced foreign keys.
28
- # document.synced
28
+ # document._synced
29
29
  #
30
30
  # @return [ Hash ] The synced foreign keys.
31
31
  #
32
32
  # @since 2.1.0
33
- def synced
34
- @synced ||= {}
33
+ def _synced
34
+ @_synced ||= {}
35
35
  end
36
36
 
37
37
  # Has the document been synced for the foreign key?
38
38
  #
39
39
  # @example Has the document been synced?
40
- # document.synced?
40
+ # document._synced??
41
41
  #
42
42
  # @param [ String ] foreign_key The foreign key.
43
43
  #
44
44
  # @return [ true, false ] If we can sync.
45
45
  #
46
46
  # @since 2.1.0
47
- def synced?(foreign_key)
48
- !!synced[foreign_key]
47
+ def _synced?(foreign_key)
48
+ !!_synced[foreign_key]
49
49
  end
50
50
 
51
51
  # Update the inverse keys on destroy.
@@ -110,7 +110,7 @@ module Mongoid
110
110
  # @param [ Metadata ] metadata The relation metadata.
111
111
  #
112
112
  # @since 2.1.0
113
- def synced(metadata)
113
+ def _synced(metadata)
114
114
  unless metadata.forced_nil_inverse?
115
115
  synced_save(metadata)
116
116
  synced_destroy(metadata)
@@ -137,7 +137,7 @@ module Mongoid
137
137
  set_callback(
138
138
  :save,
139
139
  :after,
140
- if: ->(doc){ doc.syncable?(metadata) }
140
+ if: ->(doc){ doc._syncable?(metadata) }
141
141
  ) do |doc|
142
142
  doc.update_inverse_keys(metadata)
143
143
  end
@@ -53,7 +53,8 @@ module Mongoid
53
53
  def touchable(metadata)
54
54
  if metadata.touchable?
55
55
  name = metadata.name
56
- method_name = define_relation_touch_method(name)
56
+ field = metadata[:touch].is_a?(Symbol) ? metadata[:touch] : nil
57
+ method_name = define_relation_touch_method(name, field)
57
58
  after_save method_name
58
59
  after_destroy method_name
59
60
  after_touch method_name
@@ -70,19 +71,21 @@ module Mongoid
70
71
  #
71
72
  # @example Define the touch relation.
72
73
  # Model.define_relation_touch_method(:band)
74
+ # Model.define_relation_touch_method(:band, :band_updated_at)
73
75
  #
74
76
  # @param [ Symbol ] name The name of the relation.
77
+ # @param [ Symbol ] extra_field Additional timestamp field to update.
75
78
  #
76
79
  # @since 3.1.0
77
80
  #
78
81
  # @return [ Symbol ] The method name.
79
- def define_relation_touch_method(name)
82
+ def define_relation_touch_method(name, extra_field = nil)
80
83
  method_name = "touch_#{name}_after_create_or_destroy"
81
84
  class_eval <<-TOUCH, __FILE__, __LINE__ + 1
82
85
  def #{method_name}
83
86
  without_autobuild do
84
87
  relation = __send__(:#{name})
85
- relation.touch if relation
88
+ relation.touch #{":#{extra_field}" if extra_field} if relation
86
89
  end
87
90
  end
88
91
  TOUCH
@@ -71,7 +71,7 @@ module Mongoid
71
71
  # @since 2.3.2
72
72
  def reload_embedded_document
73
73
  extract_embedded_attributes({}.merge(
74
- _root.collection.find(_id: _root._id).read(mode: :primary).first
74
+ collection(_root).find(_id: _root._id).read(mode: :primary).first
75
75
  ))
76
76
  end
77
77
 
@@ -66,7 +66,7 @@ module Mongoid
66
66
  #
67
67
  # @since 3.0.0
68
68
  def field_names(options)
69
- names = (as_document.keys + attribute_names).uniq.sort
69
+ names = (as_attributes.keys + attribute_names).uniq.sort
70
70
 
71
71
  only = Array.wrap(options[:only]).map(&:to_s)
72
72
  except = Array.wrap(options[:except]).map(&:to_s)