Skip to content

Instantly share code, notes, and snippets.

@benaskins
Created May 21, 2009 01:52
Show Gist options
  • Save benaskins/115211 to your computer and use it in GitHub Desktop.
Save benaskins/115211 to your computer and use it in GitHub Desktop.
module Locality::Search
def self.included(base)
base.class_eval do
class << self
def search(criteria)
logger.debug("search")
results = find_all_by_name(criteria)
if results.empty?
split_criteria = criteria.split(" ")
name, state_name = split_criteria[0..split_criteria.length-2].join(" "), split_criteria.length == 1 ? nil : split_criteria.last
results = find_all_by_name("#{name}, #{state_name}")
end
if results.empty?
results = find_all_by_post_code(criteria)
end
results
end
def find_all_by_name(criteria)
logger.debug("find_all_by_name")
name, state_name = criteria.split(",").collect { |e| e.squish }
if state_name
find_all_by_name_and_state_name(name, state_name)
else
find_all_like_name(name)
end
end
def find_by_name(criteria)
logger.debug("find_by_name")
name, state_name = criteria.split(",").collect { |e| e.squish }
if state_name
find_by_name_and_state_name(name, state_name)
else
find_like_name(name)
end
end
def find_by_name_and_state_name(name, state_name)
logger.debug("find_by_name_and_state_name")
state = State.find_by_name(state_name)
if state
find_by_name_and_state_id(name, state.id)
else
find_like_name(name)
end
end
def find_all_by_name_and_state_name(name, state_name)
logger.debug("find_all_by_name_and_state_name")
state = State.find_by_name(state_name)
if state
find_all_by_name_and_state_id(name, state.id)
else
find_all_like_name(name)
end
end
def find_all_like_name(name)
logger.debug("find_all_like_name")
find(:all, :conditions => "name like '%#{name}%'")
end
def find_like_name(name)
logger.debug("find_like_name")
find(:first, :conditions => "name like '%#{name}%'")
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment