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