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
@@ -1,35 +1,44 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Collections #:nodoc:
|
4
|
+
|
5
|
+
# This class wraps the MongoDB slaves databases.
|
4
6
|
class Slaves
|
7
|
+
include Mongoid::Collections::Retry
|
5
8
|
|
6
9
|
attr_reader :iterator
|
7
10
|
|
8
11
|
# All read operations should delegate to the slave connections.
|
9
12
|
# These operations mimic the methods on a Mongo:Collection.
|
10
13
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# <tt>collection.save({ :name => "Al" })</tt>
|
14
|
+
# @example Proxy the driver save.
|
15
|
+
# collection.save({ :name => "Al" })
|
14
16
|
Operations::READ.each do |name|
|
15
|
-
define_method(name)
|
17
|
+
define_method(name) do |*args|
|
18
|
+
retry_on_connection_failure do
|
19
|
+
collection.send(name, *args)
|
20
|
+
end
|
21
|
+
end
|
16
22
|
end
|
17
23
|
|
18
24
|
# Is the collection of slaves empty or not?
|
19
25
|
#
|
20
|
-
#
|
26
|
+
# @example Is the collection empty?
|
27
|
+
# slaves.empty?
|
21
28
|
#
|
22
|
-
#
|
29
|
+
# @return [ true, false ] If the iterator is set or not.
|
23
30
|
def empty?
|
24
|
-
|
31
|
+
iterator.nil?
|
25
32
|
end
|
26
33
|
|
27
34
|
# Create the new database reader. Will create a collection from the
|
28
35
|
# slave databases and cycle through them on each read.
|
29
36
|
#
|
30
|
-
#
|
37
|
+
# @example Create the slaves.
|
38
|
+
# Reader.new(slaves, "mongoid_people")
|
31
39
|
#
|
32
|
-
# <
|
40
|
+
# @param [ Array<Mongo::DB> ] slaves The slave databases.
|
41
|
+
# @param [ String ] name The database name.
|
33
42
|
def initialize(slaves, name)
|
34
43
|
unless slaves.blank?
|
35
44
|
@iterator = CyclicIterator.new(slaves.collect { |db| db.collection(name) })
|
@@ -37,8 +46,15 @@ module Mongoid #:nodoc:
|
|
37
46
|
end
|
38
47
|
|
39
48
|
protected
|
49
|
+
|
50
|
+
# Get the next database in the round-robin.
|
51
|
+
#
|
52
|
+
# @example Get the next database.
|
53
|
+
# slaves.collection
|
54
|
+
#
|
55
|
+
# @return [ Mongo::DB ] The next slave database to read from.
|
40
56
|
def collection
|
41
|
-
|
57
|
+
iterator.next
|
42
58
|
end
|
43
59
|
end
|
44
60
|
end
|
data/lib/mongoid/components.rb
CHANGED
@@ -7,20 +7,20 @@ module Mongoid #:nodoc
|
|
7
7
|
# module, to keep the document class from getting too cluttered.
|
8
8
|
included do
|
9
9
|
extend ActiveModel::Translation
|
10
|
-
extend Mongoid::DefaultScope
|
11
10
|
extend Mongoid::Finders
|
12
|
-
extend Mongoid::NamedScope
|
13
11
|
end
|
14
12
|
|
15
13
|
include ActiveModel::Conversion
|
16
14
|
include ActiveModel::MassAssignmentSecurity
|
17
15
|
include ActiveModel::Naming
|
16
|
+
include ActiveModel::Observing
|
18
17
|
include ActiveModel::Serializers::JSON
|
19
18
|
include ActiveModel::Serializers::Xml
|
20
19
|
include Mongoid::Atomicity
|
21
20
|
include Mongoid::Attributes
|
22
21
|
include Mongoid::Collections
|
23
22
|
include Mongoid::Copyable
|
23
|
+
include Mongoid::DefaultScope
|
24
24
|
include Mongoid::Dirty
|
25
25
|
include Mongoid::Extras
|
26
26
|
include Mongoid::Fields
|
@@ -30,14 +30,14 @@ module Mongoid #:nodoc
|
|
30
30
|
include Mongoid::JSON
|
31
31
|
include Mongoid::Keys
|
32
32
|
include Mongoid::Matchers
|
33
|
-
include Mongoid::
|
34
|
-
include Mongoid::Modifiers
|
33
|
+
include Mongoid::NamedScope
|
35
34
|
include Mongoid::NestedAttributes
|
36
35
|
include Mongoid::Paths
|
37
36
|
include Mongoid::Persistence
|
38
37
|
include Mongoid::Relations
|
39
38
|
include Mongoid::Safety
|
40
39
|
include Mongoid::Serialization
|
40
|
+
include Mongoid::Sharding
|
41
41
|
include Mongoid::State
|
42
42
|
include Mongoid::Validations
|
43
43
|
include Mongoid::Callbacks
|
data/lib/mongoid/config.rb
CHANGED
@@ -11,6 +11,7 @@ module Mongoid #:nodoc
|
|
11
11
|
# @todo Durran: This module needs an overhaul, remove singleton, etc.
|
12
12
|
module Config
|
13
13
|
extend self
|
14
|
+
include ActiveModel::Observing
|
14
15
|
|
15
16
|
attr_accessor :master, :slaves, :settings
|
16
17
|
@settings = {}
|
@@ -35,15 +36,17 @@ module Mongoid #:nodoc
|
|
35
36
|
end
|
36
37
|
|
37
38
|
option :allow_dynamic_fields, :default => true
|
39
|
+
option :autocreate_indexes, :default => false
|
40
|
+
option :binding_defaults, :default => { :binding => false, :continue => true }
|
41
|
+
option :embedded_object_id, :default => true
|
38
42
|
option :include_root_in_json, :default => false
|
39
43
|
option :parameterize_keys, :default => true
|
40
44
|
option :persist_in_safe_mode, :default => false
|
45
|
+
option :preload_models, :default => true
|
41
46
|
option :raise_not_found_error, :default => true
|
42
|
-
option :reconnect_time, :default => 3
|
43
|
-
option :autocreate_indexes, :default => false
|
44
47
|
option :skip_version_check, :default => false
|
45
48
|
option :time_zone, :default => nil
|
46
|
-
option :
|
49
|
+
option :max_retries_on_connection_failure, :default => 0
|
47
50
|
|
48
51
|
# Adds a new I18n locale file to the load path.
|
49
52
|
#
|
data/lib/mongoid/contexts.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require 'mongoid/contexts/enumerable/sort'
|
4
3
|
|
5
4
|
module Mongoid #:nodoc:
|
6
5
|
module Contexts #:nodoc:
|
7
6
|
class Enumerable
|
8
|
-
include
|
9
|
-
|
7
|
+
include Paging
|
8
|
+
include Relations::Embedded::Atomic
|
9
|
+
|
10
|
+
attr_accessor :collection, :criteria
|
10
11
|
|
11
12
|
delegate :blank?, :empty?, :first, :last, :to => :execute
|
12
|
-
delegate :klass, :documents, :options, :selector, :to => :criteria
|
13
|
+
delegate :klass, :documents, :options, :field_list, :selector, :to => :criteria
|
13
14
|
|
14
15
|
# Return aggregation counts of the grouped documents. This will count by
|
15
16
|
# the first field provided in the fields array.
|
@@ -51,7 +52,10 @@ module Mongoid #:nodoc:
|
|
51
52
|
#
|
52
53
|
# @since 2.0.0.rc.1
|
53
54
|
def delete_all
|
54
|
-
|
55
|
+
atomically(:$pull) do
|
56
|
+
set_collection
|
57
|
+
count.tap { filter.each(&:delete) }
|
58
|
+
end
|
55
59
|
end
|
56
60
|
alias :delete :delete_all
|
57
61
|
|
@@ -64,7 +68,10 @@ module Mongoid #:nodoc:
|
|
64
68
|
#
|
65
69
|
# @since 2.0.0.rc.1
|
66
70
|
def destroy_all
|
67
|
-
|
71
|
+
atomically(:$pull) do
|
72
|
+
set_collection
|
73
|
+
count.tap { filter.each(&:destroy) }
|
74
|
+
end
|
68
75
|
end
|
69
76
|
alias :destroy :destroy_all
|
70
77
|
|
@@ -94,7 +101,7 @@ module Mongoid #:nodoc:
|
|
94
101
|
#
|
95
102
|
# A +Hash+ with field values as keys, arrays of documents as values.
|
96
103
|
def group
|
97
|
-
field =
|
104
|
+
field = field_list.first
|
98
105
|
execute.group_by { |doc| doc.send(field) }
|
99
106
|
end
|
100
107
|
|
@@ -212,6 +219,11 @@ module Mongoid #:nodoc:
|
|
212
219
|
documents
|
213
220
|
end
|
214
221
|
|
222
|
+
def set_collection
|
223
|
+
root = documents.first._root
|
224
|
+
@collection = root.collection if root && !root.embedded?
|
225
|
+
end
|
226
|
+
|
215
227
|
# Sorts the result set if sort options have been set.
|
216
228
|
def sort(documents)
|
217
229
|
return documents if options[:sort].blank?
|
@@ -2,10 +2,10 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Contexts #:nodoc:
|
4
4
|
class Mongo
|
5
|
-
include
|
5
|
+
include Paging
|
6
6
|
attr_accessor :criteria
|
7
7
|
|
8
|
-
delegate :klass, :options, :selector, :to => :criteria
|
8
|
+
delegate :klass, :options, :field_list, :selector, :to => :criteria
|
9
9
|
|
10
10
|
# Aggregate the context. This will take the internally built selector and options
|
11
11
|
# and pass them on to the Ruby driver's +group()+ method on the collection. The
|
@@ -21,7 +21,7 @@ module Mongoid #:nodoc:
|
|
21
21
|
# A +Hash+ with field values as keys, counts as values
|
22
22
|
def aggregate
|
23
23
|
klass.collection.group(
|
24
|
-
:key =>
|
24
|
+
:key => field_list,
|
25
25
|
:cond => selector,
|
26
26
|
:initial => { :count => 0 },
|
27
27
|
:reduce => Javascript.aggregate
|
@@ -146,7 +146,7 @@ module Mongoid #:nodoc:
|
|
146
146
|
# A +Hash+ with field values as keys, arrays of documents as values.
|
147
147
|
def group
|
148
148
|
klass.collection.group(
|
149
|
-
:key =>
|
149
|
+
:key => field_list,
|
150
150
|
:cond => selector,
|
151
151
|
:initial => { :group => [] },
|
152
152
|
:reduce => Javascript.group
|
@@ -304,7 +304,11 @@ module Mongoid #:nodoc:
|
|
304
304
|
def process_options
|
305
305
|
fields = options[:fields]
|
306
306
|
if fields && fields.size > 0 && !fields.include?(:_type)
|
307
|
-
fields
|
307
|
+
if fields.kind_of?(Hash)
|
308
|
+
fields[:_type] = 1 if fields.first.last != 0 # Not excluding
|
309
|
+
else
|
310
|
+
fields << :type
|
311
|
+
end
|
308
312
|
options[:fields] = fields
|
309
313
|
end
|
310
314
|
options.dup
|
data/lib/mongoid/copyable.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid #:nodoc:
|
3
|
+
|
4
|
+
# This module contains the behaviour of Mongoid's clone/dup of documents.
|
3
5
|
module Copyable
|
4
6
|
extend ActiveSupport::Concern
|
5
7
|
|
@@ -17,19 +19,19 @@ module Mongoid #:nodoc:
|
|
17
19
|
# the exception of the document's id and versions, and will reset all the
|
18
20
|
# instance variables.
|
19
21
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# <tt>document.clone</tt>
|
23
|
-
# <tt>document.dup</tt>
|
22
|
+
# This clone also includes embedded documents.
|
24
23
|
#
|
25
|
-
#
|
24
|
+
# @example Clone the document.
|
25
|
+
# document.clone
|
26
26
|
#
|
27
|
-
#
|
27
|
+
# @example Dup the document.
|
28
|
+
# document.dup
|
28
29
|
#
|
29
|
-
#
|
30
|
+
# @param [ Document ] other The document getting cloned.
|
30
31
|
#
|
31
|
-
#
|
32
|
+
# @return [ Document ] The new document.
|
32
33
|
def initialize_copy(other)
|
34
|
+
@attributes = other.as_document
|
33
35
|
instance_variables.each { |name| remove_instance_variable(name) }
|
34
36
|
COPYABLES.each do |name|
|
35
37
|
value = other.instance_variable_get(name)
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "mongoid/criterion/builder"
|
2
3
|
require "mongoid/criterion/creational"
|
3
4
|
require "mongoid/criterion/complex"
|
4
5
|
require "mongoid/criterion/exclusion"
|
@@ -25,13 +26,22 @@ module Mongoid #:nodoc:
|
|
25
26
|
# <tt>criteria.execute</tt>
|
26
27
|
class Criteria
|
27
28
|
include Enumerable
|
29
|
+
include Criterion::Builder
|
28
30
|
include Criterion::Creational
|
29
31
|
include Criterion::Exclusion
|
30
32
|
include Criterion::Inclusion
|
31
33
|
include Criterion::Inspection
|
32
34
|
include Criterion::Optional
|
33
35
|
|
34
|
-
attr_accessor
|
36
|
+
attr_accessor \
|
37
|
+
:collection,
|
38
|
+
:documents,
|
39
|
+
:embedded,
|
40
|
+
:ids,
|
41
|
+
:klass,
|
42
|
+
:options,
|
43
|
+
:selector,
|
44
|
+
:field_list
|
35
45
|
|
36
46
|
delegate \
|
37
47
|
:aggregate,
|
@@ -47,7 +57,6 @@ module Mongoid #:nodoc:
|
|
47
57
|
:execute,
|
48
58
|
:first,
|
49
59
|
:group,
|
50
|
-
:id_criteria,
|
51
60
|
:last,
|
52
61
|
:max,
|
53
62
|
:min,
|
@@ -118,6 +127,20 @@ module Mongoid #:nodoc:
|
|
118
127
|
context.count > 0
|
119
128
|
end
|
120
129
|
|
130
|
+
# When freezing a criteria we need to initialize the context first
|
131
|
+
# otherwise the setting of the context on attempted iteration will raise a
|
132
|
+
# runtime error.
|
133
|
+
#
|
134
|
+
# @example Freeze the criteria.
|
135
|
+
# criteria.freeze
|
136
|
+
#
|
137
|
+
# @return [ Criteria ] The frozen criteria.
|
138
|
+
#
|
139
|
+
# @since 2.0.0
|
140
|
+
def freeze
|
141
|
+
context and super
|
142
|
+
end
|
143
|
+
|
121
144
|
# Merges the supplied argument hash into a single criteria
|
122
145
|
#
|
123
146
|
# Options:
|
@@ -160,9 +183,15 @@ module Mongoid #:nodoc:
|
|
160
183
|
# <tt>criteria.merge({ :conditions => { :title => "Sir" } })</tt>
|
161
184
|
def merge(other)
|
162
185
|
clone.tap do |crit|
|
163
|
-
|
164
|
-
|
165
|
-
|
186
|
+
if other.is_a?(Criteria)
|
187
|
+
crit.selector.update(other.selector)
|
188
|
+
crit.options.update(other.options)
|
189
|
+
crit.documents = other.documents
|
190
|
+
else
|
191
|
+
duped = other.dup
|
192
|
+
crit.selector.update(duped.delete(:conditions) || {})
|
193
|
+
crit.options.update(duped)
|
194
|
+
end
|
166
195
|
end
|
167
196
|
end
|
168
197
|
|
@@ -207,62 +236,53 @@ module Mongoid #:nodoc:
|
|
207
236
|
entries.as_json(options)
|
208
237
|
end
|
209
238
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
239
|
+
# Search for documents based on a variety of args.
|
240
|
+
#
|
241
|
+
# @example Find by an id.
|
242
|
+
# criteria.search(BSON::ObjectId.new)
|
243
|
+
#
|
244
|
+
# @example Find by multiple ids.
|
245
|
+
# criteria.search([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
246
|
+
#
|
247
|
+
# @example Conditionally find all matching documents.
|
248
|
+
# criteria.search(:all, :conditions => { :title => "Sir" })
|
249
|
+
#
|
250
|
+
# @example Conditionally find the first document.
|
251
|
+
# criteria.search(:first, :conditions => { :title => "Sir" })
|
252
|
+
#
|
253
|
+
# @example Conditionally find the last document.
|
254
|
+
# criteria.search(:last, :conditions => { :title => "Sir" })
|
255
|
+
#
|
256
|
+
# @param [ Symbol, BSON::ObjectId, Array<BSON::ObjectId> ] arg The
|
257
|
+
# argument to search with.
|
258
|
+
# @param [ Hash ] options The options to search with.
|
259
|
+
#
|
260
|
+
# @return [ Array<Symbol, Criteria> ] The type and criteria.
|
261
|
+
#
|
262
|
+
# @since 2.0.0
|
263
|
+
def search(*args)
|
264
|
+
raise_invalid if args[0].nil?
|
265
|
+
type = args[0]
|
266
|
+
params = args[1] || {}
|
267
|
+
return [ :ids, for_ids(type) ] unless type.is_a?(Symbol)
|
268
|
+
conditions = params.delete(:conditions) || {}
|
269
|
+
if conditions.include?(:id)
|
270
|
+
conditions[:_id] = conditions[:id]
|
271
|
+
conditions.delete(:id)
|
234
272
|
end
|
273
|
+
return [ type, where(conditions).extras(params) ]
|
274
|
+
end
|
235
275
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
# args: either a +String+ or a +Symbol+, +Hash combination.
|
247
|
-
#
|
248
|
-
# Example:
|
249
|
-
#
|
250
|
-
# <tt>Criteria.translate(Person, "4ab2bc4b8ad548971900005c")</tt>
|
251
|
-
# <tt>Criteria.translate(Person, :conditions => { :field => "value"}, :limit => 20)</tt>
|
252
|
-
def translate(*args)
|
253
|
-
klass = args[0]
|
254
|
-
embedded = args[1]
|
255
|
-
params = args[2] || {}
|
256
|
-
unless params.is_a?(Hash)
|
257
|
-
return klass.criteria(embedded).id_criteria(params)
|
258
|
-
end
|
259
|
-
conditions = params.delete(:conditions) || {}
|
260
|
-
if conditions.include?(:id)
|
261
|
-
conditions[:_id] = conditions[:id]
|
262
|
-
conditions.delete(:id)
|
263
|
-
end
|
264
|
-
return klass.criteria(embedded).where(conditions).extras(params)
|
265
|
-
end
|
276
|
+
# Convenience method of raising an invalid options error.
|
277
|
+
#
|
278
|
+
# @example Raise the error.
|
279
|
+
# criteria.raise_invalid
|
280
|
+
#
|
281
|
+
# @raise [ Errors::InvalidOptions ] The error.
|
282
|
+
#
|
283
|
+
# @since 2.0.0
|
284
|
+
def raise_invalid
|
285
|
+
raise Errors::InvalidOptions.new(:calling_document_find_with_nil_is_invalid, {})
|
266
286
|
end
|
267
287
|
|
268
288
|
protected
|
@@ -318,7 +338,9 @@ module Mongoid #:nodoc:
|
|
318
338
|
# Example:
|
319
339
|
#
|
320
340
|
# <tt>criteria.update_selector({ :field => "value" }, "$in")</tt>
|
321
|
-
|
341
|
+
#
|
342
|
+
# @param [ Symbol ] combine The operator to use when combining sets.
|
343
|
+
def update_selector(attributes, operator, combine = :+)
|
322
344
|
clone.tap do |crit|
|
323
345
|
converted = BSON::ObjectId.convert(klass, attributes || {})
|
324
346
|
converted.each do |key, value|
|
@@ -326,7 +348,7 @@ module Mongoid #:nodoc:
|
|
326
348
|
crit.selector[key] = { operator => value }
|
327
349
|
else
|
328
350
|
if crit.selector[key].has_key?(operator)
|
329
|
-
new_value = crit.selector[key].values.first
|
351
|
+
new_value = crit.selector[key].values.first.send(combine, value)
|
330
352
|
crit.selector[key] = { operator => new_value }
|
331
353
|
else
|
332
354
|
crit.selector[key][operator] = value
|