From 9938ba8966c000de803e33e8530f6b36dab35117 Mon Sep 17 00:00:00 2001 From: nakamu-kazu222 Date: Mon, 24 Feb 2025 23:52:18 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E8=AA=9E=E4=BB=A5=E4=B8=8A=E3=81=AE?= =?UTF-8?q?=E3=82=AD=E3=83=BC=E3=83=AF=E3=83=BC=E3=83=89=E3=81=A7=E3=82=82?= =?UTF-8?q?=E6=A4=9C=E7=B4=A2=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「マルマル シャインカ」のようなスペースを含む検索ワードがそのまま1つの文字列として扱われ、部分一致検索ができるようにした --- app/models/concerns/searchable.rb | 19 ++++++------------- app/models/search_user.rb | 6 +++++- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/app/models/concerns/searchable.rb b/app/models/concerns/searchable.rb index 9b701f3adfd..866c861e190 100644 --- a/app/models/concerns/searchable.rb +++ b/app/models/concerns/searchable.rb @@ -15,7 +15,7 @@ def search_by_keywords(searched_values = {}) end def columns_for_keyword_search(*column_names) - define_singleton_method(:_join_column_names) { "#{column_names.join('_or_')}_cont_any" } + define_singleton_method(:_join_column_names) { "#{(column_names + %i[kana_name]).join('_or_')}_cont_any" } end private @@ -23,23 +23,16 @@ def columns_for_keyword_search(*column_names) def params_for_keyword_search(searched_values = {}) return {} if searched_values[:word].blank? - groupings = searched_values[:word].split(/[[:blank:]]+/).map do |word| - if word.start_with?('user:') - create_parameter_for_search_user_id(word.delete_prefix('user:')) - else - { _join_column_names => word } - end - end + word = searched_values[:word].strip - { combinator: 'or', groupings: } + { combinator: 'or', groupings: [word_to_groupings(word)] } end def word_to_groupings(word) return { _join_column_names => word } if COLUMN_NAMES_FOR_SEARCH_USER_ID.none? { |column_name| has_attribute?(column_name) } - case word - when /user:(.*)/ - create_parameter_for_search_user_id(Regexp.last_match(1)) + if word.match?(/^user:/) + create_parameter_for_search_user_id(word.delete_prefix("user:")) else { _join_column_names => word } end @@ -51,7 +44,7 @@ def split_keyword_by_blank(word) def create_parameter_for_search_user_id(username) user = User.find_by(login_name: username) - { "#{COLUMN_NAMES_FOR_SEARCH_USER_ID.join('_or_')}_eq" => user&.id || 0 } + { "#{%i[user_id last_updated_user_id].join('_or_')}_eq" => user&.id || 0 } end end diff --git a/app/models/search_user.rb b/app/models/search_user.rb index 95da53c75bf..5de2d4c3a76 100644 --- a/app/models/search_user.rb +++ b/app/models/search_user.rb @@ -10,7 +10,9 @@ def initialize(word:, users: nil, target: nil, require_retire_user: false) def search validated_search_word = validate_search_word - searched_user = @users ? @users.merge(User.search_by_keywords(word: validated_search_word)) : User.search_by_keywords(word: validated_search_word) + return User.none if validated_search_word.blank? + + searched_user = @users ? @users.merge(User.search_by_keywords(word: validated_search_word, exact_match: true)) : User.search_by_keywords(word: validated_search_word, exact_match: true) if @target == 'retired' searched_user.unscope(where: :retired_on).retired @@ -23,6 +25,8 @@ def search def validate_search_word stripped_word = @word.strip + return nil if stripped_word.blank? + if stripped_word.match?(/^[\w-]+$/) stripped_word if stripped_word.length >= 3 elsif stripped_word.length >= 2