Module: PgSearchable::ActiveRecord::Relation

Defined in:
lib/pg_searchable/active_record/relation.rb

Instance Method Summary collapse

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, options = {})
  using       = Array(options.delete(:using) || :default)
  models      = Array(options[: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].dmetaphone(term, config[:dmetaphone][:dictionary]).to_sql }
    conditions
  end

  where("#{conditions.join(' OR ')}")
end