diff --git a/app/models/scheme.rb b/app/models/scheme.rb index 41f757d15..5052b171c 100644 --- a/app/models/scheme.rb +++ b/app/models/scheme.rb @@ -7,7 +7,13 @@ class Scheme < ApplicationRecord scope :filter_by_id, ->(id) { where(id: (id.start_with?("S") ? id[1..] : id)) } scope :search_by_service_name, ->(name) { where("service_name ILIKE ?", "%#{name}%") } scope :search_by_postcode, ->(postcode) { joins("LEFT JOIN locations ON locations.scheme_id = schemes.id").where("locations.postcode ILIKE ?", "%#{postcode.delete(' ')}%") } - scope :search_by, ->(param) { search_by_postcode(param).or(search_by_service_name(param)).or(filter_by_id(param)).distinct } + scope :search_by_location_name, ->(name) { joins("LEFT JOIN locations ON locations.scheme_id = schemes.id").where("locations.name ILIKE ?", "%#{name}%") } + scope :search_by, lambda { |param| + search_by_postcode(param) + .or(search_by_service_name(param)) + .or(search_by_location_name(param)) + .or(filter_by_id(param)).distinct + } validate :validate_confirmed diff --git a/spec/models/scheme_spec.rb b/spec/models/scheme_spec.rb index d81d93bd6..dddf8edb4 100644 --- a/spec/models/scheme_spec.rb +++ b/spec/models/scheme_spec.rb @@ -45,6 +45,17 @@ RSpec.describe Scheme, type: :model do end end + context "when searching by location name" do + it "returns case insensitive matching records" do + expect(described_class.search_by_location_name(location.name.upcase).count).to eq(1) + expect(described_class.search_by_location_name(location.name.downcase).count).to eq(1) + expect(described_class.search_by_location_name(location.name.downcase).first.locations.first.name).to eq(location.name) + expect(described_class.search_by_location_name(location_2.name.upcase).count).to eq(1) + expect(described_class.search_by_location_name(location_2.name.downcase).count).to eq(1) + expect(described_class.search_by_location_name(location_2.name.downcase).first.locations.first.name).to eq(location_2.name) + end + end + context "when searching by all searchable fields" do before do location_2.update!(postcode: location_2.postcode.gsub(scheme_1.id.to_s, "0")) @@ -59,6 +70,9 @@ RSpec.describe Scheme, type: :model do expect(described_class.search_by(location.postcode.upcase).count).to eq(1) expect(described_class.search_by(location.postcode.downcase).count).to eq(1) expect(described_class.search_by(location.postcode.downcase).first.locations.first.postcode).to eq(location.postcode) + expect(described_class.search_by(location.name.upcase).count).to eq(1) + expect(described_class.search_by(location.name.downcase).count).to eq(1) + expect(described_class.search_by(location.name.downcase).first.locations.first.name).to eq(location.name) end end end