app/models/person_modules/text_search.rb

Summary

Maintainability
A
40 mins
Test Coverage
module PersonModules
  module TextSearch
    extend ActiveSupport::Concern

    included do
      after_save :update_searchable

      after_save do
        if user
          user.update_searchable
          user.update_trgm_searchable
        end
      end

      def update_searchable
        update_columns searchable: [last_name,first_name,pseudonym].flatten \
          .compact.sort.uniq.join(" ")
      end

      scope :text_search, lambda{|search_term| 
        where(%Q{searchable ILIKE :term}, term: "%#{search_term}%")}

      scope :text_rank_search, lambda{|search_term| 
        rank= text_search_rank :searchable, search_term
        select("#{'people.*,' if select_values.empty?}  #{rank} AS search_rank") \
          .where("#{rank} > 0.05") \
          .reorder("search_rank DESC") }

      scope :trgm_rank_search, lambda{|search_term| 
        rank= trgm_search_rank :searchable, search_term
        select("#{'people.*,' if select_values.empty?} #{rank} AS search_rank") \
          .where("#{rank} > 0.05") \
          .reorder("search_rank DESC") }

    end
  end
end