class Administrate::Search

Attributes

query[R]
resolver[R]

Public Class Methods

new(scoped_resource, dashboard_class, term) click to toggle source
# File lib/administrate/search.rb, line 50
def initialize(scoped_resource, dashboard_class, term)
  @dashboard_class = dashboard_class
  @scoped_resource = scoped_resource
  @query = Query.new(term)
end

Public Instance Methods

run() click to toggle source
# File lib/administrate/search.rb, line 56
def run
  if query.blank?
    @scoped_resource.all
  else
    results = search_results(@scoped_resource)
    results = filter_results(results)
    results
  end
end

Private Instance Methods

apply_filter(filter, resources) click to toggle source
# File lib/administrate/search.rb, line 68
def apply_filter(filter, resources)
  return resources unless filter
  filter.call(resources)
end
association_search?(attribute) click to toggle source
# File lib/administrate/search.rb, line 147
def association_search?(attribute)
  attribute_types[attribute].associative?
end
attribute_types() click to toggle source
# File lib/administrate/search.rb, line 114
def attribute_types
  @dashboard_class::ATTRIBUTE_TYPES
end
column_to_query(attr) click to toggle source
# File lib/administrate/search.rb, line 132
def column_to_query(attr)
  if association_search?(attr)
    ActiveRecord::Base.connection.
      quote_column_name(attribute_types[attr].searchable_field)
  else
    ActiveRecord::Base.connection.quote_column_name(attr)
  end
end
filter_results(resources) click to toggle source
# File lib/administrate/search.rb, line 73
def filter_results(resources)
  query.filters.each do |filter_name|
    filter = valid_filters[filter_name]
    resources = apply_filter(filter, resources)
  end
  resources
end
query_table_name(attr) click to toggle source
# File lib/administrate/search.rb, line 118
def query_table_name(attr)
  if association_search?(attr)
    provided_class_name = attribute_types[attr].options[:class_name]
    if provided_class_name
      provided_class_name.constantize.table_name
    else
      ActiveRecord::Base.connection.quote_table_name(attr.to_s.pluralize)
    end
  else
    ActiveRecord::Base.connection.
      quote_table_name(@scoped_resource.table_name)
  end
end
query_template() click to toggle source
# File lib/administrate/search.rb, line 81
def query_template
  search_attributes.map do |attr|
    table_name = query_table_name(attr)
    attr_name = column_to_query(attr)

    "LOWER(CAST(#{table_name}.#{attr_name} AS CHAR(256))) LIKE ?"
  end.join(" OR ")
end
query_values() click to toggle source
# File lib/administrate/search.rb, line 90
def query_values
  ["%#{term.mb_chars.downcase}%"] * search_attributes.count
end
search_attributes() click to toggle source
# File lib/administrate/search.rb, line 94
def search_attributes
  attribute_types.keys.select do |attribute|
    attribute_types[attribute].searchable?
  end
end
search_results(resources) click to toggle source
# File lib/administrate/search.rb, line 100
def search_results(resources)
  resources.
    joins(tables_to_join).
    where(query_template, *query_values)
end
tables_to_join() click to toggle source
# File lib/administrate/search.rb, line 141
def tables_to_join
  attribute_types.keys.select do |attribute|
    attribute_types[attribute].searchable? && association_search?(attribute)
  end
end
term() click to toggle source
# File lib/administrate/search.rb, line 151
def term
  query.terms
end
valid_filters() click to toggle source
# File lib/administrate/search.rb, line 106
def valid_filters
  if @dashboard_class.const_defined?(:COLLECTION_FILTERS)
    @dashboard_class.const_get(:COLLECTION_FILTERS).stringify_keys
  else
    {}
  end
end