Browse Source

Search schemes by location name

pull/791/head
baarkerlounger 3 years ago
parent
commit
97382577df
  1. 8
      app/models/scheme.rb
  2. 14
      spec/models/scheme_spec.rb

8
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

14
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

Loading…
Cancel
Save