Split Poll::Booth.search in two methods
We use this method in two different scenarios. In an AJAX request, we don't want to return every booth if the search is blank. However, in a normal HTTP GET request, we want to return every record when the search is empty, as we do everywhere else. It's possible the behaviour of the AJAX call is unusual, since it searches all booths, and not just the ones assigned to a poll. If we changed this behaviour, we could simplify the code and remove the `quick_search` method.
This commit is contained in:
@@ -9,7 +9,7 @@ class Admin::Poll::BoothAssignmentsController < Admin::Poll::BaseController
|
|||||||
|
|
||||||
def search_booths
|
def search_booths
|
||||||
load_search
|
load_search
|
||||||
@booths = ::Poll::Booth.search(@search)
|
@booths = ::Poll::Booth.quick_search(@search)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.js
|
format.js
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ class Admin::Poll::BoothsController < Admin::Poll::BaseController
|
|||||||
load_and_authorize_resource class: "Poll::Booth"
|
load_and_authorize_resource class: "Poll::Booth"
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@booths = @booths.search params[:search] if params[:search]
|
@booths = @booths.search(params[:search])
|
||||||
@booths = @booths.order(name: :asc).page(params[:page])
|
@booths = @booths.order(name: :asc).page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,17 @@ class Poll
|
|||||||
validates :name, presence: true, uniqueness: true
|
validates :name, presence: true, uniqueness: true
|
||||||
|
|
||||||
def self.search(terms)
|
def self.search(terms)
|
||||||
return Booth.none if terms.blank?
|
|
||||||
Booth.where("name ILIKE ? OR location ILIKE ?", "%#{terms}%", "%#{terms}%")
|
Booth.where("name ILIKE ? OR location ILIKE ?", "%#{terms}%", "%#{terms}%")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.quick_search(terms)
|
||||||
|
if terms.blank?
|
||||||
|
Booth.none
|
||||||
|
else
|
||||||
|
search(terms)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.available
|
def self.available
|
||||||
where(polls: { id: Poll.current_or_recounting }).joins(:polls)
|
where(polls: { id: Poll.current_or_recounting }).joins(:polls)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ describe Poll::Booth do
|
|||||||
expect(booth).not_to be_valid
|
expect(booth).not_to be_valid
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#search" do
|
describe ".search" do
|
||||||
it "finds booths searching by name or location" do
|
it "finds booths searching by name or location" do
|
||||||
booth1 = create(:poll_booth, name: "Booth number 1", location: "City center")
|
booth1 = create(:poll_booth, name: "Booth number 1", location: "City center")
|
||||||
booth2 = create(:poll_booth, name: "Central", location: "Town hall")
|
booth2 = create(:poll_booth, name: "Central", location: "Town hall")
|
||||||
@@ -22,6 +22,26 @@ describe Poll::Booth do
|
|||||||
expect(Poll::Booth.search("hall")).to eq([booth2])
|
expect(Poll::Booth.search("hall")).to eq([booth2])
|
||||||
expect(Poll::Booth.search("cen")).to match_array [booth1, booth2]
|
expect(Poll::Booth.search("cen")).to match_array [booth1, booth2]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "returns all booths if search term is blank" do
|
||||||
|
2.times { create(:poll_booth) }
|
||||||
|
|
||||||
|
expect(Poll::Booth.search("").count).to eq 2
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns all booths if search term is nil" do
|
||||||
|
2.times { create(:poll_booth) }
|
||||||
|
|
||||||
|
expect(Poll::Booth.search(nil).count).to eq 2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe ".quick_search" do
|
||||||
|
it "returns no booths if search term is blank" do
|
||||||
|
create(:poll_booth)
|
||||||
|
|
||||||
|
expect(Poll::Booth.quick_search("")).to be_empty
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe ".available" do
|
describe ".available" do
|
||||||
|
|||||||
Reference in New Issue
Block a user