Module: Mongoid::Scopable::ClassMethods
| Relationships & Source Files | |
| Extension / Inclusion / Inheritance Descendants | |
| Extended In: | |
| Defined in: | lib/mongoid/scopable.rb | 
Instance Attribute Summary
- 
    
      #default_scopable?  ⇒ true | false 
    
    readonly
    Is the class able to have the default scope applied? 
Instance Method Summary
- 
    
      #criteria  
    
    Alias for #with_default_scope. 
- 
    
      #default_scope(value = nil)  ⇒ Proc 
    
    Add a default scope to the model. 
- 
    
      #queryable  ⇒ Criteria 
    
    Internal use only
    Internal use only
    Get a queryable, either the last one on the scope stack or a fresh one. 
- 
    
      #scope(name, value, &block)  
    
    Create a scope that can be accessed from the class level or chained to criteria by the provided name. 
- 
    
      #scoped(options = nil)  ⇒ Criteria 
    
    Get a criteria for the document with normal scoping. 
- 
    
      #scopes  ⇒ Hash 
    
    Returns a hash of all the scopes defined for this class, including scopes defined on ancestor classes. 
- 
    
      #unscoped  ⇒ Criteria | Object 
    
    Get the criteria without any scoping applied. 
- 
    
      #with_default_scope  ⇒ Criteria 
      (also: #criteria)
    
    Get a criteria with the default scope applied, if possible. 
- 
    
      #with_scope(criteria)  ⇒ Criteria 
    
    Pushes the provided criteria onto the scope stack, and removes it after the provided block is yielded. 
- 
    
      #without_default_scope  ⇒ Object 
    
    Execute the block without applying the default scope. 
- 
    
      #check_scope_name(name)  
    
    private
    Internal use only
    Internal use only
    Warns or raises exception if overriding another scope or method. 
- 
    
      #check_scope_validity(value)  
    
    private
    Internal use only
    Internal use only
    Checks if the intended scope is a valid object, either a criteria or proc with a criteria. 
- 
    
      #define_scope_method(name)  ⇒ Method 
    
    private
    Internal use only
    Internal use only
    Defines the actual class method that will execute the scope when called. 
- 
    
      #process_default_scope(value)  
    
    private
    Internal use only
    Internal use only
    Process the default scope value. 
Instance Attribute Details
    #default_scopable?  ⇒ true | false  (readonly)
  
Is the class able to have the default scope applied?
# File 'lib/mongoid/scopable.rb', line 95
def default_scopable? default_scoping? && !Threaded.without_default_scope?(self) end
Instance Method Details
#check_scope_name(name) (private)
Warns or raises exception if overriding another scope or method.
# File 'lib/mongoid/scopable.rb', line 247
def check_scope_name(name) if _declared_scopes[name] || respond_to?(name, true) if Mongoid.scope_overwrite_exception raise Errors::ScopeOverwrite.new(self.name, name) else Mongoid.logger.warn( "Creating scope :#{name} which conflicts with #{self.name}.#{name}. " + "Calls to `Mongoid::Criteria##{name}` will delegate to " + "`Mongoid::Criteria##{name}` for criteria with klass #{self.name} " + "and will ignore the declared scope." ) end end end
#check_scope_validity(value) (private)
Checks if the intended scope is a valid object, either a criteria or proc with a criteria.
# File 'lib/mongoid/scopable.rb', line 273
def check_scope_validity(value) unless value.respond_to?(:call) raise Errors::InvalidScope.new(self, value) end end
#criteria
Alias for #with_default_scope.
# File 'lib/mongoid/scopable.rb', line 198
alias :criteria :with_default_scope
    #default_scope(value = nil)  ⇒ Proc 
  
Add a default scope to the model. This scope will be applied to all criteria unless #unscoped is specified.
# File 'lib/mongoid/scopable.rb', line 83
def default_scope(value = nil) value = Proc.new { yield } if block_given? check_scope_validity(value) self.default_scoping = process_default_scope(value) end
    #define_scope_method(name)  ⇒ Method  (private)
  
  Defines the actual class method that will execute the scope when called.
# File 'lib/mongoid/scopable.rb', line 290
def define_scope_method(name) singleton_class.class_eval do define_method(name) do |*args, **kwargs| scoping = _declared_scopes[name] scope = instance_exec(*args, **kwargs, &scoping[:scope]) extension = scoping[:extension] to_merge = scope || queryable criteria = if Mongoid.allow_scopes_to_unset_default_scope to_merge else to_merge.empty_and_chainable? ? to_merge : with_default_scope.merge(to_merge) end criteria.extend(extension) criteria end end end
#process_default_scope(value) (private)
Process the default scope value. If one already exists, we merge the new one into the old one.
# File 'lib/mongoid/scopable.rb', line 319
def process_default_scope(value) if existing = default_scoping ->{ existing.call.merge(value.to_proc.call) } else value.to_proc end end
#queryable ⇒ Criteria
Get a queryable, either the last one on the scope stack or a fresh one.
# File 'lib/mongoid/scopable.rb', line 107
def queryable crit = Threaded.current_scope(self) || Criteria.new(self) crit. = true if (crit.klass. && !crit.klass.cyclic?) crit end
#scope(name, value, &block)
Create a scope that can be accessed from the class level or chained to criteria by the provided name.
# File 'lib/mongoid/scopable.rb', line 132
def scope(name, value, &block) normalized = name.to_sym check_scope_validity(value) check_scope_name(normalized) _declared_scopes[normalized] = { scope: value, extension: Module.new(&block) } define_scope_method(normalized) end
#scoped(options = nil) ⇒ Criteria
This will force the default scope to be applied.
Get a criteria for the document with normal scoping.
# File 'lib/mongoid/scopable.rb', line 158
def scoped( = nil) queryable.scoped() end
#scopes ⇒ Hash
Returns a hash of all the scopes defined for this class, including scopes defined on ancestor classes.
# File 'lib/mongoid/scopable.rb', line 51
def scopes defined_scopes = {} ancestors.reverse.each do |klass| if klass.respond_to?(:_declared_scopes) defined_scopes.merge!(klass._declared_scopes) end end defined_scopes.freeze end
    #unscoped  ⇒ Criteria | Object 
  
This will force the default scope, as well as any scope applied using “.with_scope“, to be removed.
Get the criteria without any scoping applied.
# File 'lib/mongoid/scopable.rb', line 177
def unscoped if block_given? without_default_scope do with_scope(nil) do yield(self) end end else queryable.unscoped end end
#with_default_scope ⇒ Criteria Also known as: #criteria
Get a criteria with the default scope applied, if possible.
# File 'lib/mongoid/scopable.rb', line 195
def with_default_scope queryable.with_default_scope end
#with_scope(criteria) ⇒ Criteria
Pushes the provided criteria onto the scope stack, and removes it after the provided block is yielded.
# File 'lib/mongoid/scopable.rb', line 209
def with_scope(criteria) previous = Threaded.current_scope(self) Threaded.set_current_scope(criteria, self) begin yield criteria ensure Threaded.set_current_scope(previous, self) end end
    #without_default_scope  ⇒ Object 
  
Execute the block without applying the default scope.
# File 'lib/mongoid/scopable.rb', line 227
def without_default_scope Threaded.begin_without_default_scope(self) yield ensure Threaded.exit_without_default_scope(self) end