Module: Searchlogic::ActiveRecord::Scope

Included in:
ActiveRecord::Base
Defined in:
lib/searchlogic/active_record/scope.rb

Overview

The internals to ActiveRecord like to do scopes.include?(scope_name). And this is how they check for the existence of scopes, which is terrible. The problem is that searchlogic scopes are dynamically created. So the only solution is to override the include? method for the scopes hash, try to create the named scope, and then check it again. This shouldn’t effect performance because once its created it never gets called again. I also cache failed names so we don’t try to create them again.

Instance Method Summary collapse

Instance Method Details

#scopesObject



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/searchlogic/active_record/scope.rb', line 9

def scopes
  read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {}.tap do |h|
    
    class << h
      attr_accessor :active_record_class
    end
    h.active_record_class = self
    
    h.instance_eval <<-eval
      def include?(key)
        result = super
        return result if result
        active_record_class.respond_to?(key)
        super
      end
    eval
    
  end)
end