lib/pg_search/model.rb
# frozen_string_literal: true
module PgSearch
module Model
extend ActiveSupport::Concern
module ClassMethods
def pg_search_scope(name, options)
options_proc = if options.respond_to?(:call)
options
elsif options.respond_to?(:merge)
->(query) { {query: query}.merge(options) }
else
raise ArgumentError, "pg_search_scope expects a Hash or Proc"
end
define_singleton_method(name) do |*args|
config = Configuration.new(options_proc.call(*args), self)
scope_options = ScopeOptions.new(config)
scope_options.apply(self)
end
end
def multisearchable(options = {})
include PgSearch::Multisearchable
class_attribute :pg_search_multisearchable_options
self.pg_search_multisearchable_options = options
end
end
def method_missing(symbol, *args)
case symbol
when :pg_search_rank
raise PgSearchRankNotSelected unless respond_to?(:pg_search_rank)
read_attribute(:pg_search_rank).to_f
when :pg_search_highlight
raise PgSearchHighlightNotSelected unless respond_to?(:pg_search_highlight)
read_attribute(:pg_search_highlight)
else
super
end
end
def respond_to_missing?(symbol, *args)
case symbol
when :pg_search_rank
attributes.key?(:pg_search_rank)
when :pg_search_highlight
attributes.key?(:pg_search_highlight)
else
super
end
end
end
end