Class: ActiveRecord::Scoping::ScopeRegistry

Inherits:
Object
  • Object
show all
Extended by:
ActiveSupport::PerThreadRegistry
Defined in:
activerecord/lib/active_record/scoping.rb

Overview

This class stores the :current_scope and :ignore_default_scope values for different classes. The registry is stored as a thread local, which is accessed through ScopeRegistry.current.

This class allows you to store and get the scope values on different classes and different types of scopes. For example, if you are attempting to get the current_scope for the Board model, then you would use the following code:

registry = ActiveRecord::Scoping::ScopeRegistry
registry.set_value_for(:current_scope, Board, some_new_scope)

Now when you run:

registry.value_for(:current_scope, Board)

You will obtain whatever was defined in some_new_scope. The #value_for and #set_value_for methods are delegated to the current ScopeRegistry object, so the above example code can also be called as:

ActiveRecord::Scoping::ScopeRegistry.set_value_for(:current_scope,
    Board, some_new_scope)

Constant Summary collapse

VALID_SCOPE_TYPES =
[:current_scope, :ignore_default_scope]

Instance Method Summary collapse

Methods included from ActiveSupport::PerThreadRegistry

extended, instance

Constructor Details

#initializeScopeRegistry

Returns a new instance of ScopeRegistry.



74
75
76
# File 'activerecord/lib/active_record/scoping.rb', line 74

def initialize
  @registry = Hash.new { |hash, key| hash[key] = {} }
end

Instance Method Details

#set_value_for(scope_type, model, value) ⇒ Object

Sets the value for a given scope_type and model.



92
93
94
95
# File 'activerecord/lib/active_record/scoping.rb', line 92

def set_value_for(scope_type, model, value)
  raise_invalid_scope_type!(scope_type)
  @registry[scope_type][model.name] = value
end

#value_for(scope_type, model, skip_inherited_scope = false) ⇒ Object

Obtains the value for a given scope_type and model.



79
80
81
82
83
84
85
86
87
88
89
# File 'activerecord/lib/active_record/scoping.rb', line 79

def value_for(scope_type, model, skip_inherited_scope = false)
  raise_invalid_scope_type!(scope_type)
  return @registry[scope_type][model.name] if skip_inherited_scope
  klass = model
  base = model.base_class
  while klass <= base
    value = @registry[scope_type][klass.name]
    return value if value
    klass = klass.superclass
  end
end