Class: Mongoid::Criteria
- Includes:
- Enumerable, Mongoid::Criterion::Builder, Mongoid::Criterion::Creational, Mongoid::Criterion::Exclusion, Mongoid::Criterion::Inclusion, Mongoid::Criterion::Inspection, Mongoid::Criterion::Optional
- Defined in:
- lib/mongoid/criteria.rb
Overview
The Criteria
class is the core object needed in Mongoid to retrieve objects from the database. It is a DSL that essentially sets up the selector and options arguments that get passed on to a Mongo::Collection
in the Ruby driver. Each method on the Criteria
returns self to they can be chained in order to create a readable criterion to be executed against the database.
Example setup:
criteria = Criteria.new
criteria.only(:field).where(:field => "value").skip(20).limit(20)
criteria.execute
Instance Attribute Summary collapse
-
#collection ⇒ Object
Returns the value of attribute collection.
-
#documents ⇒ Object
Returns the value of attribute documents.
-
#embedded ⇒ Object
Returns the value of attribute embedded.
-
#field_list ⇒ Object
Returns the value of attribute field_list.
-
#ids ⇒ Object
Returns the value of attribute ids.
-
#klass ⇒ Object
Returns the value of attribute klass.
-
#options ⇒ Object
Returns the value of attribute options.
-
#selector ⇒ Object
Returns the value of attribute selector.
Instance Method Summary collapse
-
#+(other) ⇒ Object
Concatinate the criteria with another enumerable.
-
#-(other) ⇒ Object
Returns the difference between the criteria and another enumerable.
-
#==(other) ⇒ Object
Returns true if the supplied
Enumerable
orCriteria
is equal to the results of thisCriteria
or the criteria itself. -
#as_json(options = nil) ⇒ String
Needed to properly get a criteria back as json.
-
#context ⇒ Object
Return or create the context in which this criteria should be executed.
-
#each(&block) ⇒ Object
Iterate over each
Document
in the results. -
#exists? ⇒ Boolean
Return true if the criteria has some Document or not.
-
#freeze ⇒ Criteria
When freezing a criteria we need to initialize the context first otherwise the setting of the context on attempted iteration will raise a runtime error.
-
#fuse(criteria_conditions = {}) ⇒ Object
Merges the supplied argument hash into a single criteria.
-
#initialize(klass, embedded = false) ⇒ Criteria
constructor
Create the new
Criteria
object. -
#merge(other) ⇒ Object
Merges another object into this
Criteria
. -
#method_missing(name, *args, &block) ⇒ Object
Used for chaining
Criteria
scopes together in the for of class methods on theDocument
the criteria is for. -
#raise_invalid ⇒ Object
Convenience method of raising an invalid options error.
-
#respond_to?(name, include_private = false) ⇒ Boolean
Returns true if criteria responds to the given method.
-
#scoped ⇒ Object
Returns the selector and options as a
Hash
that would be passed to a scope for use with named scopes. -
#search(*args) ⇒ Array<Symbol, Criteria>
Search for documents based on a variety of args.
Methods included from Mongoid::Criterion::Optional
#ascending, #cache, #cached?, #descending, #extras, #for_ids, #limit, #offset, #order_by, #skip, #type
Methods included from Mongoid::Criterion::Inspection
Methods included from Mongoid::Criterion::Inclusion
#all, #also_in, #and, #any_of, #find, #in, #near, #where
Methods included from Mongoid::Criterion::Exclusion
#excludes, #fields, #not_in, #only, #without
Methods included from Mongoid::Criterion::Creational
Methods included from Mongoid::Criterion::Builder
Constructor Details
#initialize(klass, embedded = false) ⇒ Criteria
Create the new Criteria
object. This will initialize the selector and options hashes, as well as the type of criteria.
Options:
type: One of :all, :first:, or :last klass: The class to execute on.
166 167 168 169 |
# File 'lib/mongoid/criteria.rb', line 166 def initialize(klass, = false) @selector = Criterion::Selector.new(klass) @options, @klass, @documents, @embedded = {}, klass, [], end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
Used for chaining Criteria
scopes together in the for of class methods on the Document
the criteria is for.
Options:
name: The name of the class method on the Document
to chain. args: The arguments passed to the method. block: Optional block to pass
Returns: Criteria
206 207 208 209 210 211 212 213 214 |
# File 'lib/mongoid/criteria.rb', line 206 def method_missing(name, *args, &block) if @klass.respond_to?(name) @klass.send(:with_scope, self) do @klass.send(name, *args, &block) end else return entries.send(name, *args) end end |
Instance Attribute Details
#collection ⇒ Object
Returns the value of attribute collection.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def collection @collection end |
#documents ⇒ Object
Returns the value of attribute documents.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def documents @documents end |
#embedded ⇒ Object
Returns the value of attribute embedded.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def @embedded end |
#field_list ⇒ Object
Returns the value of attribute field_list.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def field_list @field_list end |
#ids ⇒ Object
Returns the value of attribute ids.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def ids @ids end |
#klass ⇒ Object
Returns the value of attribute klass.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def klass @klass end |
#options ⇒ Object
Returns the value of attribute options.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def @options end |
#selector ⇒ Object
Returns the value of attribute selector.
37 38 39 |
# File 'lib/mongoid/criteria.rb', line 37 def selector @selector end |
Instance Method Details
#+(other) ⇒ Object
Concatinate the criteria with another enumerable. If the other is a Criteria
then it needs to get the collection from it.
72 73 74 |
# File 'lib/mongoid/criteria.rb', line 72 def +(other) entries + comparable(other) end |
#-(other) ⇒ Object
Returns the difference between the criteria and another enumerable. If the other is a Criteria
then it needs to get the collection from it.
78 79 80 |
# File 'lib/mongoid/criteria.rb', line 78 def -(other) entries - comparable(other) end |
#==(other) ⇒ Object
Returns true if the supplied Enumerable
or Criteria
is equal to the results of this Criteria
or the criteria itself.
This will force a database load when called if an enumerable is passed.
Options:
other: The other Enumerable
or Criteria
to compare to.
90 91 92 93 94 95 96 97 98 99 |
# File 'lib/mongoid/criteria.rb', line 90 def ==(other) case other when Criteria self.selector == other.selector && self. == other. when Enumerable return (execute.entries == other) else return false end end |
#as_json(options = nil) ⇒ String
Needed to properly get a criteria back as json
249 250 251 |
# File 'lib/mongoid/criteria.rb', line 249 def as_json( = nil) entries.as_json() end |
#context ⇒ Object
Return or create the context in which this criteria should be executed.
This will return an Enumerable context if the class is embedded, otherwise it will return a Mongo context for root classes.
105 106 107 |
# File 'lib/mongoid/criteria.rb', line 105 def context @context ||= Contexts.context_for(self, ) end |
#each(&block) ⇒ Object
Iterate over each Document
in the results. This can take an optional block to pass to each argument in the results.
Example:
criteria.each { |doc| p doc }
115 116 117 |
# File 'lib/mongoid/criteria.rb', line 115 def each(&block) tap { context.iterate(&block) } end |
#exists? ⇒ Boolean
Return true if the criteria has some Document or not
Example:
criteria.exists?
124 125 126 |
# File 'lib/mongoid/criteria.rb', line 124 def exists? context.count > 0 end |
#freeze ⇒ Criteria
When freezing a criteria we need to initialize the context first otherwise the setting of the context on attempted iteration will raise a runtime error.
138 139 140 |
# File 'lib/mongoid/criteria.rb', line 138 def freeze context and super end |
#fuse(criteria_conditions = {}) ⇒ Object
Merges the supplied argument hash into a single criteria
Options:
criteria_conditions: Hash of criteria keys, and parameter values
Example:
criteria.fuse(:where => { :field => "value"}, :limit => 20)
Returns self
153 154 155 156 157 |
# File 'lib/mongoid/criteria.rb', line 153 def fuse(criteria_conditions = {}) criteria_conditions.inject(self) do |criteria, (key, value)| criteria.send(key, value) end end |
#merge(other) ⇒ Object
Merges another object into this Criteria
. The other object may be a Criteria
or a Hash
. This is used to combine multiple scopes together, where a chained scope situation may be desired.
Options:
other: The Criteria
or Hash
to merge with.
Example:
criteria.merge({ :conditions => { :title => "Sir" } })
182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/mongoid/criteria.rb', line 182 def merge(other) clone.tap do |crit| if other.is_a?(Criteria) crit.selector.update(other.selector) crit..update(other.) crit.documents = other.documents else duped = other.dup crit.selector.update(duped.delete(:conditions) || {}) crit..update(duped) end end end |
#raise_invalid ⇒ Object
Convenience method of raising an invalid options error.
298 299 300 |
# File 'lib/mongoid/criteria.rb', line 298 def raise_invalid raise Errors::InvalidOptions.new(:calling_document_find_with_nil_is_invalid, {}) end |
#respond_to?(name, include_private = false) ⇒ Boolean
Returns true if criteria responds to the given method.
Options:
name: The name of the class method on the Document
. include_private: The arguments passed to the method.
Example:
criteria.respond_to?(:batch_update)
226 227 228 229 |
# File 'lib/mongoid/criteria.rb', line 226 def respond_to?(name, include_private = false) # don't include klass private methods because method_missing won't call them super || @klass.respond_to?(name) || entries.respond_to?(name, include_private) end |
#scoped ⇒ Object
Returns the selector and options as a Hash
that would be passed to a scope for use with named scopes.
233 234 235 236 237 238 |
# File 'lib/mongoid/criteria.rb', line 233 def scoped = @options.dup sorting = .delete(:sort) [:order_by] = sorting if sorting { :where => @selector }.merge() end |
#search(*args) ⇒ Array<Symbol, Criteria>
Search for documents based on a variety of args.
277 278 279 280 281 282 283 284 285 286 287 288 |
# File 'lib/mongoid/criteria.rb', line 277 def search(*args) raise_invalid if args[0].nil? type = args[0] params = args[1] || {} return [ :ids, for_ids(type) ] unless type.is_a?(Symbol) conditions = params.delete(:conditions) || {} if conditions.include?(:id) conditions[:_id] = conditions[:id] conditions.delete(:id) end return [ type, where(conditions).extras(params) ] end |