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