mongoid 2.0.0.beta.17 → 2.0.0.beta.18

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.
@@ -31,7 +31,6 @@ require "active_support/time_with_zone"
31
31
  require "active_model"
32
32
  require "active_model/callbacks"
33
33
  require "active_model/conversion"
34
- require "active_model/deprecated_error_methods"
35
34
  require "active_model/errors"
36
35
  require "active_model/mass_assignment_security"
37
36
  require "active_model/naming"
@@ -20,9 +20,26 @@ module Mongoid #:nodoc:
20
20
  _children.inject({ "$set" => _sets, "$pushAll" => {}, :other => {} }) do |updates, child|
21
21
  changes = child._sets
22
22
  updates["$set"].update(changes)
23
- processed[child.class] = true unless changes.empty?
23
+ unless changes.empty?
24
+ processed[child._conficting_modification_key] = true
25
+ end
24
26
 
25
- target = processed.has_key?(child.class) ? :other : "$pushAll"
27
+ # MongoDB does not allow "conflicting modifications" to be
28
+ # performed in a single operation. Conflicting modifications are
29
+ # detected by the 'haveConflictingMod' function in MongoDB.
30
+ # Examination of the code suggests that two modifications (a $set
31
+ # and a $pushAll, for example) conflict if (1) the key paths being
32
+ # modified are equal or (2) one key path is a prefix of the other.
33
+ # So a $set of 'addresses.0.street' will conflict with a $pushAll
34
+ # to 'addresses', and we will need to split our update into two
35
+ # pieces. We do not, however, attempt to match MongoDB's logic
36
+ # exactly. Instead, we assume that two updates conflict if the
37
+ # first component of the two key paths matches.
38
+ if processed.has_key?(child._conficting_modification_key)
39
+ target = :other
40
+ else
41
+ target = "$pushAll"
42
+ end
26
43
 
27
44
  child._pushes.each do |attr, val|
28
45
  if updates[target].has_key?(attr)
@@ -38,6 +55,13 @@ module Mongoid #:nodoc:
38
55
  end
39
56
 
40
57
  protected
58
+ # Get the key used to check for conflicting modifications. For now, we
59
+ # just use the first component of _path, and discard the first period
60
+ # and everything that follows.
61
+ def _conficting_modification_key
62
+ _path.sub(/\..*/, '')
63
+ end
64
+
41
65
  # Get all the push attributes that need to occur.
42
66
  def _pushes
43
67
  (new_record? && embedded_many? && !_parent.new_record?) ? { _path => raw_attributes } : {}
@@ -47,7 +47,7 @@ module Mongoid #:nodoc:
47
47
  # Returns:
48
48
  #
49
49
  # true
50
- def _remove
50
+ def _remove(options = {})
51
51
  now = Time.now
52
52
  collection.update({ :_id => self.id }, { '$set' => { :deleted_at => Time.now } })
53
53
  @attributes["deleted_at"] = now
@@ -25,7 +25,7 @@ module Mongoid #:nodoc:
25
25
  def validate_each(document, attribute, value)
26
26
  values = value.is_a?(Array) ? value : [ value ]
27
27
  return if values.collect { |doc| doc.nil? || doc.valid? }.all?
28
- document.errors.add(attribute, :invalid, options.merge!(:value => value))
28
+ document.errors.add(attribute, :invalid, options.merge(:value => value))
29
29
  end
30
30
  end
31
31
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc
3
- VERSION = "2.0.0.beta.17"
3
+ VERSION = "2.0.0.beta.18"
4
4
  end
@@ -28,7 +28,7 @@ module Mongoid #:nodoc:
28
28
  if last_version
29
29
  self.versions << last_version.clone
30
30
  self.versions.shift if self.class.version_max.present? && self.versions.length > self.class.version_max
31
- self.version = version + 1
31
+ self.version = (version || 1 ) + 1
32
32
  @modifications["versions"] = [ nil, @attributes["versions"] ] if @modifications
33
33
  end
34
34
  end
metadata CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
7
7
  - 0
8
8
  - 0
9
9
  - beta
10
- - 17
11
- version: 2.0.0.beta.17
10
+ - 18
11
+ version: 2.0.0.beta.18
12
12
  platform: ruby
13
13
  authors:
14
14
  - Durran Jordan
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-08-30 00:00:00 -04:00
19
+ date: 2010-09-14 00:00:00 -04:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -136,8 +136,8 @@ dependencies:
136
136
  - 0
137
137
  - 0
138
138
  - beta
139
- - 19
140
- version: 2.0.0.beta.19
139
+ - 22
140
+ version: 2.0.0.beta.22
141
141
  type: :development
142
142
  prerelease: false
143
143
  version_requirements: *id008
@@ -344,7 +344,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
344
344
  requirements:
345
345
  - - ">="
346
346
  - !ruby/object:Gem::Version
347
- hash: 408136898212555646
347
+ hash: -407375290619395717
348
348
  segments:
349
349
  - 0
350
350
  version: "0"