Module: SearchCop::ClassMethods

Defined in:
lib/search_cop.rb

Instance Method Summary collapse

Instance Method Details

#search_cop(query, scope_name) ⇒ Object



52
53
54
55
56
# File 'lib/search_cop.rb', line 52

def search_cop(query, scope_name)
  unsafe_search_cop query, scope_name
rescue SearchCop::RuntimeError
  respond_to?(:none) ? none : where("1 = 0")
end

#search_reflection(scope_name) ⇒ Object



48
49
50
# File 'lib/search_cop.rb', line 48

def search_reflection(scope_name)
  search_scopes[scope_name].reflection
end

#search_scope(name, &block) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/search_cop.rb', line 38

def search_scope(name, &block)
  self.search_scopes = search_scopes.dup

  search_scopes[name] = SearchScope.new(name, self)
  search_scopes[name].instance_exec(&block)

  self.class.send(:define_method, name) { |query| search_cop query, name }
  self.class.send(:define_method, "unsafe_#{name}") { |query| unsafe_search_cop query, name }
end

#unsafe_search_cop(query, scope_name) ⇒ Object



58
59
60
61
62
63
64
65
66
67
# File 'lib/search_cop.rb', line 58

def unsafe_search_cop(query, scope_name)
  return respond_to?(:scoped) ? scoped : all if query.blank?

  query_builder = QueryBuilder.new(self, query, search_scopes[scope_name])

  scope = instance_exec(&search_scopes[scope_name].reflection.scope) if search_scopes[scope_name].reflection.scope
  scope ||= eager_load(query_builder.associations) if query_builder.associations.any?

  (scope || self).where(query_builder.sql)
end