Module: PgSearchable::ActiveRecord::Relation
- Defined in:
- lib/pg_searchable/active_record/relation.rb
Instance Method Summary collapse
- #close_to(longitude, latitude, distance_in_miles = 5) ⇒ Object
- #rank_by(rank) ⇒ Object
- #search_for(term, options = {}) ⇒ Object
Instance Method Details
#close_to(longitude, latitude, distance_in_miles = 5) ⇒ Object
22 23 24 25 26 27 28 29 30 31 |
# File 'lib/pg_searchable/active_record/relation.rb', line 22 def close_to(longitude, latitude, distance_in_miles = 5) distance_in_meters = (distance_in_miles.to_f * 1609.34).ceil longitude_column = "longitude" latitude_column = "latitude" where("ST_DWithin( ST_GeographyFromText('SRID=4326;POINT(' || #{arel_table.name}.#{longitude_column} || ' ' || #{arel_table.name}.#{latitude_column} || ')'), ST_GeographyFromText('SRID=4326;POINT(%f %f)'), %d )", longitude, latitude, distance_in_meters) end |
#rank_by(rank) ⇒ Object
33 34 35 36 37 |
# File 'lib/pg_searchable/active_record/relation.rb', line 33 def rank_by(rank) # TODO: add ranks to projections puts "ranking by #{rank}" self end |
#search_for(term, options = {}) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/pg_searchable/active_record/relation.rb', line 6 def search_for(term, = {}) using = Array(.delete(:using) || :default) models = Array([:in]).map {|association| klass.reflect_on_association(association).klass } conditions = [self.klass, models].flatten.inject([]) do |conditions, klass| name = using.find {|name| klass.pg_searchable_configs.key?(name.to_sym) } config = klass.pg_searchable_configs[name] Array(config[:tgrm][:columns]).each {|name| conditions << klass.arel_table[name].tgrm(term).to_sql } Array(config[:tsearch][:columns]).each {|name| conditions << klass.arel_table[name].tsearch(term, config[:tsearch][:dictionary]).to_sql } Array(config[:dmetaphone][:columns]).each {|name| conditions << klass.arel_table[name].(term, config[:dmetaphone][:dictionary]).to_sql } conditions end where("#{conditions.join(' OR ')}") end |