Skip to content

Instantly share code, notes, and snippets.

@Hunk13
Created December 26, 2016 10:47
Show Gist options
  • Select an option

  • Save Hunk13/a0dba0781cf9334b116f31c265312954 to your computer and use it in GitHub Desktop.

Select an option

Save Hunk13/a0dba0781cf9334b116f31c265312954 to your computer and use it in GitHub Desktop.
class CustomerSearchTerm
attr_reader :where_clause, :where_args, :order
def initialize(search_term)
search_term = search_term.downcase
@where_clause = ""
@where_args = {}
if search_term =~ /@/
build_for_email_search(search_term)
else
build_for_name_search(search_term)
end
end
def build_for_name_search(search_term)
@where_clause << case_insensitive_search(:first_name)
@where_args[:first_name] = starts_with(search_term)
@where_clause << " OR #{case_insensitive_search(:last_name)}"
@where_args[:last_name] = starts_with(search_term)
@order = "last_name asc"
end
def build_for_email_search(search_term)
@where_clause << case_insensitive_search(:first_name)
@where_args[:first_name] = starts_with(extract_name(search_term))
@where_clause << " OR #{case_insensitive_search(:last_name)}"
@where_args[:last_name] = starts_with(extract_name(search_term))
@where_clause << " OR #{case_insensitive_search(:email)}"
@where_args[:email] = search_term
@order = "lower(email) = " +
ActiveRecord::Base.connection.quote(search_term) +
" desc, last_name asc"
end
def starts_with(search_term)
search_term + "%"
end
def case_insensitive_search(field_name)
"lower(#{field_name}) like :#{field_name}"
end
def extract_name(email)
email.gsub(/@.*$/,'').gsub(/[0-9]+/,'')
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment