mongoid 2.2.6 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +2 -858
- data/Rakefile +2 -5
- data/lib/mongoid.rb +1 -1
- data/lib/mongoid/attributes.rb +68 -18
- data/lib/mongoid/attributes/processing.rb +4 -3
- data/lib/mongoid/callbacks.rb +102 -0
- data/lib/mongoid/collection.rb +1 -1
- data/lib/mongoid/components.rb +2 -1
- data/lib/mongoid/contexts/enumerable.rb +0 -24
- data/lib/mongoid/contexts/mongo.rb +2 -2
- data/lib/mongoid/copyable.rb +3 -1
- data/lib/mongoid/criteria.rb +18 -10
- data/lib/mongoid/criterion/complex.rb +11 -0
- data/lib/mongoid/criterion/inclusion.rb +38 -7
- data/lib/mongoid/criterion/optional.rb +2 -7
- data/lib/mongoid/criterion/selector.rb +1 -0
- data/lib/mongoid/dirty.rb +19 -0
- data/lib/mongoid/document.rb +16 -12
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +1 -1
- data/lib/mongoid/extensions/object/checks.rb +4 -1
- data/lib/mongoid/extensions/object_id/conversions.rb +4 -2
- data/lib/mongoid/extensions/string/inflections.rb +2 -2
- data/lib/mongoid/factory.rb +7 -2
- data/lib/mongoid/fields.rb +4 -10
- data/lib/mongoid/fields/serializable.rb +18 -2
- data/lib/mongoid/fields/serializable/integer.rb +17 -5
- data/lib/mongoid/fields/serializable/localized.rb +41 -0
- data/lib/mongoid/finders.rb +5 -4
- data/lib/mongoid/hierarchy.rb +87 -84
- data/lib/mongoid/identity.rb +4 -2
- data/lib/mongoid/keys.rb +2 -1
- data/lib/mongoid/logger.rb +1 -7
- data/lib/mongoid/matchers/and.rb +30 -0
- data/lib/mongoid/matchers/in.rb +1 -1
- data/lib/mongoid/matchers/nin.rb +1 -1
- data/lib/mongoid/matchers/strategies.rb +6 -4
- data/lib/mongoid/multi_parameter_attributes.rb +3 -2
- data/lib/mongoid/named_scope.rb +3 -13
- data/lib/mongoid/nested_attributes.rb +1 -1
- data/lib/mongoid/paranoia.rb +2 -3
- data/lib/mongoid/persistence.rb +9 -5
- data/lib/mongoid/persistence/atomic/operation.rb +1 -1
- data/lib/mongoid/persistence/deletion.rb +1 -1
- data/lib/mongoid/persistence/insertion.rb +1 -1
- data/lib/mongoid/persistence/modification.rb +1 -1
- data/lib/mongoid/railtie.rb +1 -1
- data/lib/mongoid/railties/database.rake +9 -1
- data/lib/mongoid/relations.rb +1 -0
- data/lib/mongoid/relations/accessors.rb +1 -1
- data/lib/mongoid/relations/builders.rb +6 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -23
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +5 -3
- data/lib/mongoid/relations/conversions.rb +35 -0
- data/lib/mongoid/relations/embedded/atomic.rb +3 -3
- data/lib/mongoid/relations/embedded/in.rb +1 -1
- data/lib/mongoid/relations/embedded/many.rb +16 -13
- data/lib/mongoid/relations/embedded/one.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +19 -15
- data/lib/mongoid/relations/proxy.rb +4 -5
- data/lib/mongoid/relations/referenced/in.rb +1 -1
- data/lib/mongoid/relations/referenced/many.rb +12 -31
- data/lib/mongoid/relations/referenced/many_to_many.rb +4 -5
- data/lib/mongoid/relations/referenced/one.rb +6 -8
- data/lib/mongoid/relations/synchronization.rb +3 -5
- data/lib/mongoid/safety.rb +34 -4
- data/lib/mongoid/serialization.rb +20 -6
- data/lib/mongoid/threaded.rb +47 -0
- data/lib/mongoid/timestamps.rb +1 -0
- data/lib/mongoid/timestamps/created.rb +1 -8
- data/lib/mongoid/timestamps/timeless.rb +50 -0
- data/lib/mongoid/timestamps/updated.rb +2 -9
- data/lib/mongoid/validations.rb +0 -2
- data/lib/mongoid/validations/associated.rb +1 -2
- data/lib/mongoid/validations/uniqueness.rb +89 -36
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +5 -6
- data/lib/rails/generators/mongoid_generator.rb +1 -1
- data/lib/rails/mongoid.rb +14 -5
- metadata +27 -23
@@ -33,7 +33,7 @@ module Mongoid #:nodoc:
|
|
33
33
|
args.flatten.each do |doc|
|
34
34
|
next unless doc
|
35
35
|
append(doc)
|
36
|
-
doc.save if persistable?
|
36
|
+
doc.save if persistable?
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -47,13 +47,14 @@ module Mongoid #:nodoc:
|
|
47
47
|
# person.posts.build(:title => "A new post")
|
48
48
|
#
|
49
49
|
# @param [ Hash ] attributes The attributes of the new document.
|
50
|
+
# @param [ Hash ] options The scoped assignment options.
|
50
51
|
# @param [ Class ] type The optional subclass to build.
|
51
52
|
#
|
52
53
|
# @return [ Document ] The new document.
|
53
54
|
#
|
54
55
|
# @since 2.0.0.beta.1
|
55
|
-
def build(attributes = {}, type = nil)
|
56
|
-
Factory.build(type || klass, attributes).tap do |doc|
|
56
|
+
def build(attributes = {}, options = {}, type = nil)
|
57
|
+
Factory.build(type || klass, attributes, options).tap do |doc|
|
57
58
|
append(doc)
|
58
59
|
yield(doc) if block_given?
|
59
60
|
end
|
@@ -67,13 +68,14 @@ module Mongoid #:nodoc:
|
|
67
68
|
# person.posts.create(:text => "Testing")
|
68
69
|
#
|
69
70
|
# @param [ Hash ] attributes The attributes to create with.
|
71
|
+
# @param [ Hash ] options The scoped assignment options.
|
70
72
|
# @param [ Class ] type The optional type of document to create.
|
71
73
|
#
|
72
74
|
# @return [ Document ] The newly created document.
|
73
75
|
#
|
74
76
|
# @since 2.0.0.beta.1
|
75
|
-
def create(attributes = nil, type = nil, &block)
|
76
|
-
build(attributes, type, &block).tap do |doc|
|
77
|
+
def create(attributes = nil, options = {}, type = nil, &block)
|
78
|
+
build(attributes, options, type, &block).tap do |doc|
|
77
79
|
base.persisted? ? doc.save : raise_unsaved(doc)
|
78
80
|
end
|
79
81
|
end
|
@@ -86,6 +88,7 @@ module Mongoid #:nodoc:
|
|
86
88
|
# person.posts.create!(:text => "Testing")
|
87
89
|
#
|
88
90
|
# @param [ Hash ] attributes The attributes to create with.
|
91
|
+
# @param [ Hash ] options The scoped assignment options.
|
89
92
|
# @param [ Class ] type The optional type of document to create.
|
90
93
|
#
|
91
94
|
# @raise [ Errors::Validations ] If validation failed.
|
@@ -93,8 +96,8 @@ module Mongoid #:nodoc:
|
|
93
96
|
# @return [ Document ] The newly created document.
|
94
97
|
#
|
95
98
|
# @since 2.0.0.beta.1
|
96
|
-
def create!(attributes = nil, type = nil, &block)
|
97
|
-
build(attributes, type, &block).tap do |doc|
|
99
|
+
def create!(attributes = nil, options = {}, type = nil, &block)
|
100
|
+
build(attributes, options, type, &block).tap do |doc|
|
98
101
|
base.persisted? ? doc.save! : raise_unsaved(doc)
|
99
102
|
end
|
100
103
|
end
|
@@ -321,28 +324,6 @@ module Mongoid #:nodoc:
|
|
321
324
|
klass.collection
|
322
325
|
end
|
323
326
|
|
324
|
-
# Get the value for the foreign key in convertable or unconvertable
|
325
|
-
# form.
|
326
|
-
#
|
327
|
-
# @todo Durran: Find a common place for this.
|
328
|
-
#
|
329
|
-
# @example Get the value.
|
330
|
-
# relation.convertable
|
331
|
-
#
|
332
|
-
# @return [ String, BSON::ObjectId ] The string or object id.
|
333
|
-
#
|
334
|
-
# @since 2.0.2
|
335
|
-
def convertable
|
336
|
-
inverse = metadata.inverse_klass
|
337
|
-
if inverse.using_object_ids? || base.id.is_a?(BSON::ObjectId)
|
338
|
-
base.id
|
339
|
-
else
|
340
|
-
base.id.tap do |id|
|
341
|
-
id.unconvertable_to_bson = true if id.is_a?(String)
|
342
|
-
end
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
327
|
# Returns the criteria object for the target class with its documents set
|
347
328
|
# to target.
|
348
329
|
#
|
@@ -353,7 +334,7 @@ module Mongoid #:nodoc:
|
|
353
334
|
#
|
354
335
|
# @since 2.0.0.beta.1
|
355
336
|
def criteria
|
356
|
-
Many.criteria(metadata,
|
337
|
+
Many.criteria(metadata, Conversions.flag(base.id, metadata))
|
357
338
|
end
|
358
339
|
|
359
340
|
# Perform the necessary cascade operations for documents that just got
|
@@ -408,7 +389,7 @@ module Mongoid #:nodoc:
|
|
408
389
|
#
|
409
390
|
# @since 2.1.0
|
410
391
|
def persistable?
|
411
|
-
base.persisted? && !binding? && !
|
392
|
+
base.persisted? && !binding? && !_building?
|
412
393
|
end
|
413
394
|
|
414
395
|
# Deletes all related documents from the database given the supplied
|
@@ -55,13 +55,14 @@ module Mongoid # :nodoc:
|
|
55
55
|
# person.posts.build(:title => "A new post")
|
56
56
|
#
|
57
57
|
# @param [ Hash ] attributes The attributes of the new document.
|
58
|
+
# @param [ Hash ] options The scoped assignment options.
|
58
59
|
# @param [ Class ] type The optional subclass to build.
|
59
60
|
#
|
60
61
|
# @return [ Document ] The new document.
|
61
62
|
#
|
62
63
|
# @since 2.0.0.beta.1
|
63
|
-
def build(attributes = {}, type = nil)
|
64
|
-
Factory.build(type || klass, attributes).tap do |doc|
|
64
|
+
def build(attributes = {}, options = {}, type = nil)
|
65
|
+
Factory.build(type || klass, attributes, options).tap do |doc|
|
65
66
|
base.send(metadata.foreign_key).push(doc.id)
|
66
67
|
append(doc)
|
67
68
|
yield(doc) if block_given?
|
@@ -142,9 +143,7 @@ module Mongoid # :nodoc:
|
|
142
143
|
#
|
143
144
|
# @since 2.0.0.rc.1
|
144
145
|
def nullify
|
145
|
-
|
146
|
-
criteria.pull(metadata.inverse_foreign_key, base.id)
|
147
|
-
end
|
146
|
+
criteria.pull(metadata.inverse_foreign_key, base.id)
|
148
147
|
if persistable?
|
149
148
|
base.set(
|
150
149
|
metadata.foreign_key,
|
@@ -51,14 +51,12 @@ module Mongoid # :nodoc:
|
|
51
51
|
#
|
52
52
|
# @since 2.0.0.rc.1
|
53
53
|
def substitute(replacement)
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
return nil unless replacement
|
58
|
-
proxy.target = replacement
|
59
|
-
proxy.bind_one
|
60
|
-
replacement.save if persistable?
|
54
|
+
unbind_one
|
55
|
+
if persistable?
|
56
|
+
metadata.destructive? ? send(metadata.dependent) : save
|
61
57
|
end
|
58
|
+
return nil unless replacement
|
59
|
+
One.new(base, replacement, metadata)
|
62
60
|
end
|
63
61
|
|
64
62
|
private
|
@@ -84,7 +82,7 @@ module Mongoid # :nodoc:
|
|
84
82
|
#
|
85
83
|
# @since 2.1.0
|
86
84
|
def persistable?
|
87
|
-
base.persisted? && !binding? && !
|
85
|
+
base.persisted? && !binding? && !_building?
|
88
86
|
end
|
89
87
|
|
90
88
|
class << self
|
@@ -77,7 +77,7 @@ module Mongoid # :nodoc:
|
|
77
77
|
def update_inverse_keys(meta)
|
78
78
|
return unless changes.has_key?(meta.foreign_key)
|
79
79
|
old, new = changes[meta.foreign_key]
|
80
|
-
adds, subs = new - old, old - new
|
80
|
+
adds, subs = new - (old || []), (old || []) - new
|
81
81
|
meta.criteria(adds).add_to_set(meta.inverse_foreign_key, id) unless adds.empty?
|
82
82
|
meta.criteria(subs).pull(meta.inverse_foreign_key, id) unless subs.empty?
|
83
83
|
end
|
@@ -93,10 +93,8 @@ module Mongoid # :nodoc:
|
|
93
93
|
#
|
94
94
|
# @since 2.1.0
|
95
95
|
def synced(metadata)
|
96
|
-
|
97
|
-
|
98
|
-
synced_destroy(metadata)
|
99
|
-
end
|
96
|
+
synced_save(metadata)
|
97
|
+
synced_destroy(metadata)
|
100
98
|
end
|
101
99
|
|
102
100
|
private
|
data/lib/mongoid/safety.rb
CHANGED
@@ -7,7 +7,7 @@ module Mongoid #:nodoc:
|
|
7
7
|
module Safety
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
-
# Execute the following
|
10
|
+
# Execute the following instance-level persistence operation in safe mode.
|
11
11
|
#
|
12
12
|
# @example Upsert in safe mode.
|
13
13
|
# person.safely.upsert
|
@@ -27,6 +27,18 @@ module Mongoid #:nodoc:
|
|
27
27
|
tap { Threaded.safety_options = safety }
|
28
28
|
end
|
29
29
|
|
30
|
+
# Execute the following instance-level persistence operation without safe mode.
|
31
|
+
# Allows per-request overriding of safe mode when the persist_in_safe_mode
|
32
|
+
# config option is turned on.
|
33
|
+
#
|
34
|
+
# @example Upsert in safe mode.
|
35
|
+
# person.unsafely.upsert
|
36
|
+
#
|
37
|
+
# @return [ Proxy ] The safety proxy.
|
38
|
+
def unsafely
|
39
|
+
tap { Threaded.safety_options = false }
|
40
|
+
end
|
41
|
+
|
30
42
|
class << self
|
31
43
|
|
32
44
|
# Static class method of easily getting the desired safe mode options
|
@@ -43,9 +55,13 @@ module Mongoid #:nodoc:
|
|
43
55
|
def merge_safety_options(options = {})
|
44
56
|
options ||= {}
|
45
57
|
return options if options[:safe]
|
46
|
-
|
47
|
-
|
48
|
-
|
58
|
+
|
59
|
+
unless Threaded.safety_options.nil?
|
60
|
+
safety = Threaded.safety_options
|
61
|
+
else
|
62
|
+
safety = Mongoid.persist_in_safe_mode
|
63
|
+
end
|
64
|
+
options.merge!({ :safe => safety })
|
49
65
|
end
|
50
66
|
end
|
51
67
|
|
@@ -70,6 +86,20 @@ module Mongoid #:nodoc:
|
|
70
86
|
def safely(safety = true)
|
71
87
|
tap { Threaded.safety_options = safety }
|
72
88
|
end
|
89
|
+
|
90
|
+
# Execute the following class-level persistence operation without safe mode.
|
91
|
+
# Allows per-request overriding of safe mode when the persist_in_safe_mode
|
92
|
+
# config option is turned on.
|
93
|
+
#
|
94
|
+
# @example Upsert in safe mode.
|
95
|
+
# Person.unsafely.create(:name => "John")
|
96
|
+
#
|
97
|
+
# @return [ Proxy ] The safety proxy.
|
98
|
+
#
|
99
|
+
# @since 2.3.0
|
100
|
+
def unsafely
|
101
|
+
tap { Threaded.safety_options = false }
|
102
|
+
end
|
73
103
|
end
|
74
104
|
end
|
75
105
|
end
|
@@ -5,11 +5,9 @@ module Mongoid # :nodoc:
|
|
5
5
|
# and XML serialization.
|
6
6
|
module Serialization
|
7
7
|
extend ActiveSupport::Concern
|
8
|
-
include ActiveModel::Serialization
|
9
8
|
|
10
|
-
# Gets the document as a serializable hash, used by ActiveModel's JSON
|
11
|
-
#
|
12
|
-
# and :except options to get associations in the hash.
|
9
|
+
# Gets the document as a serializable hash, used by ActiveModel's JSON
|
10
|
+
# serializer.
|
13
11
|
#
|
14
12
|
# @example Get the serializable hash.
|
15
13
|
# document.serializable_hash
|
@@ -19,16 +17,32 @@ module Mongoid # :nodoc:
|
|
19
17
|
#
|
20
18
|
# @param [ Hash ] options The options to pass.
|
21
19
|
#
|
22
|
-
# @option options [ Symbol ] :include What relations to include
|
20
|
+
# @option options [ Symbol ] :include What relations to include.
|
23
21
|
# @option options [ Symbol ] :only Limit the fields to only these.
|
24
22
|
# @option options [ Symbol ] :except Dont include these fields.
|
23
|
+
# @option options [ Symbol ] :methods What methods to include.
|
25
24
|
#
|
26
25
|
# @return [ Hash ] The document, ready to be serialized.
|
27
26
|
#
|
28
27
|
# @since 2.0.0.rc.6
|
29
28
|
def serializable_hash(options = nil)
|
30
29
|
options ||= {}
|
31
|
-
|
30
|
+
|
31
|
+
only = Array.wrap(options[:only]).map(&:to_s)
|
32
|
+
except = Array.wrap(options[:except]).map(&:to_s)
|
33
|
+
|
34
|
+
except |= ['_type']
|
35
|
+
|
36
|
+
field_names = fields.keys.map { |field| field.to_s }
|
37
|
+
attribute_names = (attributes.keys + field_names).sort
|
38
|
+
if only.any?
|
39
|
+
attribute_names &= only
|
40
|
+
elsif except.any?
|
41
|
+
attribute_names -= except
|
42
|
+
end
|
43
|
+
|
44
|
+
method_names = Array.wrap(options[:methods]).map { |n| n.to_s if respond_to?(n.to_s) }.compact
|
45
|
+
Hash[(attribute_names + method_names).map { |n| [n, send(n)] }].tap do |attrs|
|
32
46
|
serialize_relations(attrs, options) if options[:include]
|
33
47
|
end
|
34
48
|
end
|
data/lib/mongoid/threaded.rb
CHANGED
@@ -178,6 +178,17 @@ module Mongoid #:nodoc:
|
|
178
178
|
Thread.current[:"[mongoid]:safety-options"] = nil
|
179
179
|
end
|
180
180
|
|
181
|
+
# Clear out all options set on a one-time basis.
|
182
|
+
#
|
183
|
+
# @example Clear out the options.
|
184
|
+
# Threaded.clear_options!
|
185
|
+
#
|
186
|
+
# @since 2.3.0
|
187
|
+
def clear_options!
|
188
|
+
clear_safety_options!
|
189
|
+
self.timeless = false
|
190
|
+
end
|
191
|
+
|
181
192
|
# Exit the assigning block.
|
182
193
|
#
|
183
194
|
# @example Exit the assigning block.
|
@@ -314,6 +325,30 @@ module Mongoid #:nodoc:
|
|
314
325
|
Thread.current[:"[mongoid]:scope-stack"] ||= {}
|
315
326
|
end
|
316
327
|
|
328
|
+
# Get the value of the one-off timeless call.
|
329
|
+
#
|
330
|
+
# @example Get the timeless value.
|
331
|
+
# Threaded.timeless
|
332
|
+
#
|
333
|
+
# @return [ true, false ] The timeless setting.
|
334
|
+
#
|
335
|
+
# @since 2.3.0
|
336
|
+
def timeless
|
337
|
+
!!Thread.current[:"[mongoid]:timeless"]
|
338
|
+
end
|
339
|
+
|
340
|
+
# Set the value of the one-off timeless call.
|
341
|
+
#
|
342
|
+
# @example Set the timeless value.
|
343
|
+
# Threaded.timeless = true
|
344
|
+
#
|
345
|
+
# @param [ true, false ] value The value.
|
346
|
+
#
|
347
|
+
# @since 2.3.0
|
348
|
+
def timeless=(value)
|
349
|
+
Thread.current[:"[mongoid]:timeless"] = value
|
350
|
+
end
|
351
|
+
|
317
352
|
# Get the update consumer from the current thread.
|
318
353
|
#
|
319
354
|
# @example Get the update consumer.
|
@@ -340,6 +375,18 @@ module Mongoid #:nodoc:
|
|
340
375
|
Thread.current[:"[mongoid][#{klass}]:update-consumer"] = consumer
|
341
376
|
end
|
342
377
|
|
378
|
+
# Is the current thread setting timestamps?
|
379
|
+
#
|
380
|
+
# @example Is the current thread timestamping?
|
381
|
+
# Threaded.timestamping?
|
382
|
+
#
|
383
|
+
# @return [ true, false ] If timestamps can be applied.
|
384
|
+
#
|
385
|
+
# @since 2.3.0
|
386
|
+
def timestamping?
|
387
|
+
!timeless
|
388
|
+
end
|
389
|
+
|
343
390
|
# Is the document validated on the current thread?
|
344
391
|
#
|
345
392
|
# @example Is the document validated?
|
data/lib/mongoid/timestamps.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
|
-
|
4
3
|
module Timestamps
|
5
4
|
# This module handles the behaviour for setting up document created at
|
6
5
|
# timestamp.
|
@@ -9,13 +8,7 @@ module Mongoid #:nodoc:
|
|
9
8
|
|
10
9
|
included do
|
11
10
|
field :created_at, :type => Time
|
12
|
-
|
13
|
-
set_callback :create, :before, :set_created_at
|
14
|
-
|
15
|
-
unless methods.include? 'record_timestamps'
|
16
|
-
class_attribute :record_timestamps
|
17
|
-
self.record_timestamps = true
|
18
|
-
end
|
11
|
+
set_callback :create, :before, :set_created_at, :if => :timestamping?
|
19
12
|
end
|
20
13
|
|
21
14
|
# Update the created_at field on the Document to the current time. This is
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Timestamps
|
4
|
+
|
5
|
+
# This module adds behaviour for turning off timestamping in single or
|
6
|
+
# multiple calls.
|
7
|
+
module Timeless
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
# Begin an execution that should skip timestamping.
|
11
|
+
#
|
12
|
+
# @example Save a document but don't timestamp.
|
13
|
+
# person.timeless.save
|
14
|
+
#
|
15
|
+
# @return [ Document ] The document this was called on.
|
16
|
+
#
|
17
|
+
# @since 2.3.0
|
18
|
+
def timeless
|
19
|
+
tap { Threaded.timeless = true }
|
20
|
+
end
|
21
|
+
|
22
|
+
# Are we currently timestamping?
|
23
|
+
#
|
24
|
+
# @example Should timestamps be applied?
|
25
|
+
# person.timestamping?
|
26
|
+
#
|
27
|
+
# @return [ true, false ] If the current thread is timestamping.
|
28
|
+
#
|
29
|
+
# @since 2.3.0
|
30
|
+
def timestamping?
|
31
|
+
Threaded.timestamping?
|
32
|
+
end
|
33
|
+
|
34
|
+
module ClassMethods #:nodoc
|
35
|
+
|
36
|
+
# Begin an execution that should skip timestamping.
|
37
|
+
#
|
38
|
+
# @example Create a document but don't timestamp.
|
39
|
+
# Person.timeless.create(:title => "Sir")
|
40
|
+
#
|
41
|
+
# @return [ Class ] The class this was called on.
|
42
|
+
#
|
43
|
+
# @since 2.3.0
|
44
|
+
def timeless
|
45
|
+
tap { Threaded.timeless = true }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|