mongoid 5.4.1 → 6.1.1

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