Module: ConcernsOnRails::Models::Searchable

Extended by:
ActiveSupport::Concern
Defined in:
lib/concerns_on_rails/models/searchable.rb

Overview

LIKE-based search across one or more columns.

class Article < ApplicationRecord
  include ConcernsOnRails::Searchable

  searchable_by :title, :body                                  # defaults below
  searchable_by :title, :body, mode: :all                      # every term must match
  searchable_by :sku,         match: :prefix                   # "abc" -> "abc%"
  searchable_by :code,        match: :exact, case_sensitive: true
end

Article.search("hello")            # WHERE title ILIKE '%hello%' OR body ILIKE '%hello%'
Article.search("")                 # no-op — returns the full relation
Article.search("foo").where(...)   # chainable like any scope

Options (all optional; the defaults reproduce a single-term, case-insensitive “contains” search across the given columns):

mode:           :any (default) treats the whole query as one term;
                :all splits on whitespace and requires every term to match.
match:          :contains (default, "%q%"), :prefix ("q%"), or :exact ("q").
case_sensitive: false (default) emits ILIKE on Postgres; true emits LIKE.

Uses Arel’s ‘matches`. The query is escaped before interpolation, so `%` / `_` / `` from user input are treated as literals.

Constant Summary collapse

LIKE_ESCAPE =
"\\".freeze
LIKE_SPECIAL =
/[\\%_]/
VALID_MODES =
%i[any all].freeze
VALID_MATCHES =
%i[contains prefix exact].freeze