mongoid 3.0.23 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +253 -9
- data/LICENSE +1 -1
- data/README.md +4 -1
- data/lib/config/locales/en.yml +7 -6
- data/lib/mongoid.rb +18 -1
- data/lib/mongoid/atomic.rb +22 -20
- data/lib/mongoid/atomic/paths/embedded.rb +19 -5
- data/lib/mongoid/atomic/paths/root.rb +1 -1
- data/lib/mongoid/atomic/positionable.rb +73 -0
- data/lib/mongoid/attributes.rb +63 -1
- data/lib/mongoid/callbacks.rb +58 -4
- data/lib/mongoid/components.rb +8 -3
- data/lib/mongoid/config.rb +71 -23
- data/lib/mongoid/contextual.rb +2 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +27 -63
- data/lib/mongoid/contextual/atomic.rb +4 -3
- data/lib/mongoid/contextual/find_and_modify.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +238 -0
- data/lib/mongoid/contextual/map_reduce.rb +12 -1
- data/lib/mongoid/contextual/memory.rb +36 -31
- data/lib/mongoid/contextual/mongo.rb +147 -91
- data/lib/mongoid/contextual/queryable.rb +25 -0
- data/lib/mongoid/copyable.rb +4 -1
- data/lib/mongoid/criteria.rb +23 -275
- data/lib/mongoid/criterion/findable.rb +179 -0
- data/lib/mongoid/criterion/modifiable.rb +191 -0
- data/lib/mongoid/criterion/scoping.rb +11 -6
- data/lib/mongoid/document.rb +7 -56
- data/lib/mongoid/equality.rb +66 -0
- data/lib/mongoid/errors/mongoid_error.rb +7 -3
- data/lib/mongoid/extensions/array.rb +13 -1
- data/lib/mongoid/extensions/date.rb +9 -2
- data/lib/mongoid/extensions/hash.rb +38 -2
- data/lib/mongoid/extensions/nil_class.rb +12 -0
- data/lib/mongoid/extensions/object.rb +24 -0
- data/lib/mongoid/extensions/string.rb +14 -2
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/fields.rb +49 -5
- data/lib/mongoid/fields/foreign_key.rb +12 -0
- data/lib/mongoid/fields/standard.rb +12 -0
- data/lib/mongoid/finders.rb +8 -0
- data/lib/mongoid/hierarchy.rb +19 -1
- data/lib/mongoid/indexes.rb +30 -4
- data/lib/mongoid/indexes/validators/options.rb +12 -2
- data/lib/mongoid/inspection.rb +2 -1
- data/lib/mongoid/matchers/strategies.rb +5 -5
- data/lib/mongoid/observer.rb +27 -36
- data/lib/mongoid/persistence.rb +42 -17
- data/lib/mongoid/persistence/atomic.rb +10 -5
- data/lib/mongoid/persistence/atomic/operation.rb +26 -9
- data/lib/mongoid/persistence/atomic/unset.rb +1 -1
- data/lib/mongoid/persistence/operations/embedded/insert.rb +5 -2
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -2
- data/lib/mongoid/persistence/operations/update.rb +7 -3
- data/lib/mongoid/railties/database.rake +12 -19
- data/lib/mongoid/relations.rb +2 -0
- data/lib/mongoid/relations/accessors.rb +30 -8
- data/lib/mongoid/relations/binding.rb +5 -1
- data/lib/mongoid/relations/bindings/referenced/in.rb +1 -1
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -3
- data/lib/mongoid/relations/counter_cache.rb +107 -0
- data/lib/mongoid/relations/embedded/batchable.rb +13 -4
- data/lib/mongoid/relations/embedded/many.rb +30 -1
- data/lib/mongoid/relations/macros.rb +2 -0
- data/lib/mongoid/relations/marshalable.rb +0 -1
- data/lib/mongoid/relations/metadata.rb +63 -11
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/proxy.rb +45 -2
- data/lib/mongoid/relations/referenced/in.rb +11 -2
- data/lib/mongoid/relations/referenced/many.rb +31 -3
- data/lib/mongoid/relations/referenced/many_to_many.rb +31 -3
- data/lib/mongoid/relations/referenced/one.rb +1 -1
- data/lib/mongoid/relations/targets/enumerable.rb +5 -1
- data/lib/mongoid/relations/touchable.rb +35 -6
- data/lib/mongoid/reloading.rb +5 -3
- data/lib/mongoid/scoping.rb +2 -2
- data/lib/mongoid/sessions.rb +57 -7
- data/lib/mongoid/sessions/factory.rb +22 -1
- data/lib/mongoid/threaded.rb +4 -30
- data/lib/mongoid/threaded/lifecycle.rb +12 -12
- data/lib/mongoid/timestamps.rb +1 -0
- data/lib/mongoid/timestamps/created.rb +2 -0
- data/lib/mongoid/timestamps/created/short.rb +19 -0
- data/lib/mongoid/timestamps/short.rb +10 -0
- data/lib/mongoid/timestamps/updated.rb +2 -0
- data/lib/mongoid/timestamps/updated/short.rb +19 -0
- data/lib/mongoid/validations.rb +2 -0
- data/lib/mongoid/validations/queryable.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +1 -18
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/model/model_generator.rb +1 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +3 -0
- data/lib/rails/mongoid.rb +53 -29
- data/lib/support/ruby_version.rb +26 -0
- metadata +18 -7
data/lib/mongoid/finders.rb
CHANGED
@@ -13,15 +13,23 @@ module Mongoid
|
|
13
13
|
delegate \
|
14
14
|
:aggregates,
|
15
15
|
:avg,
|
16
|
+
:distinct,
|
16
17
|
:each,
|
18
|
+
:each_with_index,
|
17
19
|
:extras,
|
18
20
|
:find_and_modify,
|
19
21
|
:find_or_create_by,
|
20
22
|
:find_or_initialize_by,
|
23
|
+
:first_or_create,
|
24
|
+
:first_or_create!,
|
25
|
+
:first_or_initialize,
|
26
|
+
:for_js,
|
27
|
+
:geo_near,
|
21
28
|
:includes,
|
22
29
|
:map_reduce,
|
23
30
|
:max,
|
24
31
|
:min,
|
32
|
+
:pluck,
|
25
33
|
:sum,
|
26
34
|
:update,
|
27
35
|
:update_all, to: :with_default_scope
|
data/lib/mongoid/hierarchy.rb
CHANGED
@@ -131,6 +131,18 @@ module Mongoid
|
|
131
131
|
object || self
|
132
132
|
end
|
133
133
|
|
134
|
+
# Is this document the root document of the hierarchy?
|
135
|
+
#
|
136
|
+
# @example Is the document the root?
|
137
|
+
# document._root?
|
138
|
+
#
|
139
|
+
# @return [ true, false ] If the document is the root.
|
140
|
+
#
|
141
|
+
# @since 3.1.0
|
142
|
+
def _root?
|
143
|
+
_parent ? false : true
|
144
|
+
end
|
145
|
+
|
134
146
|
module ClassMethods
|
135
147
|
|
136
148
|
# Determines if the document is a subclass of another document.
|
@@ -161,7 +173,13 @@ module Mongoid
|
|
161
173
|
subclass.pre_processed_defaults = pre_processed_defaults.dup
|
162
174
|
subclass.post_processed_defaults = post_processed_defaults.dup
|
163
175
|
subclass.scopes = scopes.dup
|
164
|
-
|
176
|
+
|
177
|
+
# We only need the _type field if inheritance is in play, but need to
|
178
|
+
# add to the root class as well for backwards compatibility.
|
179
|
+
unless fields.has_key?("_type")
|
180
|
+
field(:_type, default: self.name, type: String)
|
181
|
+
end
|
182
|
+
subclass.field(:_type, default: subclass.name, type: String)
|
165
183
|
end
|
166
184
|
end
|
167
185
|
end
|
data/lib/mongoid/indexes.rb
CHANGED
@@ -23,7 +23,12 @@ module Mongoid
|
|
23
23
|
def create_indexes
|
24
24
|
return unless index_options
|
25
25
|
index_options.each_pair do |spec, options|
|
26
|
-
|
26
|
+
if database = options[:database]
|
27
|
+
with(consistency: :strong, database: database).
|
28
|
+
collection.indexes.create(spec, options.except(:database))
|
29
|
+
else
|
30
|
+
with(consistency: :strong).collection.indexes.create(spec, options)
|
31
|
+
end
|
27
32
|
end and true
|
28
33
|
end
|
29
34
|
|
@@ -37,9 +42,13 @@ module Mongoid
|
|
37
42
|
#
|
38
43
|
# @since 3.0.0
|
39
44
|
def remove_indexes
|
40
|
-
|
41
|
-
|
42
|
-
collection.indexes.
|
45
|
+
indexed_database_names.each do |database|
|
46
|
+
collection = with(consistency: :strong, database: database).collection
|
47
|
+
collection.indexes.each do |spec|
|
48
|
+
unless spec["name"] == "_id_"
|
49
|
+
collection.indexes.drop(spec["key"])
|
50
|
+
end
|
51
|
+
end
|
43
52
|
end and true
|
44
53
|
end
|
45
54
|
|
@@ -123,6 +132,23 @@ module Mongoid
|
|
123
132
|
normalized
|
124
133
|
end
|
125
134
|
end
|
135
|
+
|
136
|
+
# Get the names of all databases for this model that have index
|
137
|
+
# definitions.
|
138
|
+
#
|
139
|
+
# @api private
|
140
|
+
#
|
141
|
+
# @example Get the indexed database names.
|
142
|
+
# Model.indexed_database_names
|
143
|
+
#
|
144
|
+
# @return [ Array<String> ] The names.
|
145
|
+
#
|
146
|
+
# @since 3.1.0
|
147
|
+
def indexed_database_names
|
148
|
+
index_options.values.map do |options|
|
149
|
+
options[:database] || database_name
|
150
|
+
end.uniq
|
151
|
+
end
|
126
152
|
end
|
127
153
|
end
|
128
154
|
end
|
@@ -9,6 +9,7 @@ module Mongoid
|
|
9
9
|
|
10
10
|
VALID_OPTIONS = [
|
11
11
|
:background,
|
12
|
+
:database,
|
12
13
|
:drop_dups,
|
13
14
|
:name,
|
14
15
|
:sparse,
|
@@ -17,10 +18,19 @@ module Mongoid
|
|
17
18
|
:min,
|
18
19
|
:bits,
|
19
20
|
:bucket_size,
|
20
|
-
:expire_after_seconds
|
21
|
+
:expire_after_seconds,
|
22
|
+
:weights
|
21
23
|
]
|
22
24
|
|
23
|
-
VALID_TYPES = [
|
25
|
+
VALID_TYPES = [
|
26
|
+
1,
|
27
|
+
-1,
|
28
|
+
"2d",
|
29
|
+
"2dsphere",
|
30
|
+
"geoHaystack",
|
31
|
+
"text",
|
32
|
+
"hashed"
|
33
|
+
]
|
24
34
|
|
25
35
|
# Validate the index specification.
|
26
36
|
#
|
data/lib/mongoid/inspection.rb
CHANGED
@@ -21,7 +21,7 @@ module Mongoid
|
|
21
21
|
module Strategies
|
22
22
|
extend self
|
23
23
|
|
24
|
-
MATCHERS =
|
24
|
+
MATCHERS = {
|
25
25
|
"$all" => Matchers::All,
|
26
26
|
"$and" => Matchers::And,
|
27
27
|
"$exists" => Matchers::Exists,
|
@@ -34,7 +34,7 @@ module Mongoid
|
|
34
34
|
"$nin" => Matchers::Nin,
|
35
35
|
"$or" => Matchers::Or,
|
36
36
|
"$size" => Matchers::Size
|
37
|
-
}
|
37
|
+
}.with_indifferent_access
|
38
38
|
|
39
39
|
# Get the matcher for the supplied key and value. Will determine the class
|
40
40
|
# name from the key.
|
@@ -58,9 +58,9 @@ module Mongoid
|
|
58
58
|
Default.new(extract_attribute(document, key))
|
59
59
|
end
|
60
60
|
else
|
61
|
-
case key
|
62
|
-
when "$or"
|
63
|
-
when "$and"
|
61
|
+
case key.to_s
|
62
|
+
when "$or" then Matchers::Or.new(value, document)
|
63
|
+
when "$and" then Matchers::And.new(value, document)
|
64
64
|
else Default.new(extract_attribute(document, key))
|
65
65
|
end
|
66
66
|
end
|
data/lib/mongoid/observer.rb
CHANGED
@@ -71,6 +71,9 @@ module Mongoid
|
|
71
71
|
# * before_update
|
72
72
|
# * around_update
|
73
73
|
# * after_update
|
74
|
+
# * before_upsert
|
75
|
+
# * around_upsert
|
76
|
+
# * after_upsert
|
74
77
|
# * before_save
|
75
78
|
# * around_save
|
76
79
|
# * after_save
|
@@ -107,29 +110,7 @@ module Mongoid
|
|
107
110
|
# Observers are singletons and that call instantiates and registers them.
|
108
111
|
class Observer < ActiveModel::Observer
|
109
112
|
|
110
|
-
|
111
|
-
#
|
112
|
-
# @example Instantiate the observer.
|
113
|
-
# Mongoid::Observer.new
|
114
|
-
#
|
115
|
-
# @since 2.0.0.rc.8
|
116
|
-
def initialize
|
117
|
-
super and observed_descendants.each { |klass| add_observer!(klass) }
|
118
|
-
end
|
119
|
-
|
120
|
-
protected
|
121
|
-
|
122
|
-
# Get all the child observers.
|
123
|
-
#
|
124
|
-
# @example Get the children.
|
125
|
-
# observer.observed_descendants
|
126
|
-
#
|
127
|
-
# @return [ Array<Class> ] The children.
|
128
|
-
#
|
129
|
-
# @since 2.0.0.rc.8
|
130
|
-
def observed_descendants
|
131
|
-
observed_classes.sum([]) { |klass| klass.descendants }
|
132
|
-
end
|
113
|
+
private
|
133
114
|
|
134
115
|
# Adds the specified observer to the class.
|
135
116
|
#
|
@@ -152,25 +133,35 @@ module Mongoid
|
|
152
133
|
#
|
153
134
|
# @since 2.0.0.rc.8
|
154
135
|
def define_callbacks(klass)
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
end
|
136
|
+
observer = self
|
137
|
+
observer_name = observer.class.name.underscore.gsub('/', '__')
|
138
|
+
Mongoid::Callbacks.observables.each do |callback|
|
139
|
+
next unless respond_to?(callback)
|
140
|
+
callback_meth = :"_notify_#{observer_name}_for_#{callback}"
|
141
|
+
unless klass.respond_to?(callback_meth)
|
142
|
+
klass.send(:define_method, callback_meth) do |&block|
|
143
|
+
if value = observer.update(callback, self, &block)
|
144
|
+
value
|
145
|
+
else
|
146
|
+
block.call if block
|
167
147
|
end
|
168
|
-
klass.send(callback, callback_meth)
|
169
148
|
end
|
149
|
+
klass.send(callback, callback_meth)
|
170
150
|
end
|
171
151
|
end
|
152
|
+
self
|
172
153
|
end
|
173
154
|
|
155
|
+
# Are the observers disabled for the object?
|
156
|
+
#
|
157
|
+
# @api private
|
158
|
+
#
|
159
|
+
# @example If the observer disabled?
|
160
|
+
# Observer.disabled_for(band)
|
161
|
+
#
|
162
|
+
# @param [ Document ] object The model instance.
|
163
|
+
#
|
164
|
+
# @return [ true, false ] If the observer is disabled.
|
174
165
|
def disabled_for?(object)
|
175
166
|
klass = object.class
|
176
167
|
return false unless klass.respond_to?(:observers)
|
data/lib/mongoid/persistence.rb
CHANGED
@@ -19,6 +19,7 @@ module Mongoid
|
|
19
19
|
module Persistence
|
20
20
|
extend ActiveSupport::Concern
|
21
21
|
include Atomic
|
22
|
+
include Mongoid::Atomic::Positionable
|
22
23
|
|
23
24
|
# Remove the document from the database with callbacks.
|
24
25
|
#
|
@@ -113,18 +114,22 @@ module Mongoid
|
|
113
114
|
#
|
114
115
|
# @param [ Symbol ] field The name of an additional field to update.
|
115
116
|
#
|
116
|
-
# @return [ true ] true.
|
117
|
+
# @return [ true/false ] false if record is new_record otherwise true.
|
117
118
|
#
|
118
119
|
# @since 3.0.0
|
119
120
|
def touch(field = nil)
|
121
|
+
return false if _root.new_record?
|
120
122
|
current = Time.now
|
121
123
|
write_attribute(:updated_at, current) if fields["updated_at"]
|
122
124
|
write_attribute(field, current) if field
|
123
|
-
|
124
|
-
|
125
|
-
|
125
|
+
|
126
|
+
touches = touch_atomic_updates(field)
|
127
|
+
unless touches.empty?
|
128
|
+
selector = atomic_selector
|
129
|
+
_root.collection.find(selector).update(positionally(selector, touches))
|
126
130
|
end
|
127
|
-
|
131
|
+
run_callbacks(:touch, :after)
|
132
|
+
true
|
128
133
|
end
|
129
134
|
|
130
135
|
# Update the document in the database.
|
@@ -220,16 +225,26 @@ module Mongoid
|
|
220
225
|
# @example Create a new document.
|
221
226
|
# Person.create(:title => "Mr")
|
222
227
|
#
|
223
|
-
# @
|
228
|
+
# @example Create multiple new documents.
|
229
|
+
# Person.create({ title: "Mr" }, { title: "Mrs" })
|
230
|
+
#
|
231
|
+
# @param [ Hash, Array ] attributes The attributes to create with, or an
|
232
|
+
# Array of multiple attributes for multiple documents.
|
224
233
|
# @param [ Hash ] options A mass-assignment protection options. Supports
|
225
234
|
# :as and :without_protection
|
226
235
|
#
|
227
|
-
# @return [ Document ] The newly created document.
|
228
|
-
|
236
|
+
# @return [ Document, Array<Document> ] The newly created document(s).
|
237
|
+
#
|
238
|
+
# @since 1.0.0
|
239
|
+
def create(attributes = nil, options = {}, &block)
|
229
240
|
_creating do
|
230
|
-
|
231
|
-
|
232
|
-
|
241
|
+
if attributes.is_a?(::Array)
|
242
|
+
attributes.map { |attrs| create(attrs, options, &block) }
|
243
|
+
else
|
244
|
+
doc = new(attributes, options, &block)
|
245
|
+
doc.save
|
246
|
+
doc
|
247
|
+
end
|
233
248
|
end
|
234
249
|
end
|
235
250
|
|
@@ -241,17 +256,27 @@ module Mongoid
|
|
241
256
|
# @example Create a new document.
|
242
257
|
# Person.create!(:title => "Mr")
|
243
258
|
#
|
244
|
-
# @
|
259
|
+
# @example Create multiple new documents.
|
260
|
+
# Person.create!({ title: "Mr" }, { title: "Mrs" })
|
261
|
+
#
|
262
|
+
# @param [ Hash, Array ] attributes The attributes to create with, or an
|
263
|
+
# Array of multiple attributes for multiple documents.
|
245
264
|
# @param [ Hash ] options A mass-assignment protection options. Supports
|
246
265
|
# :as and :without_protection
|
247
266
|
#
|
248
|
-
# @return [ Document ] The newly created document.
|
267
|
+
# @return [ Document, Array<Document> ] The newly created document(s).
|
268
|
+
#
|
269
|
+
# @since 1.0.0
|
249
270
|
def create!(attributes = {}, options = {}, &block)
|
250
271
|
_creating do
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
272
|
+
if attributes.is_a?(::Array)
|
273
|
+
attributes.map { |attrs| create!(attrs, options, &block) }
|
274
|
+
else
|
275
|
+
doc = new(attributes, options, &block)
|
276
|
+
fail_validate!(doc) unless doc.insert.errors.empty?
|
277
|
+
fail_callback!(doc, :create!) if doc.new_record?
|
278
|
+
doc
|
279
|
+
end
|
255
280
|
end
|
256
281
|
end
|
257
282
|
|
@@ -209,17 +209,22 @@ module Mongoid
|
|
209
209
|
|
210
210
|
# Performs the atomic $unset on the supplied field.
|
211
211
|
#
|
212
|
-
# @example
|
213
|
-
#
|
212
|
+
# @example
|
213
|
+
# Remove the field.
|
214
|
+
# person.unset(:age)
|
215
|
+
# Remove fields age and score.
|
216
|
+
# person.unset([:age, :score])
|
214
217
|
#
|
215
|
-
# @param [ Symbol ]
|
218
|
+
# @param [ Symbol, Array<Object> ] fields The fields name.
|
216
219
|
# @param [ Hash ] options The mongo persistence options.
|
217
220
|
#
|
218
221
|
# @return [ nil ] Always nil.
|
219
222
|
#
|
220
223
|
# @since 2.1.0
|
221
|
-
def unset(
|
222
|
-
|
224
|
+
def unset(*args)
|
225
|
+
fields = args.__find_args__
|
226
|
+
options = fields[-1].is_a?(Hash) ? fields.delete_at(-1) : {}
|
227
|
+
Unset.new(self, fields, true, options).persist
|
223
228
|
end
|
224
229
|
end
|
225
230
|
end
|
@@ -5,8 +5,9 @@ module Mongoid
|
|
5
5
|
|
6
6
|
# This is the included module for all atomic operation objects.
|
7
7
|
module Operation
|
8
|
+
include Mongoid::Atomic::Positionable
|
8
9
|
|
9
|
-
attr_accessor :document, :
|
10
|
+
attr_accessor :document, :fields, :value, :options
|
10
11
|
|
11
12
|
# Get the collection to be used for persistence.
|
12
13
|
#
|
@@ -31,10 +32,18 @@ module Mongoid
|
|
31
32
|
# @param [ Hash ] options The persistence options.
|
32
33
|
#
|
33
34
|
# @since 2.0.0
|
34
|
-
def initialize(document,
|
35
|
-
@document, @
|
36
|
-
document, document.database_field_name(field.to_s), value
|
35
|
+
def initialize(document, fields, value, options = {})
|
36
|
+
@document, @value = document, value
|
37
37
|
@options = options
|
38
|
+
|
39
|
+
@fields = Array.wrap(fields).collect do |field|
|
40
|
+
document.database_field_name(field.to_s)
|
41
|
+
end
|
42
|
+
|
43
|
+
self.class.send(:define_method, :field) do
|
44
|
+
@fields.first
|
45
|
+
end if @fields.length == 1
|
46
|
+
|
38
47
|
end
|
39
48
|
|
40
49
|
# Get the atomic operation to perform.
|
@@ -48,7 +57,10 @@ module Mongoid
|
|
48
57
|
#
|
49
58
|
# @since 2.0.0
|
50
59
|
def operation(modifier)
|
51
|
-
|
60
|
+
hash = Hash[fields.collect do |field|
|
61
|
+
[path(field), cast_value]
|
62
|
+
end]
|
63
|
+
{ modifier => hash }
|
52
64
|
end
|
53
65
|
|
54
66
|
# Get the path to the field that is getting atomically updated.
|
@@ -59,7 +71,7 @@ module Mongoid
|
|
59
71
|
# @return [ String, Symbol ] The path to the field.
|
60
72
|
#
|
61
73
|
# @since 2.1.0
|
62
|
-
def path
|
74
|
+
def path(field = field)
|
63
75
|
position = document.atomic_position
|
64
76
|
position.blank? ? field : "#{position}.#{field}"
|
65
77
|
end
|
@@ -108,9 +120,14 @@ module Mongoid
|
|
108
120
|
#
|
109
121
|
# @since 3.0.0
|
110
122
|
def execute(name)
|
111
|
-
|
112
|
-
|
113
|
-
|
123
|
+
unless document.new_record?
|
124
|
+
selector = document.atomic_selector
|
125
|
+
collection.find(selector).update(positionally(selector, operation(name)))
|
126
|
+
if fields.length > 1
|
127
|
+
document.remove_change(fields)
|
128
|
+
else
|
129
|
+
document.remove_change(field)
|
130
|
+
end
|
114
131
|
end
|
115
132
|
end
|
116
133
|
|