class Administrate::Search
Attributes
query[R]
resolver[R]
Public Class Methods
new(scoped_resource, dashboard, term)
click to toggle source
# File lib/administrate/search.rb, line 51 def initialize(scoped_resource, dashboard, term) @dashboard = dashboard @scoped_resource = scoped_resource @query = Query.new(term, valid_filters.keys) end
Public Instance Methods
run()
click to toggle source
# File lib/administrate/search.rb, line 57 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, filter_param, resources)
click to toggle source
# File lib/administrate/search.rb, line 69 def apply_filter(filter, filter_param, resources) return resources unless filter if filter.parameters.size == 1 filter.call(resources) else filter.call(resources, filter_param) end end
association_search?(attribute)
click to toggle source
# File lib/administrate/search.rb, line 159 def association_search?(attribute) attribute_types[attribute].associative? end
attribute_types()
click to toggle source
# File lib/administrate/search.rb, line 128 def attribute_types @dashboard.class.const_get(:ATTRIBUTE_TYPES) end
column_to_query(attr)
click to toggle source
# File lib/administrate/search.rb, line 149 def column_to_query(attr) ActiveRecord::Base.connection.quote_column_name(attr) end
filter_results(resources)
click to toggle source
# File lib/administrate/search.rb, line 78 def filter_results(resources) query.filters.each do |filter_query| filter_name, filter_param = filter_query.split(":") filter = valid_filters[filter_name] resources = apply_filter(filter, filter_param, resources) end resources end
query_table_name(attr)
click to toggle source
# File lib/administrate/search.rb, line 132 def query_table_name(attr) if association_search?(attr) provided_class_name = attribute_types[attr].options[:class_name] unquoted_table_name = if provided_class_name Administrate.warn_of_deprecated_option(:class_name) provided_class_name.constantize.table_name else @scoped_resource.reflect_on_association(attr).klass.table_name end ActiveRecord::Base.connection.quote_table_name(unquoted_table_name) 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 87 def query_template search_attributes.map do |attr| table_name = query_table_name(attr) searchable_fields(attr).map do |field| column_name = column_to_query(field) "LOWER(CAST(#{table_name}.#{column_name} AS CHAR(256))) LIKE ?" end.join(" OR ") end.join(" OR ") end
query_values()
click to toggle source
# File lib/administrate/search.rb, line 103 def query_values fields_count = search_attributes.sum do |attr| searchable_fields(attr).count end ["%#{term.mb_chars.downcase}%"] * fields_count end
search_attributes()
click to toggle source
# File lib/administrate/search.rb, line 110 def search_attributes @dashboard.search_attributes end
search_results(resources)
click to toggle source
# File lib/administrate/search.rb, line 114 def search_results(resources) resources. left_joins(tables_to_join). where(query_template, *query_values) end
searchable_fields(attr)
click to toggle source
# File lib/administrate/search.rb, line 97 def searchable_fields(attr) return [attr] unless association_search?(attr) attribute_types[attr].searchable_fields end
tables_to_join()
click to toggle source
# File lib/administrate/search.rb, line 153 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 163 def term query.terms end
valid_filters()
click to toggle source
# File lib/administrate/search.rb, line 120 def valid_filters if @dashboard.class.const_defined?(:COLLECTION_FILTERS) @dashboard.class.const_get(:COLLECTION_FILTERS).stringify_keys else {} end end