From 5d858ae18602da777b6f9cd5f16fd032deaacbf0 Mon Sep 17 00:00:00 2001 From: Rick Barrette Date: Wed, 25 Feb 2026 22:05:52 -0500 Subject: [PATCH] Enhance customer search functionality by ordering results and refining search method --- app/controllers/customers_controller.rb | 2 +- app/models/customer.rb | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index c3ea192..1158a9a 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -51,7 +51,7 @@ class CustomersController < ApplicationController # display a list of all customers def index if params[:search] - @customers = Customer.search(params[:search]).paginate(page: params[:page]) + @customers = Customer.search(params[:search]).order(:name).paginate(page: params[:page]) if only_one_non_zero?(@customers) redirect_to @customers.first end diff --git a/app/models/customer.rb b/app/models/customer.rb index 730a31a..2e88461 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -30,6 +30,8 @@ class Customer < ActiveRecord::Base :type => :to_s, :description => Proc.new {|o| "#{I18n.t :label_primary_phone}: #{o.phone_number} #{I18n.t:label_mobile_phone}: #{o.mobile_phone_number}"}, :datetime => Proc.new {|o| o.updated_at || o.created_at} + + #default_scope { order(name: :asc) } # Convenience Method # returns the customer's email @@ -181,10 +183,10 @@ class Customer < ActiveRecord::Base end end + # Seach for customers by name or phone number def self.search(search) search = sanitize_sql_like(search) - customers = where("name LIKE ? OR phone_number LIKE ? OR mobile_phone_number LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") - return customers.order(:name) + where("name LIKE ? OR phone_number LIKE ? OR mobile_phone_number LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") end # Override the defult redmine seach method to rank results by id @@ -194,14 +196,11 @@ class Customer < ActiveRecord::Base scope = self.all tokens.each do |token| - q = "%#{sanitize_sql_like(token)}%" - scope = where("name LIKE ? OR phone_number LIKE ? OR mobile_phone_number LIKE ?", "%#{q}%", "%#{q}%", "%#{q}%") + scope = scope.search(token) end ids = scope.distinct.limit(options[:limit] || 100).pluck(:id) - - # Assign simple uniform ranking - ids.each_with_object({}) { |id, h| h[id] = id } + ids.index_with { |id| id } end # proforms a bruteforce sync operation