2019-02-26 18:01:15 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module SearchableByNameModel
|
|
|
|
extend ActiveSupport::Concern
|
2020-09-17 19:15:40 +08:00
|
|
|
# rubocop:disable Metrics/BlockLength
|
2019-02-26 18:01:15 +08:00
|
|
|
included do
|
|
|
|
def self.search_by_name(user, teams = [], query = nil, options = {})
|
|
|
|
return if user.blank? || teams.blank?
|
2019-04-09 15:08:27 +08:00
|
|
|
|
2023-02-24 20:30:55 +08:00
|
|
|
sql_q = self
|
2020-09-17 19:15:40 +08:00
|
|
|
|
|
|
|
if options[:intersect]
|
|
|
|
query_array = query.gsub(/[[:space:]]+/, ' ').split(' ')
|
|
|
|
query_array.each do |string|
|
|
|
|
sql_q = sql_q.where("trim_html_tags(#{table_name}.name) ILIKE ?", "%#{string}%")
|
|
|
|
end
|
|
|
|
else
|
|
|
|
sql_q = sql_q.where_attributes_like("#{table_name}.name", query, options)
|
2020-09-15 21:47:46 +08:00
|
|
|
end
|
2020-09-17 19:15:40 +08:00
|
|
|
|
2023-02-24 20:30:55 +08:00
|
|
|
sql_q = sql_q.where(id: viewable_by_user(user, teams))
|
|
|
|
|
2020-09-15 21:47:46 +08:00
|
|
|
sql_q.limit(Constants::SEARCH_LIMIT)
|
|
|
|
end
|
2023-05-03 17:05:29 +08:00
|
|
|
|
|
|
|
def self.search_by_name_and_id(user, teams = [], query = nil)
|
|
|
|
return if user.blank? || teams.blank?
|
|
|
|
|
|
|
|
sanitized_query = ActiveRecord::Base.sanitize_sql_like(query.to_s)
|
|
|
|
|
|
|
|
sql_q = viewable_by_user(user, teams).where(
|
|
|
|
"trim_html_tags(#{table_name}.name) ILIKE ? OR " \
|
|
|
|
" #{self::PREFIXED_ID_SQL} ILIKE ? ",
|
|
|
|
"%#{sanitized_query}%", "%#{sanitized_query}%"
|
|
|
|
)
|
|
|
|
|
|
|
|
sql_q.limit(Constants::SEARCH_LIMIT)
|
|
|
|
end
|
2019-02-26 18:01:15 +08:00
|
|
|
end
|
2020-09-17 19:15:40 +08:00
|
|
|
# rubocop:enable Metrics/BlockLength
|
2019-02-26 18:01:15 +08:00
|
|
|
end
|