module MongoMapper::Plugins::Scopes::ClassMethods
Constants
- RESTRICTED_CLASS_METHODS
Public Instance Methods
active_scopes()
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 33 def active_scopes Thread.current["mongo_mapper_#{name}_active_scopes"] ||= [] end
default_scope(*args, &block)
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 57 def default_scope(*args, &block) if block_given? default_scopes << instance_exec(&block) end if args.any? default_scopes << args end default_scopes end
default_scopes()
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 37 def default_scopes @default_scopes ||= begin superclass.respond_to?(:default_scopes) ? superclass.default_scopes.dup : [] end end
query(options = {})
click to toggle source
Calls superclass method
# File lib/mongo_mapper/plugins/scopes.rb, line 45 def query(options = {}) res = super(options) all_anonymous_scopes.each do |scope| unscoped do res = process_scope(res, scope) end end res end
scope(name, scope={})
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 12 def scope(name, scope={}) if dangerous_class_method?(name) raise ArgumentError, <<~end_message You tried to define a scope named "#{name}" on the model "#{self.name}", but MongoMapper::Document already defined a class method with the same name. end_message end # Assign to _scopes instead of using []= to avoid mixing subclass scopes self._scopes = scopes.merge(name => scope) singleton_class.send :define_method, name do |*args| process_scope(self, scopes[name], *args) end end
scopes()
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 29 def scopes self._scopes ||= {} end
unscoped() { || ... }
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 76 def unscoped old_default_scopes = default_scopes.dup old_active_scopes = active_scopes.dup @default_scopes = [] active_scopes.clear yield ensure @default_scopes = old_default_scopes active_scopes.concat(old_active_scopes) end
with_scope(query = {}) { || ... }
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 69 def with_scope(query = {}) active_scopes.push(query) yield ensure active_scopes.pop end
Private Instance Methods
all_anonymous_scopes()
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 101 def all_anonymous_scopes [default_scopes + active_scopes].flatten end
dangerous_class_method?(method_name)
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 108 def dangerous_class_method?(method_name) return true if RESTRICTED_CLASS_METHODS.include?(method_name.to_s) Document.method_defined?(method_name) end
process_scope(context, scope, *args)
click to toggle source
# File lib/mongo_mapper/plugins/scopes.rb, line 91 def process_scope(context, scope, *args) if scope.is_a?(Proc) scope = context.instance_exec(*args, &scope) end scope.is_a?(Hash) ? context.where(scope) : scope end