mongoid 2.4.8 → 2.4.9
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +38 -0
- data/lib/config/locales/en.yml +1 -1
- data/lib/mongoid/atomic.rb +11 -8
- data/lib/mongoid/atomic/modifiers.rb +56 -15
- data/lib/mongoid/collection.rb +4 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +2 -1
- data/lib/mongoid/fields/internal/big_decimal.rb +7 -1
- data/lib/mongoid/matchers/all.rb +2 -2
- data/lib/mongoid/matchers/in.rb +2 -2
- data/lib/mongoid/relations/bindings/referenced/in.rb +8 -8
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -8
- data/lib/mongoid/relations/bindings/referenced/one.rb +8 -8
- data/lib/mongoid/relations/embedded/many.rb +4 -4
- data/lib/mongoid/relations/proxy.rb +5 -3
- data/lib/mongoid/validations.rb +3 -1
- data/lib/mongoid/validations/format.rb +2 -22
- data/lib/mongoid/validations/length.rb +20 -0
- data/lib/mongoid/validations/localizable.rb +30 -0
- data/lib/mongoid/validations/presence.rb +2 -2
- data/lib/mongoid/validations/uniqueness.rb +3 -3
- data/lib/mongoid/version.rb +1 -1
- metadata +5 -3
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,44 @@
|
|
3
3
|
For instructions on upgrading to newer versions, visit
|
4
4
|
[mongoid.org](http://mongoid.org/docs/upgrading.html).
|
5
5
|
|
6
|
+
## 2.4.10 (branch: 2.4.0-stable)
|
7
|
+
|
8
|
+
### Resolved Issues
|
9
|
+
|
10
|
+
## 2.4.9
|
11
|
+
|
12
|
+
### Resolved Issues
|
13
|
+
|
14
|
+
* \#1943 Ensure numericality validation works for big decimals.
|
15
|
+
|
16
|
+
* \#1938 Length validation now works with localized fields.
|
17
|
+
|
18
|
+
* \#1936 Conflicting pushes with other pushes is now properly handled.
|
19
|
+
|
20
|
+
* \#1933 `Proxy#extend` should delegate through to the target, where
|
21
|
+
extending the proxy itself is now handled through `Proxy#proxy_extend`.
|
22
|
+
|
23
|
+
* \#1930 Ensure complex criteria are expanded in all where clauses.
|
24
|
+
(Hans Hasselberg)
|
25
|
+
|
26
|
+
* \#1928 Deletion of embedded documents via nested attributes now performs
|
27
|
+
a $pull with id match criteria instead of a $pullAll to cover all cases.
|
28
|
+
Previously newly added defaults to documents that had already persisted
|
29
|
+
could not be deleted in this matter since the doc did not match what was
|
30
|
+
in the database.
|
31
|
+
|
32
|
+
* \#1924/\#1917 Fix pushing to embedded relations with default scopes not
|
33
|
+
scoping on the new document. (Hans Hasselberg)
|
34
|
+
|
35
|
+
* \#1922/\#1919 Dropping collections unmemoizes the internally wrapped
|
36
|
+
collection, in order to ensure when defining capped collections that
|
37
|
+
they are always recreated as capped. (Hans Hasselberg)
|
38
|
+
|
39
|
+
* \#1916/\#1913 Uniqueness validation no longer is affected by the default
|
40
|
+
scope. (Hans Hasselberg)
|
41
|
+
|
42
|
+
* \#1778 Ensure foreign keys are always set regardless of binding state.
|
43
|
+
|
6
44
|
## 2.4.8
|
7
45
|
|
8
46
|
### Resolved Issues
|
data/lib/config/locales/en.yml
CHANGED
data/lib/mongoid/atomic.rb
CHANGED
@@ -160,15 +160,18 @@ module Mongoid #:nodoc:
|
|
160
160
|
#
|
161
161
|
# @since 2.2.0
|
162
162
|
def atomic_pulls
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
163
|
+
pulls = {}
|
164
|
+
delayed_atomic_pulls.each_pair do |_, docs|
|
165
|
+
path = nil
|
166
|
+
ids = docs.map do |doc|
|
167
|
+
path ||= doc.atomic_path
|
168
|
+
doc.destroyed = true
|
169
|
+
doc.flagged_for_destroy = false
|
170
|
+
doc.id
|
170
171
|
end
|
172
|
+
pulls[path] = { "_id" => { "$in" => ids }} and path = nil
|
171
173
|
end
|
174
|
+
pulls
|
172
175
|
end
|
173
176
|
|
174
177
|
# Get all the push attributes that need to occur.
|
@@ -273,7 +276,7 @@ module Mongoid #:nodoc:
|
|
273
276
|
mods.push(doc.atomic_pushes)
|
274
277
|
mods.push(doc.atomic_array_pushes)
|
275
278
|
mods.add_to_set(doc.atomic_array_add_to_sets)
|
276
|
-
mods.
|
279
|
+
mods.pull_all(doc.atomic_array_pulls)
|
277
280
|
end
|
278
281
|
end
|
279
282
|
end
|
@@ -26,18 +26,33 @@ module Mongoid #:nodoc:
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
# Adds pull modifiers to the modifiers hash.
|
29
|
+
# Adds pull all modifiers to the modifiers hash.
|
30
30
|
#
|
31
|
-
# @example Add pull operations.
|
32
|
-
# modifiers.
|
31
|
+
# @example Add pull all operations.
|
32
|
+
# modifiers.pull_all({ "addresses" => { "street" => "Bond" }})
|
33
33
|
#
|
34
|
-
# @param [ Hash ] modifications The pull modifiers.
|
34
|
+
# @param [ Hash ] modifications The pull all modifiers.
|
35
35
|
#
|
36
|
-
# @since
|
36
|
+
# @since 3.0.0
|
37
|
+
def pull_all(modifications)
|
38
|
+
modifications.each_pair do |field, value|
|
39
|
+
add_operation(pull_alls, field, value)
|
40
|
+
pull_fields[field.split(".", 2)[0]] = field
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Adds pull all modifiers to the modifiers hash.
|
45
|
+
#
|
46
|
+
# @example Add pull all operations.
|
47
|
+
# modifiers.pull({ "addresses" => { "_id" => { "$in" => [ 1, 2, 3 ]}}})
|
48
|
+
#
|
49
|
+
# @param [ Hash ] modifications The pull all modifiers.
|
50
|
+
#
|
51
|
+
# @since 3.0.0
|
37
52
|
def pull(modifications)
|
38
53
|
modifications.each_pair do |field, value|
|
39
|
-
|
40
|
-
pull_fields
|
54
|
+
pulls[field] = value
|
55
|
+
pull_fields[field.split(".", 2)[0]] = field
|
41
56
|
end
|
42
57
|
end
|
43
58
|
|
@@ -51,6 +66,7 @@ module Mongoid #:nodoc:
|
|
51
66
|
# @since 2.1.0
|
52
67
|
def push(modifications)
|
53
68
|
modifications.each_pair do |field, value|
|
69
|
+
push_fields[field] = field
|
54
70
|
mods = push_conflict?(field) ? conflicting_pushes : pushes
|
55
71
|
add_operation(mods, field, Array.wrap(value))
|
56
72
|
end
|
@@ -69,7 +85,7 @@ module Mongoid #:nodoc:
|
|
69
85
|
next if field == "_id"
|
70
86
|
mods = set_conflict?(field) ? conflicting_sets : sets
|
71
87
|
add_operation(mods, field, value)
|
72
|
-
set_fields
|
88
|
+
set_fields[field.split(".", 2)[0]] = field
|
73
89
|
end
|
74
90
|
end
|
75
91
|
|
@@ -133,7 +149,7 @@ module Mongoid #:nodoc:
|
|
133
149
|
#
|
134
150
|
# @since 2.2.0
|
135
151
|
def set_conflict?(field)
|
136
|
-
pull_fields.
|
152
|
+
pull_fields.has_key?(field.split(".", 2)[0])
|
137
153
|
end
|
138
154
|
|
139
155
|
# Is the operation going to be a conflict for a $push?
|
@@ -148,7 +164,8 @@ module Mongoid #:nodoc:
|
|
148
164
|
# @since 2.2.0
|
149
165
|
def push_conflict?(field)
|
150
166
|
name = field.split(".", 2)[0]
|
151
|
-
set_fields.
|
167
|
+
set_fields.has_key?(name) || pull_fields.has_key?(name) ||
|
168
|
+
(push_fields.keys.count { |item| item =~ /#{name}/ } > 1)
|
152
169
|
end
|
153
170
|
|
154
171
|
# Get the conflicting pull modifications.
|
@@ -208,7 +225,19 @@ module Mongoid #:nodoc:
|
|
208
225
|
#
|
209
226
|
# @since 2.2.0
|
210
227
|
def pull_fields
|
211
|
-
@pull_fields ||=
|
228
|
+
@pull_fields ||= {}
|
229
|
+
end
|
230
|
+
|
231
|
+
# Get the names of the fields that need to be pushed.
|
232
|
+
#
|
233
|
+
# @example Get the push fields.
|
234
|
+
# modifiers.push_fields
|
235
|
+
#
|
236
|
+
# @return [ Array<String> ] The push fields.
|
237
|
+
#
|
238
|
+
# @since 2.2.0
|
239
|
+
def push_fields
|
240
|
+
@push_fields ||= {}
|
212
241
|
end
|
213
242
|
|
214
243
|
# Get the names of the fields that need to be set.
|
@@ -220,21 +249,33 @@ module Mongoid #:nodoc:
|
|
220
249
|
#
|
221
250
|
# @since 2.2.0
|
222
251
|
def set_fields
|
223
|
-
@set_fields ||=
|
252
|
+
@set_fields ||= {}
|
224
253
|
end
|
225
254
|
|
226
255
|
# Get the $pullAll operations or intialize a new one.
|
227
256
|
#
|
228
257
|
# @example Get the $pullAll operations.
|
229
|
-
# modifiers.
|
258
|
+
# modifiers.pull_alls
|
230
259
|
#
|
231
260
|
# @return [ Hash ] The $pullAll operations.
|
232
261
|
#
|
233
|
-
# @since
|
234
|
-
def
|
262
|
+
# @since 3.0.0
|
263
|
+
def pull_alls
|
235
264
|
self["$pullAll"] ||= {}
|
236
265
|
end
|
237
266
|
|
267
|
+
# Get the $pull operations or intialize a new one.
|
268
|
+
#
|
269
|
+
# @example Get the $pull operations.
|
270
|
+
# modifiers.pulls
|
271
|
+
#
|
272
|
+
# @return [ Hash ] The $pull operations.
|
273
|
+
#
|
274
|
+
# @since 3.0.0
|
275
|
+
def pulls
|
276
|
+
self["$pull"] ||= {}
|
277
|
+
end
|
278
|
+
|
238
279
|
# Get the $pushAll operations or intialize a new one.
|
239
280
|
#
|
240
281
|
# @example Get the $pushAll operations.
|
data/lib/mongoid/collection.rb
CHANGED
@@ -16,12 +16,13 @@ module Mongoid #:nodoc:
|
|
16
16
|
# @since 1.0.0
|
17
17
|
def expand_complex_criteria
|
18
18
|
{}.tap do |hsh|
|
19
|
-
each_pair do |k,v|
|
19
|
+
each_pair do |k, v|
|
20
20
|
if k.respond_to?(:key) && k.respond_to?(:to_mongo_query)
|
21
21
|
hsh[k.key] ||= {}
|
22
22
|
v = v.expand_complex_criteria if v.is_a?(::Hash)
|
23
23
|
hsh[k.key].merge!(k.to_mongo_query(v))
|
24
24
|
else
|
25
|
+
v.map!{|e| e.is_a?(::Hash) ? e.expand_complex_criteria : e } if v.is_a?(::Array)
|
25
26
|
hsh[k] = v
|
26
27
|
end
|
27
28
|
end
|
@@ -19,7 +19,13 @@ module Mongoid #:nodoc:
|
|
19
19
|
#
|
20
20
|
# @since 2.1.0
|
21
21
|
def deserialize(object)
|
22
|
-
|
22
|
+
return object unless object
|
23
|
+
begin
|
24
|
+
Float(object)
|
25
|
+
::BigDecimal.new(object)
|
26
|
+
rescue ArgumentError, TypeError
|
27
|
+
object
|
28
|
+
end
|
23
29
|
end
|
24
30
|
|
25
31
|
# Special case to serialize the object.
|
data/lib/mongoid/matchers/all.rb
CHANGED
@@ -15,8 +15,8 @@ module Mongoid #:nodoc:
|
|
15
15
|
# @return [ true, false ] If the values match.
|
16
16
|
def matches?(value)
|
17
17
|
attribute_array = Array.wrap(@attribute)
|
18
|
-
value.values.first.all? do |e|
|
19
|
-
if e.is_a?(Regexp)
|
18
|
+
value.values.first.all? do |e|
|
19
|
+
if e.is_a?(Regexp)
|
20
20
|
attribute_array.any? { |_attribute| _attribute =~ e }
|
21
21
|
else
|
22
22
|
attribute_array.include?(e)
|
data/lib/mongoid/matchers/in.rb
CHANGED
@@ -15,8 +15,8 @@ module Mongoid #:nodoc:
|
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
16
|
def matches?(value)
|
17
17
|
attribute_array = Array.wrap(@attribute)
|
18
|
-
value.values.first.any? do |e|
|
19
|
-
if e.is_a?(Regexp)
|
18
|
+
value.values.first.any? do |e|
|
19
|
+
if e.is_a?(Regexp)
|
20
20
|
attribute_array.any? { |_attribute| _attribute =~ e }
|
21
21
|
else
|
22
22
|
attribute_array.include?(e)
|
@@ -19,13 +19,13 @@ module Mongoid # :nodoc:
|
|
19
19
|
#
|
20
20
|
# @since 2.0.0.rc.1
|
21
21
|
def bind
|
22
|
+
base.you_must(metadata.foreign_key_setter, target.id)
|
23
|
+
if metadata.inverse_type
|
24
|
+
base.you_must(metadata.inverse_type_setter, target.class.model_name)
|
25
|
+
end
|
22
26
|
unless _binding?
|
23
27
|
_binding do
|
24
28
|
inverse = metadata.inverse(target)
|
25
|
-
base.you_must(metadata.foreign_key_setter, target.id)
|
26
|
-
if metadata.inverse_type
|
27
|
-
base.you_must(metadata.inverse_type_setter, target.class.model_name)
|
28
|
-
end
|
29
29
|
if inverse
|
30
30
|
if set_base_metadata
|
31
31
|
if base.referenced_many?
|
@@ -49,13 +49,13 @@ module Mongoid # :nodoc:
|
|
49
49
|
#
|
50
50
|
# @since 2.0.0.rc.1
|
51
51
|
def unbind
|
52
|
+
base.you_must(metadata.foreign_key_setter, nil)
|
53
|
+
if metadata.inverse_type
|
54
|
+
base.you_must(metadata.inverse_type_setter, nil)
|
55
|
+
end
|
52
56
|
unless _binding?
|
53
57
|
_binding do
|
54
58
|
inverse = metadata.inverse(target)
|
55
|
-
base.you_must(metadata.foreign_key_setter, nil)
|
56
|
-
if metadata.inverse_type
|
57
|
-
base.you_must(metadata.inverse_type_setter, nil)
|
58
|
-
end
|
59
59
|
if inverse
|
60
60
|
set_base_metadata
|
61
61
|
if base.referenced_many?
|
@@ -17,12 +17,12 @@ module Mongoid # :nodoc:
|
|
17
17
|
#
|
18
18
|
# @since 2.0.0.rc.1
|
19
19
|
def bind_one(doc)
|
20
|
+
doc.you_must(metadata.foreign_key_setter, base.id)
|
21
|
+
if metadata.type
|
22
|
+
doc.you_must(metadata.type_setter, base.class.model_name)
|
23
|
+
end
|
20
24
|
unless _binding?
|
21
25
|
_binding do
|
22
|
-
doc.you_must(metadata.foreign_key_setter, base.id)
|
23
|
-
if metadata.type
|
24
|
-
doc.you_must(metadata.type_setter, base.class.model_name)
|
25
|
-
end
|
26
26
|
doc.send(metadata.inverse_setter, base)
|
27
27
|
end
|
28
28
|
end
|
@@ -37,12 +37,12 @@ module Mongoid # :nodoc:
|
|
37
37
|
#
|
38
38
|
# @since 2.0.0.rc.1
|
39
39
|
def unbind_one(doc)
|
40
|
+
doc.you_must(metadata.foreign_key_setter, nil)
|
41
|
+
if metadata.type
|
42
|
+
doc.you_must(metadata.type_setter, nil)
|
43
|
+
end
|
40
44
|
unless _binding?
|
41
45
|
_binding do
|
42
|
-
doc.you_must(metadata.foreign_key_setter, nil)
|
43
|
-
if metadata.type
|
44
|
-
doc.you_must(metadata.type_setter, nil)
|
45
|
-
end
|
46
46
|
doc.send(metadata.inverse_setter, nil)
|
47
47
|
end
|
48
48
|
end
|
@@ -19,13 +19,13 @@ module Mongoid # :nodoc:
|
|
19
19
|
#
|
20
20
|
# @since 2.0.0.rc.1
|
21
21
|
def bind
|
22
|
+
target.you_must(metadata.foreign_key_setter, base.id)
|
23
|
+
if metadata.type
|
24
|
+
target.you_must(metadata.type_setter, base.class.model_name)
|
25
|
+
end
|
22
26
|
unless _binding?
|
23
27
|
_binding do
|
24
|
-
target.you_must(metadata.foreign_key_setter, base.id)
|
25
28
|
target.send(metadata.inverse_setter, base)
|
26
|
-
if metadata.type
|
27
|
-
target.you_must(metadata.type_setter, base.class.model_name)
|
28
|
-
end
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -40,13 +40,13 @@ module Mongoid # :nodoc:
|
|
40
40
|
#
|
41
41
|
# @since 2.0.0.rc.1
|
42
42
|
def unbind
|
43
|
+
target.you_must(metadata.foreign_key_setter, nil)
|
44
|
+
if metadata.type
|
45
|
+
target.you_must(metadata.type_setter, nil)
|
46
|
+
end
|
43
47
|
unless _binding?
|
44
48
|
_binding do
|
45
|
-
target.you_must(metadata.foreign_key_setter, nil)
|
46
49
|
target.send(metadata.inverse_setter, nil)
|
47
|
-
if metadata.type
|
48
|
-
target.you_must(metadata.type_setter, nil)
|
49
|
-
end
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -300,7 +300,7 @@ module Mongoid # :nodoc:
|
|
300
300
|
tap do |proxy|
|
301
301
|
if replacement.blank?
|
302
302
|
if _assigning? && !proxy.empty?
|
303
|
-
base.atomic_unsets.push(
|
303
|
+
base.atomic_unsets.push(_unscoped.first.atomic_path)
|
304
304
|
end
|
305
305
|
proxy.clear
|
306
306
|
else
|
@@ -318,7 +318,7 @@ module Mongoid # :nodoc:
|
|
318
318
|
doc.save if base.persisted? && !_assigning?
|
319
319
|
end
|
320
320
|
if _assigning?
|
321
|
-
name =
|
321
|
+
name = _unscoped.first.atomic_path
|
322
322
|
base.delayed_atomic_sets[name] = proxy.as_document
|
323
323
|
end
|
324
324
|
end
|
@@ -353,10 +353,10 @@ module Mongoid # :nodoc:
|
|
353
353
|
#
|
354
354
|
# @since 2.0.0.rc.1
|
355
355
|
def append(document)
|
356
|
-
target.push(document)
|
356
|
+
target.push(*scope([document]))
|
357
357
|
_unscoped.push(document)
|
358
358
|
integrate(document)
|
359
|
-
document._index =
|
359
|
+
document._index = _unscoped.size - 1
|
360
360
|
end
|
361
361
|
|
362
362
|
# Instantiate the binding associated with this relation.
|
@@ -5,14 +5,16 @@ module Mongoid # :nodoc:
|
|
5
5
|
# This class is the superclass for all relation proxy objects, and contains
|
6
6
|
# common behaviour for all of them.
|
7
7
|
class Proxy
|
8
|
-
|
8
|
+
alias :extend_proxy :extend
|
9
9
|
|
10
10
|
# We undefine most methods to get them sent through to the target.
|
11
11
|
instance_methods.each do |method|
|
12
12
|
undef_method(method) unless
|
13
|
-
method =~ /(^__|^send
|
13
|
+
method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy)/
|
14
14
|
end
|
15
15
|
|
16
|
+
include Threaded::Lifecycle
|
17
|
+
|
16
18
|
attr_accessor :base, :loaded, :metadata, :target
|
17
19
|
|
18
20
|
# Backwards compatibility with Mongoid beta releases.
|
@@ -34,7 +36,7 @@ module Mongoid # :nodoc:
|
|
34
36
|
def init(base, target, metadata)
|
35
37
|
@base, @target, @metadata = base, target, metadata
|
36
38
|
yield(self) if block_given?
|
37
|
-
|
39
|
+
extend_proxy(metadata.extension) if metadata.extension?
|
38
40
|
end
|
39
41
|
|
40
42
|
# The default substitutable object for a relation proxy is the clone of
|
data/lib/mongoid/validations.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "mongoid/validations/localizable"
|
2
3
|
require "mongoid/validations/associated"
|
3
4
|
require "mongoid/validations/format"
|
4
|
-
require "mongoid/validations/
|
5
|
+
require "mongoid/validations/length"
|
5
6
|
require "mongoid/validations/presence"
|
7
|
+
require "mongoid/validations/uniqueness"
|
6
8
|
|
7
9
|
module Mongoid #:nodoc:
|
8
10
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Validations #:nodoc:
|
4
4
|
|
5
|
-
# Validates that the specified attributes do or do not match a certain
|
5
|
+
# Validates that the specified attributes do or do not match a certain
|
6
6
|
# regular expression.
|
7
7
|
#
|
8
8
|
# @example Set up the format validator.
|
@@ -14,27 +14,7 @@ module Mongoid #:nodoc:
|
|
14
14
|
# validates_format_of :website, :with => URI.regexp
|
15
15
|
# end
|
16
16
|
class FormatValidator < ActiveModel::Validations::FormatValidator
|
17
|
-
|
18
|
-
# Validates each for format.
|
19
|
-
#
|
20
|
-
# @example Validate format.
|
21
|
-
# validator.validate_each(model, :name, "value")
|
22
|
-
#
|
23
|
-
# @param [ Document ] document The document.
|
24
|
-
# @param [ Symbol, String ] attribute The attribute to validate.
|
25
|
-
# @param [ Object ] value The attribute value.
|
26
|
-
#
|
27
|
-
# @since 2.4.2
|
28
|
-
def validate_each(document, attribute, value)
|
29
|
-
field = document.fields[attribute.to_s]
|
30
|
-
if field && field.localized? && !value.blank?
|
31
|
-
value.each_pair do |_locale, _value|
|
32
|
-
super(document, attribute, _value)
|
33
|
-
end
|
34
|
-
else
|
35
|
-
super
|
36
|
-
end
|
37
|
-
end
|
17
|
+
include Localizable
|
38
18
|
end
|
39
19
|
end
|
40
20
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Validations
|
4
|
+
|
5
|
+
# Validates that the specified attributes do or do not match a certain
|
6
|
+
# length.
|
7
|
+
#
|
8
|
+
# @example Set up the length validator.
|
9
|
+
#
|
10
|
+
# class Person
|
11
|
+
# include Mongoid::Document
|
12
|
+
# field :website
|
13
|
+
#
|
14
|
+
# validates_length_of :website, in: 1..10
|
15
|
+
# end
|
16
|
+
class LengthValidator < ActiveModel::Validations::LengthValidator
|
17
|
+
include Localizable
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Validations
|
4
|
+
|
5
|
+
# Adds localization support to validations.
|
6
|
+
module Localizable
|
7
|
+
|
8
|
+
# Validates each for localized fields.
|
9
|
+
#
|
10
|
+
# @example Validate localized fields.
|
11
|
+
# validator.validate_each(model, :name, "value")
|
12
|
+
#
|
13
|
+
# @param [ Document ] document The document.
|
14
|
+
# @param [ Symbol, String ] attribute The attribute to validate.
|
15
|
+
# @param [ Object ] value The attribute value.
|
16
|
+
#
|
17
|
+
# @since 2.4.2
|
18
|
+
def validate_each(document, attribute, value)
|
19
|
+
field = document.fields[attribute.to_s]
|
20
|
+
if field.try(:localized?) && !value.blank?
|
21
|
+
value.values.each do |_value|
|
22
|
+
super(document, attribute, _value)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -27,9 +27,9 @@ module Mongoid #:nodoc:
|
|
27
27
|
# @since 2.4.0
|
28
28
|
def validate_each(document, attribute, value)
|
29
29
|
field = document.fields[attribute.to_s]
|
30
|
-
if field
|
30
|
+
if field.try(:localized?) && !value.blank?
|
31
31
|
value.each_pair do |locale, value|
|
32
|
-
document.errors.add(attribute, :blank_on_locale, options.merge(:
|
32
|
+
document.errors.add(attribute, :blank_on_locale, options.merge(:location => locale)) if value.blank?
|
33
33
|
end
|
34
34
|
else
|
35
35
|
document.errors.add(attribute, :blank, options) if value.blank?
|
@@ -56,7 +56,7 @@ module Mongoid #:nodoc:
|
|
56
56
|
)
|
57
57
|
end
|
58
58
|
else
|
59
|
-
criteria = klass.where(criterion(document, attrib, val))
|
59
|
+
criteria = klass.unscoped.where(criterion(document, attrib, val))
|
60
60
|
criteria = scope(criteria, document, attrib)
|
61
61
|
if criteria.exists?
|
62
62
|
document.errors.add(
|
@@ -146,7 +146,7 @@ module Mongoid #:nodoc:
|
|
146
146
|
!document._parent || document.embedded_one?
|
147
147
|
end
|
148
148
|
|
149
|
-
# Scope reference has changed?
|
149
|
+
# Scope reference has changed?
|
150
150
|
#
|
151
151
|
# @example Has scope reference changed?
|
152
152
|
# validator.scope_value_changed?(doc)
|
@@ -155,7 +155,7 @@ module Mongoid #:nodoc:
|
|
155
155
|
#
|
156
156
|
# @return [ true, false ] If the scope reference has changed.
|
157
157
|
#
|
158
|
-
# @since
|
158
|
+
# @since
|
159
159
|
def scope_value_changed?(document)
|
160
160
|
Array.wrap(options[:scope]).any? do |item|
|
161
161
|
document.send("attribute_changed?", item.to_s)
|
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: 2.4.
|
4
|
+
version: 2.4.9
|
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: 2012-04-
|
12
|
+
date: 2012-04-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -425,6 +425,8 @@ files:
|
|
425
425
|
- lib/mongoid/timestamps.rb
|
426
426
|
- lib/mongoid/validations/associated.rb
|
427
427
|
- lib/mongoid/validations/format.rb
|
428
|
+
- lib/mongoid/validations/length.rb
|
429
|
+
- lib/mongoid/validations/localizable.rb
|
428
430
|
- lib/mongoid/validations/presence.rb
|
429
431
|
- lib/mongoid/validations/uniqueness.rb
|
430
432
|
- lib/mongoid/validations.rb
|
@@ -459,7 +461,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
459
461
|
version: '0'
|
460
462
|
segments:
|
461
463
|
- 0
|
462
|
-
hash:
|
464
|
+
hash: 3721994237204070315
|
463
465
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
464
466
|
none: false
|
465
467
|
requirements:
|