mongoid 3.0.17 → 3.0.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.
- data/CHANGELOG.md +22 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +11 -11
- data/lib/mongoid/contextual/mongo.rb +2 -0
- data/lib/mongoid/criteria.rb +49 -9
- data/lib/mongoid/dirty.rb +1 -1
- data/lib/mongoid/document.rb +1 -0
- data/lib/mongoid/finders.rb +18 -43
- data/lib/mongoid/matchers/strategies.rb +4 -4
- data/lib/mongoid/validations/associated.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,28 @@
|
|
3
3
|
For instructions on upgrading to newer versions, visit
|
4
4
|
[mongoid.org](http://mongoid.org/en/mongoid/docs/upgrading.html).
|
5
5
|
|
6
|
+
## 3.0.18
|
7
|
+
|
8
|
+
### Resolved Issues
|
9
|
+
|
10
|
+
* \#2703 Validations on associated documents on fire if the document is
|
11
|
+
changed. (Regression)
|
12
|
+
|
13
|
+
* \#2707 Calling `find_or_create_by` or `find_by_initialize_by` off a relation
|
14
|
+
with a chained criteria or scope now properly keeps the relations intact on
|
15
|
+
the new or found document.
|
16
|
+
|
17
|
+
* \#2699 Resetting a field now removes the name from the changed attributes
|
18
|
+
list. (Subhash Bhushan)
|
19
|
+
|
20
|
+
* \#2683 Aliased fields are now supported when executing atomic operations from
|
21
|
+
criteria. (Arthur Neves)
|
22
|
+
|
23
|
+
* \#2678 Calling `Criteria#sum` with no matching documents returns `0` instead
|
24
|
+
of `nil`.
|
25
|
+
|
26
|
+
* \#2671 Matchers now correctly handle symbol keys. (Jonathan Hyman)
|
27
|
+
|
6
28
|
## 3.0.17
|
7
29
|
|
8
30
|
### Resolved Issues
|
@@ -15,7 +15,7 @@ module Mongoid
|
|
15
15
|
#
|
16
16
|
# @since 3.0.0
|
17
17
|
def add_to_set(field, value)
|
18
|
-
query.update_all("$addToSet" => { field => value })
|
18
|
+
query.update_all("$addToSet" => { database_field_name(field) => value })
|
19
19
|
end
|
20
20
|
|
21
21
|
# Perform an atomic $bit operation on the matching documents.
|
@@ -31,7 +31,7 @@ module Mongoid
|
|
31
31
|
#
|
32
32
|
# @since 3.0.0
|
33
33
|
def bit(field, value)
|
34
|
-
query.update_all("$bit" => { field => value })
|
34
|
+
query.update_all("$bit" => { database_field_name(field) => value })
|
35
35
|
end
|
36
36
|
|
37
37
|
# Perform an atomic $inc operation on the matching documents.
|
@@ -46,7 +46,7 @@ module Mongoid
|
|
46
46
|
#
|
47
47
|
# @since 3.0.0
|
48
48
|
def inc(field, value)
|
49
|
-
query.update_all("$inc" => { field => value })
|
49
|
+
query.update_all("$inc" => { database_field_name(field) => value })
|
50
50
|
end
|
51
51
|
|
52
52
|
# Perform an atomic $pop operation on the matching documents.
|
@@ -66,7 +66,7 @@ module Mongoid
|
|
66
66
|
#
|
67
67
|
# @since 3.0.0
|
68
68
|
def pop(field, value)
|
69
|
-
query.update_all("$pop" => { field => value })
|
69
|
+
query.update_all("$pop" => { database_field_name(field) => value })
|
70
70
|
end
|
71
71
|
|
72
72
|
# Perform an atomic $pull operation on the matching documents.
|
@@ -83,7 +83,7 @@ module Mongoid
|
|
83
83
|
#
|
84
84
|
# @since 3.0.0
|
85
85
|
def pull(field, value)
|
86
|
-
query.update_all("$pull" => { field => value })
|
86
|
+
query.update_all("$pull" => { database_field_name(field) => value })
|
87
87
|
end
|
88
88
|
|
89
89
|
# Perform an atomic $pullAll operation on the matching documents.
|
@@ -98,7 +98,7 @@ module Mongoid
|
|
98
98
|
#
|
99
99
|
# @since 3.0.0
|
100
100
|
def pull_all(field, values)
|
101
|
-
query.update_all("$pullAll" => { field => values })
|
101
|
+
query.update_all("$pullAll" => { database_field_name(field) => values })
|
102
102
|
end
|
103
103
|
|
104
104
|
# Perform an atomic $push operation on the matching documents.
|
@@ -113,7 +113,7 @@ module Mongoid
|
|
113
113
|
#
|
114
114
|
# @since 3.0.0
|
115
115
|
def push(field, value)
|
116
|
-
query.update_all("$push" => { field => value })
|
116
|
+
query.update_all("$push" => { database_field_name(field) => value })
|
117
117
|
end
|
118
118
|
|
119
119
|
# Perform an atomic $pushAll operation on the matching documents.
|
@@ -128,7 +128,7 @@ module Mongoid
|
|
128
128
|
#
|
129
129
|
# @since 3.0.0
|
130
130
|
def push_all(field, values)
|
131
|
-
query.update_all("$pushAll" => { field => values })
|
131
|
+
query.update_all("$pushAll" => { database_field_name(field) => values })
|
132
132
|
end
|
133
133
|
|
134
134
|
# Perform an atomic $rename of fields on the matching documents.
|
@@ -143,7 +143,7 @@ module Mongoid
|
|
143
143
|
#
|
144
144
|
# @since 3.0.0
|
145
145
|
def rename(old_name, new_name)
|
146
|
-
query.update_all("$rename" => { old_name
|
146
|
+
query.update_all("$rename" => { database_field_name(old_name) => new_name.to_s })
|
147
147
|
end
|
148
148
|
|
149
149
|
# Perform an atomic $set of fields on the matching documents.
|
@@ -158,7 +158,7 @@ module Mongoid
|
|
158
158
|
#
|
159
159
|
# @since 3.0.0
|
160
160
|
def set(field, value)
|
161
|
-
query.update_all("$set" => { field => value })
|
161
|
+
query.update_all("$set" => { database_field_name(field) => value })
|
162
162
|
end
|
163
163
|
|
164
164
|
# Perform an atomic $unset of a field on the matching documents.
|
@@ -172,7 +172,7 @@ module Mongoid
|
|
172
172
|
#
|
173
173
|
# @since 3.0.0
|
174
174
|
def unset(field)
|
175
|
-
query.update_all("$unset" => { field => true })
|
175
|
+
query.update_all("$unset" => { database_field_name(field) => true })
|
176
176
|
end
|
177
177
|
end
|
178
178
|
end
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -60,8 +60,8 @@ module Mongoid
|
|
60
60
|
# @return [ Document ] A non-persisted document.
|
61
61
|
#
|
62
62
|
# @since 2.0.0
|
63
|
-
def build(attrs = {})
|
64
|
-
create_document(:new, attrs)
|
63
|
+
def build(attrs = {}, &block)
|
64
|
+
create_document(:new, attrs, &block)
|
65
65
|
end
|
66
66
|
alias :new :build
|
67
67
|
|
@@ -102,8 +102,8 @@ module Mongoid
|
|
102
102
|
# @return [ Document ] A newly created document.
|
103
103
|
#
|
104
104
|
# @since 2.0.0.rc.1
|
105
|
-
def create(attrs = {})
|
106
|
-
create_document(:create, attrs)
|
105
|
+
def create(attrs = {}, &block)
|
106
|
+
create_document(:create, attrs, &block)
|
107
107
|
end
|
108
108
|
|
109
109
|
# Create a document in the database given the selector and return it.
|
@@ -121,8 +121,8 @@ module Mongoid
|
|
121
121
|
# @return [ Document ] A newly created document.
|
122
122
|
#
|
123
123
|
# @since 3.0.0
|
124
|
-
def create!(attrs = {})
|
125
|
-
create_document(:create!, attrs)
|
124
|
+
def create!(attrs = {}, &block)
|
125
|
+
create_document(:create!, attrs, &block)
|
126
126
|
end
|
127
127
|
|
128
128
|
# Get the documents from the embedded criteria.
|
@@ -245,6 +245,32 @@ module Mongoid
|
|
245
245
|
for_ids(ids).execute_or_raise(ids, args.multi_arged?)
|
246
246
|
end
|
247
247
|
|
248
|
+
# Find the first +Document+ given the conditions, or creates a new document
|
249
|
+
# with the conditions that were supplied.
|
250
|
+
#
|
251
|
+
# @example Find or create the document.
|
252
|
+
# Person.find_or_create_by(:attribute => "value")
|
253
|
+
#
|
254
|
+
# @param [ Hash ] attrs The attributes to check.
|
255
|
+
#
|
256
|
+
# @return [ Document ] A matching or newly created document.
|
257
|
+
def find_or_create_by(attrs = {}, &block)
|
258
|
+
find_or(:create, attrs, &block)
|
259
|
+
end
|
260
|
+
|
261
|
+
# Find the first +Document+ given the conditions, or initializes a new document
|
262
|
+
# with the conditions that were supplied.
|
263
|
+
#
|
264
|
+
# @example Find or initialize the document.
|
265
|
+
# Person.find_or_initialize_by(:attribute => "value")
|
266
|
+
#
|
267
|
+
# @param [ Hash ] attrs The attributes to check.
|
268
|
+
#
|
269
|
+
# @return [ Document ] A matching or newly initialized document.
|
270
|
+
def find_or_initialize_by(attrs = {}, &block)
|
271
|
+
find_or(:new, attrs, &block)
|
272
|
+
end
|
273
|
+
|
248
274
|
# Adds a criterion to the +Criteria+ that specifies an id that must be matched.
|
249
275
|
#
|
250
276
|
# @example Add a single id criteria.
|
@@ -600,15 +626,29 @@ module Mongoid
|
|
600
626
|
# @return [ Document ] The new or saved document.
|
601
627
|
#
|
602
628
|
# @since 3.0.0
|
603
|
-
def create_document(method, attrs = {})
|
629
|
+
def create_document(method, attrs = {}, &block)
|
604
630
|
klass.__send__(method,
|
605
631
|
selector.reduce(attrs) do |hash, (key, value)|
|
606
632
|
unless key.to_s =~ /\$/ || value.is_a?(Hash)
|
607
633
|
hash[key] = value
|
608
634
|
end
|
609
635
|
hash
|
610
|
-
end
|
611
|
-
|
636
|
+
end, &block)
|
637
|
+
end
|
638
|
+
|
639
|
+
# Find the first object or create/initialize it.
|
640
|
+
#
|
641
|
+
# @api private
|
642
|
+
#
|
643
|
+
# @example Find or perform an action.
|
644
|
+
# Person.find_or(:create, :name => "Dev")
|
645
|
+
#
|
646
|
+
# @param [ Symbol ] method The method to invoke.
|
647
|
+
# @param [ Hash ] attrs The attributes to query or set.
|
648
|
+
#
|
649
|
+
# @return [ Document ] The first or new document.
|
650
|
+
def find_or(method, attrs = {}, &block)
|
651
|
+
where(attrs).first || send(method, attrs, &block)
|
612
652
|
end
|
613
653
|
|
614
654
|
# Clone or dup the current +Criteria+. This will return a new criteria with
|
data/lib/mongoid/dirty.rb
CHANGED
@@ -239,7 +239,7 @@ module Mongoid
|
|
239
239
|
#
|
240
240
|
# @since 2.4.0
|
241
241
|
def reset_attribute!(attr)
|
242
|
-
attributes[attr] = changed_attributes
|
242
|
+
attributes[attr] = changed_attributes.delete(attr) if attribute_changed?(attr)
|
243
243
|
end
|
244
244
|
|
245
245
|
module ClassMethods
|
data/lib/mongoid/document.rb
CHANGED
@@ -337,6 +337,7 @@ module Mongoid
|
|
337
337
|
doc.instance_variable_set(:@attributes, attributes)
|
338
338
|
doc.apply_defaults
|
339
339
|
IdentityMap.set(doc) unless _loading_revision?
|
340
|
+
yield(doc) if block_given?
|
340
341
|
doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
|
341
342
|
doc
|
342
343
|
end
|
data/lib/mongoid/finders.rb
CHANGED
@@ -7,8 +7,24 @@ module Mongoid
|
|
7
7
|
extend Origin::Forwardable
|
8
8
|
|
9
9
|
select_with :with_default_scope
|
10
|
-
|
11
|
-
|
10
|
+
|
11
|
+
# These are methods defined on the criteria that should also be accessible
|
12
|
+
# directly from the the class level.
|
13
|
+
delegate \
|
14
|
+
:aggregates,
|
15
|
+
:avg,
|
16
|
+
:each,
|
17
|
+
:extras,
|
18
|
+
:find_and_modify,
|
19
|
+
:find_or_create_by,
|
20
|
+
:find_or_initialize_by,
|
21
|
+
:includes,
|
22
|
+
:map_reduce,
|
23
|
+
:max,
|
24
|
+
:min,
|
25
|
+
:sum,
|
26
|
+
:update,
|
27
|
+
:update_all, to: :with_default_scope
|
12
28
|
|
13
29
|
# Returns a count of records in the database.
|
14
30
|
# If you want to specify conditions use where.
|
@@ -61,32 +77,6 @@ module Mongoid
|
|
61
77
|
with_default_scope.find(*args)
|
62
78
|
end
|
63
79
|
|
64
|
-
# Find the first +Document+ given the conditions, or creates a new document
|
65
|
-
# with the conditions that were supplied.
|
66
|
-
#
|
67
|
-
# @example Find or create the document.
|
68
|
-
# Person.find_or_create_by(:attribute => "value")
|
69
|
-
#
|
70
|
-
# @param [ Hash ] attrs The attributes to check.
|
71
|
-
#
|
72
|
-
# @return [ Document ] A matching or newly created document.
|
73
|
-
def find_or_create_by(attrs = {}, &block)
|
74
|
-
find_or(:create, attrs, &block)
|
75
|
-
end
|
76
|
-
|
77
|
-
# Find the first +Document+ given the conditions, or initializes a new document
|
78
|
-
# with the conditions that were supplied.
|
79
|
-
#
|
80
|
-
# @example Find or initialize the document.
|
81
|
-
# Person.find_or_initialize_by(:attribute => "value")
|
82
|
-
#
|
83
|
-
# @param [ Hash ] attrs The attributes to check.
|
84
|
-
#
|
85
|
-
# @return [ Document ] A matching or newly initialized document.
|
86
|
-
def find_or_initialize_by(attrs = {}, &block)
|
87
|
-
find_or(:new, attrs, &block)
|
88
|
-
end
|
89
|
-
|
90
80
|
# Find the first +Document+ given the conditions, or raises
|
91
81
|
# Mongoid::Errors::DocumentNotFound
|
92
82
|
#
|
@@ -128,20 +118,5 @@ module Mongoid
|
|
128
118
|
def last
|
129
119
|
with_default_scope.last
|
130
120
|
end
|
131
|
-
|
132
|
-
protected
|
133
|
-
|
134
|
-
# Find the first object or create/initialize it.
|
135
|
-
#
|
136
|
-
# @example Find or perform an action.
|
137
|
-
# Person.find_or(:create, :name => "Dev")
|
138
|
-
#
|
139
|
-
# @param [ Symbol ] method The method to invoke.
|
140
|
-
# @param [ Hash ] attrs The attributes to query or set.
|
141
|
-
#
|
142
|
-
# @return [ Document ] The first or new document.
|
143
|
-
def find_or(method, attrs = {}, &block)
|
144
|
-
where(attrs).first || send(method, attrs, &block)
|
145
|
-
end
|
146
121
|
end
|
147
122
|
end
|
@@ -21,7 +21,7 @@ module Mongoid
|
|
21
21
|
module Strategies
|
22
22
|
extend self
|
23
23
|
|
24
|
-
MATCHERS = {
|
24
|
+
MATCHERS = HashWithIndifferentAccess.new({
|
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
|
+
})
|
38
38
|
|
39
39
|
# Get the matcher for the supplied key and value. Will determine the class
|
40
40
|
# name from the key.
|
@@ -59,8 +59,8 @@ module Mongoid
|
|
59
59
|
end
|
60
60
|
else
|
61
61
|
case key
|
62
|
-
when "$or" then Matchers::Or.new(value, document)
|
63
|
-
when "$and" then Matchers::And.new(value, document)
|
62
|
+
when "$or", :$or then Matchers::Or.new(value, document)
|
63
|
+
when "$and", :$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/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.18
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|