mongoid 2.0.0.rc.7 → 2.0.0.rc.8
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/lib/config/locales/en.yml +3 -0
- data/lib/config/locales/id.yml +46 -0
- data/lib/config/locales/ja.yml +40 -0
- data/lib/config/locales/vi.yml +45 -0
- data/lib/mongoid.rb +5 -3
- data/lib/mongoid/attributes.rb +24 -63
- data/lib/mongoid/attributes/processing.rb +5 -2
- data/lib/mongoid/callbacks.rb +10 -0
- data/lib/mongoid/collection.rb +24 -0
- data/lib/mongoid/collections/master.rb +14 -6
- data/lib/mongoid/collections/operations.rb +1 -1
- data/lib/mongoid/collections/retry.rb +39 -0
- data/lib/mongoid/collections/slaves.rb +26 -10
- data/lib/mongoid/components.rb +4 -4
- data/lib/mongoid/config.rb +6 -3
- data/lib/mongoid/contexts.rb +0 -1
- data/lib/mongoid/contexts/enumerable.rb +19 -7
- data/lib/mongoid/contexts/mongo.rb +9 -5
- data/lib/mongoid/copyable.rb +10 -8
- data/lib/mongoid/criteria.rb +83 -61
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/creational.rb +2 -2
- data/lib/mongoid/criterion/exclusion.rb +58 -32
- data/lib/mongoid/criterion/inclusion.rb +49 -10
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/criterion/selector.rb +80 -11
- data/lib/mongoid/cursor.rb +6 -1
- data/lib/mongoid/default_scope.rb +27 -19
- data/lib/mongoid/document.rb +26 -1
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +7 -4
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/field.rb +47 -30
- data/lib/mongoid/fields.rb +9 -2
- data/lib/mongoid/finders.rb +15 -49
- data/lib/mongoid/identity.rb +6 -4
- data/lib/mongoid/keys.rb +85 -31
- data/lib/mongoid/multi_parameter_attributes.rb +2 -2
- data/lib/mongoid/named_scope.rb +129 -28
- data/lib/mongoid/observer.rb +36 -0
- data/lib/mongoid/paranoia.rb +3 -3
- data/lib/mongoid/paths.rb +1 -1
- data/lib/mongoid/persistence.rb +2 -0
- data/lib/mongoid/persistence/atomic.rb +88 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +30 -0
- data/lib/mongoid/persistence/atomic/inc.rb +28 -0
- data/lib/mongoid/persistence/atomic/operation.rb +44 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +33 -0
- data/lib/mongoid/persistence/atomic/push.rb +28 -0
- data/lib/mongoid/railtie.rb +13 -1
- data/lib/mongoid/relations.rb +1 -0
- data/lib/mongoid/relations/accessors.rb +20 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +17 -6
- data/lib/mongoid/relations/builders/referenced/many.rb +2 -1
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -0
- data/lib/mongoid/relations/embedded/atomic.rb +86 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/many.rb +57 -25
- data/lib/mongoid/relations/macros.rb +6 -4
- data/lib/mongoid/relations/many.rb +51 -10
- data/lib/mongoid/relations/metadata.rb +4 -2
- data/lib/mongoid/relations/proxy.rb +39 -24
- data/lib/mongoid/relations/referenced/many.rb +47 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +47 -14
- data/lib/mongoid/relations/referenced/one.rb +14 -0
- data/lib/mongoid/sharding.rb +51 -0
- data/lib/mongoid/state.rb +3 -2
- data/lib/mongoid/timestamps.rb +5 -29
- data/lib/mongoid/timestamps/created.rb +31 -0
- data/lib/mongoid/timestamps/updated.rb +33 -0
- data/lib/mongoid/validations.rb +10 -3
- data/lib/mongoid/validations/referenced.rb +58 -0
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +67 -5
- data/lib/rails/generators/mongoid/model/templates/model.rb +2 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/mongoid_generator.rb +10 -1
- data/lib/rails/mongoid.rb +1 -0
- metadata +29 -8
- data/lib/mongoid/contexts/ids.rb +0 -25
- data/lib/mongoid/modifiers.rb +0 -24
- data/lib/mongoid/modifiers/command.rb +0 -18
- data/lib/mongoid/modifiers/inc.rb +0 -24
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Criterion #:nodoc:
|
4
|
+
|
5
|
+
# This module defines criteria behavior for building documents for
|
6
|
+
# specified conditions.
|
7
|
+
module Builder
|
8
|
+
|
9
|
+
# Build a document given the selector and return it.
|
10
|
+
# Complex criteria, such as $in and $or operations will get ignored.
|
11
|
+
#
|
12
|
+
# @example build the document.
|
13
|
+
# Person.where(:title => "Sir").build
|
14
|
+
#
|
15
|
+
# @example Build with selectors getting ignored.
|
16
|
+
# Person.where(:age.gt => 5).build
|
17
|
+
#
|
18
|
+
# @return [ Document ] A non-persisted document.
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
def build(attrs = {})
|
22
|
+
klass.new(
|
23
|
+
selector.inject(attrs) do |hash, (key, value)|
|
24
|
+
hash.tap do |attrs|
|
25
|
+
unless key.to_s =~ /\$/ || value.is_a?(Hash)
|
26
|
+
attrs[key] = value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -18,9 +18,9 @@ module Mongoid #:nodoc:
|
|
18
18
|
# @return [ Document ] A newly created document.
|
19
19
|
#
|
20
20
|
# @since 2.0.0.rc.1
|
21
|
-
def create
|
21
|
+
def create(attrs = {})
|
22
22
|
klass.create(
|
23
|
-
selector.inject(
|
23
|
+
selector.inject(attrs) do |hash, (key, value)|
|
24
24
|
hash.tap do |attrs|
|
25
25
|
unless key.to_s =~ /\$/ || value.is_a?(Hash)
|
26
26
|
attrs[key] = value
|
@@ -1,23 +1,23 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Criterion #:nodoc:
|
4
|
+
|
5
|
+
# This module contains criteria behaviour for exclusion of values.
|
4
6
|
module Exclusion
|
5
|
-
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# Options:
|
10
|
-
#
|
11
|
-
# attributes: A +Hash+ where the key is the field name and the value is a
|
12
|
-
# value that must not be equal to the corresponding field value in the database.
|
13
|
-
#
|
14
|
-
# Example:
|
7
|
+
|
8
|
+
# Adds a criterion to the +Criteria+ that specifies values that are not
|
9
|
+
# allowed to match any document in the database. The MongoDB
|
10
|
+
# conditional operator that will be used is "$ne".
|
15
11
|
#
|
16
|
-
#
|
12
|
+
# @example Match documents without these values.
|
13
|
+
# criteria.excludes(:field => "value1")
|
14
|
+
# criteria.excludes(:field1 => "value1", :field2 => "value1")
|
17
15
|
#
|
18
|
-
#
|
16
|
+
# @param [ Hash ] attributes: A +Hash+ where the key is the field
|
17
|
+
# name and the value is a value that must not be equal to the
|
18
|
+
# corresponding field value in the database.
|
19
19
|
#
|
20
|
-
#
|
20
|
+
# @return [ Criteria ] A newly cloned copy.
|
21
21
|
def excludes(attributes = {})
|
22
22
|
mongo_id = attributes.delete(:id)
|
23
23
|
attributes = attributes.merge(:_id => mongo_id) if mongo_id
|
@@ -25,21 +25,18 @@ module Mongoid #:nodoc:
|
|
25
25
|
end
|
26
26
|
|
27
27
|
# Adds a criterion to the +Criteria+ that specifies values where none
|
28
|
-
# should match in order to return results. This is similar to an SQL
|
29
|
-
# clause. The MongoDB conditional operator that will be
|
28
|
+
# should match in order to return results. This is similar to an SQL
|
29
|
+
# "NOT IN" clause. The MongoDB conditional operator that will be
|
30
|
+
# used is "$nin".
|
30
31
|
#
|
31
|
-
#
|
32
|
+
# @example Match documents with values not in the provided.
|
33
|
+
# criteria.not_in(:field => ["value1", "value2"])
|
34
|
+
# criteria.not_in(:field1 => ["value1", "value2"], :field2 => ["value1"])
|
32
35
|
#
|
33
|
-
# attributes
|
34
|
-
# +Array+ of values that none can match.
|
36
|
+
# @param [ Hash ] attributes A +Hash+ where the key is the field name
|
37
|
+
# and the value is an +Array+ of values that none can match.
|
35
38
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# <tt>criteria.not_in(:field => ["value1", "value2"])</tt>
|
39
|
-
#
|
40
|
-
# <tt>criteria.not_in(:field1 => ["value1", "value2"], :field2 => ["value1"])</tt>
|
41
|
-
#
|
42
|
-
# Returns: <tt>self</tt>
|
39
|
+
# @return [ Criteria ] A newly cloned copy.
|
43
40
|
def not_in(attributes)
|
44
41
|
update_selector(attributes, "$nin")
|
45
42
|
end
|
@@ -48,18 +45,47 @@ module Mongoid #:nodoc:
|
|
48
45
|
# get returned from the Document. Used mainly for list views that do not
|
49
46
|
# require all fields to be present. This is similar to SQL "SELECT" values.
|
50
47
|
#
|
51
|
-
#
|
48
|
+
# @example Limit the fields to only the specified.
|
49
|
+
# criteria.only(:field1, :field2, :field3)
|
52
50
|
#
|
53
|
-
#
|
51
|
+
# @note #only and #without cannot be used together.
|
54
52
|
#
|
55
|
-
#
|
53
|
+
# @param [ Array<Symbol> ] args A list of field names to limit to.
|
56
54
|
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# Returns: <tt>self</tt>
|
55
|
+
# @return [ Criteria ] A newly cloned copy.
|
60
56
|
def only(*args)
|
61
57
|
clone.tap do |crit|
|
62
|
-
|
58
|
+
if args.any?
|
59
|
+
crit.options[:fields] = {:_type => 1}
|
60
|
+
crit.field_list = args.flatten
|
61
|
+
crit.field_list.each do |f|
|
62
|
+
crit.options[:fields][f] = 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Adds a criterion to the +Criteria+ that specifies the fields that will
|
69
|
+
# not get returned by the document.
|
70
|
+
#
|
71
|
+
# @example Filter out specific fields.
|
72
|
+
# criteria.without(:field2, :field2)
|
73
|
+
#
|
74
|
+
# @note #only and #without cannot be used together.
|
75
|
+
#
|
76
|
+
# @param [ Array<Symbol> args A list of fields to exclude.
|
77
|
+
#
|
78
|
+
# @return [ Criteria ] A newly cloned copy.
|
79
|
+
#
|
80
|
+
# @since 2.0.0
|
81
|
+
def without(*args)
|
82
|
+
clone.tap do |crit|
|
83
|
+
if args.any?
|
84
|
+
crit.options[:fields] = {}
|
85
|
+
args.flatten.each do |f|
|
86
|
+
crit.options[:fields][f] = 0
|
87
|
+
end
|
88
|
+
end
|
63
89
|
end
|
64
90
|
end
|
65
91
|
end
|
@@ -20,6 +20,22 @@ module Mongoid #:nodoc:
|
|
20
20
|
end
|
21
21
|
alias :all_in :all
|
22
22
|
|
23
|
+
# Adds a criterion to the +Criteria+ that specifies values where any can
|
24
|
+
# be matched in order to return results. This is similar to an SQL "IN"
|
25
|
+
# clause. The MongoDB conditional operator that will be used is "$in".
|
26
|
+
# Any previously matching "$in" arrays will be unioned with new
|
27
|
+
# arguments.
|
28
|
+
#
|
29
|
+
# @example Adding the criterion.
|
30
|
+
# criteria.in(:field => ["value1"]).also_in(:field => ["value2"])
|
31
|
+
#
|
32
|
+
# @param [ Hash ] attributes Name/value pairs any can match.
|
33
|
+
#
|
34
|
+
# @return [ Criteria ] A new criteria with the added selector.
|
35
|
+
def also_in(attributes = {})
|
36
|
+
update_selector(attributes, "$in")
|
37
|
+
end
|
38
|
+
|
23
39
|
# Adds a criterion to the +Criteria+ that specifies values that must
|
24
40
|
# be matched in order to return results. This is similar to a SQL "WHERE"
|
25
41
|
# clause. This is the actual selector that will be provided to MongoDB,
|
@@ -83,16 +99,13 @@ module Mongoid #:nodoc:
|
|
83
99
|
#
|
84
100
|
# @return [ Document, Criteria ] The matching document(s).
|
85
101
|
def find(*args)
|
86
|
-
|
87
|
-
:calling_document_find_with_nil_is_invalid, {}
|
88
|
-
) if args[0].nil?
|
89
|
-
type, criteria = Criteria.parse!(klass, embedded, *args)
|
90
|
-
criteria.merge(self) if criteria.is_a?(Criteria)
|
102
|
+
type, crit = search(*args)
|
91
103
|
case type
|
92
|
-
when :first then
|
93
|
-
when :last then
|
104
|
+
when :first then crit.one
|
105
|
+
when :last then crit.last
|
106
|
+
when :ids then execute_or_raise(args, crit)
|
94
107
|
else
|
95
|
-
|
108
|
+
crit
|
96
109
|
end
|
97
110
|
end
|
98
111
|
|
@@ -108,7 +121,7 @@ module Mongoid #:nodoc:
|
|
108
121
|
#
|
109
122
|
# @return [ Criteria ] A new criteria with the added selector.
|
110
123
|
def in(attributes = {})
|
111
|
-
update_selector(attributes, "$in")
|
124
|
+
update_selector(attributes, "$in", :&)
|
112
125
|
end
|
113
126
|
alias :any_in :in
|
114
127
|
|
@@ -147,13 +160,39 @@ module Mongoid #:nodoc:
|
|
147
160
|
|
148
161
|
selector.each_pair do |key, value|
|
149
162
|
if crit.selector.has_key?(key) && crit.selector[key].respond_to?(:merge!)
|
150
|
-
crit.selector[key]
|
163
|
+
crit.selector[key] =
|
164
|
+
crit.selector[key].merge!(value) do |key, old, new|
|
165
|
+
key == '$in' ? old & new : new
|
166
|
+
end
|
151
167
|
else
|
152
168
|
crit.selector[key] = value
|
153
169
|
end
|
154
170
|
end
|
155
171
|
end
|
156
172
|
end
|
173
|
+
|
174
|
+
private
|
175
|
+
|
176
|
+
# Execute the criteria or raise an error if no documents found.
|
177
|
+
#
|
178
|
+
# @example Execute or raise
|
179
|
+
# criteria.execute_or_raise(id, criteria)
|
180
|
+
#
|
181
|
+
# @param [ Object ] args The arguments passed.
|
182
|
+
# @param [ Criteria ] criteria The criteria to execute.
|
183
|
+
#
|
184
|
+
# @raise [ Errors::DocumentNotFound ] If nothing returned.
|
185
|
+
#
|
186
|
+
# @return [ Document, Array<Document> ] The document(s).
|
187
|
+
#
|
188
|
+
# @since 2.0.0
|
189
|
+
def execute_or_raise(args, criteria)
|
190
|
+
(args[0].is_a?(Array) ? criteria.entries : criteria.one).tap do |result|
|
191
|
+
if Mongoid.raise_not_found_error && !args.flatten.blank?
|
192
|
+
raise Errors::DocumentNotFound.new(klass, args) if result.blank?
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
157
196
|
end
|
158
197
|
end
|
159
198
|
end
|
@@ -2,26 +2,64 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Criterion #:nodoc:
|
4
4
|
|
5
|
+
# The selector is a hash-like object that has special behaviour for merging
|
6
|
+
# mongoid criteria selectors.
|
5
7
|
class Selector < Hash
|
6
|
-
attr_reader :klass
|
7
8
|
|
9
|
+
attr_reader :fields, :klass
|
10
|
+
|
11
|
+
# Create the new selector.
|
12
|
+
#
|
13
|
+
# @example Create the selector.
|
14
|
+
# Selector.new(Person)
|
15
|
+
#
|
16
|
+
# @param [ Class ] klass The class the selector is for.
|
17
|
+
#
|
18
|
+
# @since 1.0.0
|
8
19
|
def initialize(klass)
|
9
|
-
@klass = klass
|
20
|
+
@fields, @klass = klass.fields.except("_id", "_type"), klass
|
10
21
|
end
|
11
22
|
|
23
|
+
# Set the value for the supplied key, attempting to typecast the value.
|
24
|
+
#
|
25
|
+
# @example Set the value for the key.
|
26
|
+
# selector["$ne"] = { :name => "Zorg" }
|
27
|
+
#
|
28
|
+
# @param [ String, Symbol ] key The hash key.
|
29
|
+
# @param [ Object ] value The value to set.
|
30
|
+
#
|
31
|
+
# @since 2.0.0
|
12
32
|
def []=(key, value)
|
13
33
|
super(key, try_to_typecast(key, value))
|
14
34
|
end
|
15
35
|
|
36
|
+
# Merge the selector with another hash.
|
37
|
+
#
|
38
|
+
# @example Merge the objects.
|
39
|
+
# selector.merge!({ :key => "value" })
|
40
|
+
#
|
41
|
+
# @param [ Hash, Selector ] other The object to merge with.
|
42
|
+
#
|
43
|
+
# @return [ Selector ] The merged selector.
|
44
|
+
#
|
45
|
+
# @since 1.0.0
|
16
46
|
def merge!(other)
|
17
|
-
|
18
|
-
|
47
|
+
tap do |selector|
|
48
|
+
other.each_pair do |key, value|
|
49
|
+
selector[key] = value
|
50
|
+
end
|
19
51
|
end
|
20
|
-
self
|
21
52
|
end
|
22
|
-
alias update merge!
|
53
|
+
alias :update :merge!
|
23
54
|
|
24
55
|
if RUBY_VERSION < '1.9'
|
56
|
+
|
57
|
+
# Generate pretty inspection for old ruby versions.
|
58
|
+
#
|
59
|
+
# @example Inspect the selector.
|
60
|
+
# selector.inspect
|
61
|
+
#
|
62
|
+
# @return [ String ] The inspected selector.
|
25
63
|
def inspect
|
26
64
|
ret = self.keys.inject([]) do |ret, key|
|
27
65
|
ret << "#{key.inspect}=>#{self[key].inspect}"
|
@@ -32,14 +70,35 @@ module Mongoid #:nodoc:
|
|
32
70
|
|
33
71
|
private
|
34
72
|
|
73
|
+
# If the key is defined as a field, then attempt to typecast it.
|
74
|
+
#
|
75
|
+
# @example Try to cast.
|
76
|
+
# selector.try_to_typecast(:id, 1)
|
77
|
+
#
|
78
|
+
# @param [ String, Symbol ] key The field name.
|
79
|
+
# @param [ Object ] value The value.
|
80
|
+
#
|
81
|
+
# @return [ Object ] The typecasted value.
|
82
|
+
#
|
83
|
+
# @since 1.0.0
|
35
84
|
def try_to_typecast(key, value)
|
36
85
|
access = key.to_s
|
37
|
-
return value unless
|
38
|
-
|
39
|
-
field = klass.fields[access]
|
86
|
+
return value unless fields.has_key?(access)
|
87
|
+
field = fields[access]
|
40
88
|
typecast_value_for(field, value)
|
41
89
|
end
|
42
90
|
|
91
|
+
# Get the typecast value for the defined field.
|
92
|
+
#
|
93
|
+
# @example Get the typecast value.
|
94
|
+
# selector.typecast_value_for(:name, "Corbin")
|
95
|
+
#
|
96
|
+
# @param [ Field ] field The defined field.
|
97
|
+
# @param [ Object ] value The value to cast.
|
98
|
+
#
|
99
|
+
# @return [ Object ] The cast value.
|
100
|
+
#
|
101
|
+
# @since 1.0.0
|
43
102
|
def typecast_value_for(field, value)
|
44
103
|
return field.set(value) if field.type === value
|
45
104
|
case value
|
@@ -57,6 +116,18 @@ module Mongoid #:nodoc:
|
|
57
116
|
end
|
58
117
|
end
|
59
118
|
|
119
|
+
# Typecast the value for booleans and integers in hashes.
|
120
|
+
#
|
121
|
+
# @example Typecast the hash values.
|
122
|
+
# selector.typecast_hash_value(field, "$exists", "true")
|
123
|
+
#
|
124
|
+
# @param [ Field ] field The defined field.
|
125
|
+
# @param [ String ] key The modifier key.
|
126
|
+
# @param [ Object ] value The value to cast.
|
127
|
+
#
|
128
|
+
# @return [ Object ] The cast value.
|
129
|
+
#
|
130
|
+
# @since 1.0.0
|
60
131
|
def typecast_hash_value(field, key, value)
|
61
132
|
case key
|
62
133
|
when "$exists"
|
@@ -67,8 +138,6 @@ module Mongoid #:nodoc:
|
|
67
138
|
typecast_value_for(field, value)
|
68
139
|
end
|
69
140
|
end
|
70
|
-
|
71
141
|
end
|
72
|
-
|
73
142
|
end
|
74
143
|
end
|
data/lib/mongoid/cursor.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc
|
3
3
|
class Cursor
|
4
|
+
include Mongoid::Collections::Retry
|
4
5
|
include Enumerable
|
5
6
|
# Operations on the Mongo::Cursor object that will not get overriden by the
|
6
7
|
# Mongoid::Cursor are defined here.
|
@@ -31,7 +32,11 @@ module Mongoid #:nodoc
|
|
31
32
|
#
|
32
33
|
# <tt>cursor.close</tt>
|
33
34
|
OPERATIONS.each do |name|
|
34
|
-
define_method(name)
|
35
|
+
define_method(name) do |*args|
|
36
|
+
retry_on_connection_failure do
|
37
|
+
@cursor.send(name, *args)
|
38
|
+
end
|
39
|
+
end
|
35
40
|
end
|
36
41
|
|
37
42
|
# Iterate over each document in the cursor and yield to it.
|
@@ -3,26 +3,34 @@ module Mongoid #:nodoc:
|
|
3
3
|
|
4
4
|
# This module handles functionality for creating default scopes.
|
5
5
|
module DefaultScope
|
6
|
+
extend ActiveSupport::Concern
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
8
|
+
included do
|
9
|
+
class_attribute :default_scoping
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods #:nodoc:
|
13
|
+
|
14
|
+
# Creates a default_scope for the +Document+, similar to ActiveRecord's
|
15
|
+
# default_scope. +DefaultScopes+ are proxied +Criteria+ objects that are
|
16
|
+
# applied by default to all queries for the class.
|
17
|
+
#
|
18
|
+
# @example Create a default scope.
|
19
|
+
#
|
20
|
+
# class Person
|
21
|
+
# include Mongoid::Document
|
22
|
+
# field :active, :type => Boolean
|
23
|
+
# field :count, :type => Integer
|
24
|
+
#
|
25
|
+
# default_scope :where => { :active => true }
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# @param [ Hash ] conditions The conditions to create with.
|
29
|
+
#
|
30
|
+
# @since 2.0.0.rc.1
|
31
|
+
def default_scope(conditions = {}, &block)
|
32
|
+
self.default_scoping = Scope.new(conditions, &block).conditions.scoped
|
33
|
+
end
|
26
34
|
end
|
27
35
|
end
|
28
36
|
end
|