class Madmin::Search

Attributes

query[R]

Public Class Methods

new(scoped_resource, resource, term) click to toggle source
# File lib/madmin/search.rb, line 7
def initialize(scoped_resource, resource, term)
  @resource = resource
  @scoped_resource = scoped_resource
  @query = term
end

Public Instance Methods

run() click to toggle source
# File lib/madmin/search.rb, line 13
def run
  if query.blank?
    @scoped_resource.all
  else
    search_results(@scoped_resource)
  end
end

Private Instance Methods

column_to_query(attr) click to toggle source
# File lib/madmin/search.rb, line 56
def column_to_query(attr)
  ActiveRecord::Base.connection.quote_column_name(attr)
end
query_table_name(attr) click to toggle source
# File lib/madmin/search.rb, line 52
def query_table_name(attr)
  ActiveRecord::Base.connection.quote_column_name(@scoped_resource.table_name)
end
query_template() click to toggle source
# File lib/madmin/search.rb, line 27
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/madmin/search.rb, line 41
def query_values
  fields_count = search_attributes.sum do |attr|
    searchable_fields(attr).count
  end
  ["%#{@query.mb_chars.downcase}%"] * fields_count
end
search_attributes() click to toggle source
# File lib/madmin/search.rb, line 48
def search_attributes
  @resource.searchable_attributes
end
search_results(resources) click to toggle source
# File lib/madmin/search.rb, line 23
def search_results(resources)
  resources.where(query_template, *query_values)
end
searchable_fields(attr) click to toggle source
# File lib/madmin/search.rb, line 37
def searchable_fields(attr)
  [attr[:name]]
end