From 50a286fe7556ec658ac2e9536865391f5f5ccbce Mon Sep 17 00:00:00 2001 From: Joshua Wehner Date: Tue, 23 May 2023 10:41:18 +0200 Subject: [PATCH] Change order of organizations on /admin (#19499) * Change order of organizations on /admin * Rubocop --- .../admin/organizations_controller.rb | 11 ++---- app/models/organization.rb | 8 +++++ spec/models/organization_spec.rb | 36 +++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/app/controllers/admin/organizations_controller.rb b/app/controllers/admin/organizations_controller.rb index b342fb714..a3392692c 100644 --- a/app/controllers/admin/organizations_controller.rb +++ b/app/controllers/admin/organizations_controller.rb @@ -1,6 +1,7 @@ module Admin class OrganizationsController < Admin::ApplicationController layout "admin" + PER_PAGE_MAX = 50 CREDIT_ACTIONS = { add: :add_to, @@ -8,14 +9,8 @@ module Admin }.with_indifferent_access.freeze def index - @organizations = Organization.order(name: :desc).page(params[:page]).per(50) - - return if params[:search].blank? - - @organizations = @organizations.where( - "name ILIKE ?", - "%#{params[:search].strip}%", - ) + @organizations = Organization.simple_name_match(params[:search].presence) + .page(params[:page]).per(PER_PAGE_MAX) end def show diff --git a/app/models/organization.rb b/app/models/organization.rb index 5ffc47a23..b2fe0e130 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -68,6 +68,14 @@ class Organization < ApplicationRecord alias_attribute :old_old_username, :old_old_slug alias_attribute :website_url, :url + def self.simple_name_match(query) + scope = order(:name) + query&.strip! + return scope if query.blank? + + scope.where("name ILIKE ?", "%#{query}%") + end + def self.integer_only I18n.t("models.organization.integer_only") end diff --git a/spec/models/organization_spec.rb b/spec/models/organization_spec.rb index 4754cdd1d..2cd01cba1 100644 --- a/spec/models/organization_spec.rb +++ b/spec/models/organization_spec.rb @@ -339,4 +339,40 @@ RSpec.describe Organization do expect(organization.enough_credits?(1)).to be(true) end end + + describe ".simple_name_match" do + before do + create(:organization, name: "Not Matching") + create(:organization, name: "For Fans of Books") + create(:organization, name: "Boo! A Ghost") + end + + it "finds them by simple ilike match" do + query = "boo" + results = described_class.simple_name_match(query) + expect(results.pluck(:name)).to eq(["Boo! A Ghost", "For Fans of Books"]) + + query = "book" + results = described_class.simple_name_match(query) + expect(results.pluck(:name)).to eq(["For Fans of Books"]) + + query = " BOOK " + results = described_class.simple_name_match(query) + expect(results.pluck(:name)).to eq(["For Fans of Books"]) + end + + it "returns all orgs on empty query" do + query = nil + results = described_class.simple_name_match(query) + expect(results.size).to eq(3) + + query = "" + results = described_class.simple_name_match(query) + expect(results.size).to eq(3) + + query = " " + results = described_class.simple_name_match(query) + expect(results.size).to eq(3) + end + end end