Use ILIKE/LIKE for Issuable.search and full_search
This commit is contained in:
parent
2076bdb62e
commit
87e7c3e132
2 changed files with 65 additions and 3 deletions
|
@ -61,12 +61,29 @@ module Issuable
|
|||
end
|
||||
|
||||
module ClassMethods
|
||||
# Searches for records with a matching title.
|
||||
#
|
||||
# This method uses ILIKE on PostgreSQL and LIKE on MySQL.
|
||||
#
|
||||
# query - The search query as a String
|
||||
#
|
||||
# Returns an ActiveRecord::Relation.
|
||||
def search(query)
|
||||
where("LOWER(title) like :query", query: "%#{query.downcase}%")
|
||||
where(arel_table[:title].matches("%#{query}%"))
|
||||
end
|
||||
|
||||
# Searches for records with a matching title or description.
|
||||
#
|
||||
# This method uses ILIKE on PostgreSQL and LIKE on MySQL.
|
||||
#
|
||||
# query - The search query as a String
|
||||
#
|
||||
# Returns an ActiveRecord::Relation.
|
||||
def full_search(query)
|
||||
where("LOWER(title) like :query OR LOWER(description) like :query", query: "%#{query.downcase}%")
|
||||
t = arel_table
|
||||
pattern = "%#{query}%"
|
||||
|
||||
where(t[:title].matches(pattern).or(t[:description].matches(pattern)))
|
||||
end
|
||||
|
||||
def sort(method)
|
||||
|
|
|
@ -32,9 +32,54 @@ describe Issue, "Issuable" do
|
|||
describe ".search" do
|
||||
let!(:searchable_issue) { create(:issue, title: "Searchable issue") }
|
||||
|
||||
it "matches by title" do
|
||||
it 'returns notches with a matching title' do
|
||||
expect(described_class.search(searchable_issue.title)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notes with a partially matching title' do
|
||||
expect(described_class.search('able')).to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notes with a matching title regardless of the casing' do
|
||||
expect(described_class.search(searchable_issue.title.upcase)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
end
|
||||
|
||||
describe ".full_search" do
|
||||
let!(:searchable_issue) do
|
||||
create(:issue, title: "Searchable issue", description: 'kittens')
|
||||
end
|
||||
|
||||
it 'returns notches with a matching title' do
|
||||
expect(described_class.full_search(searchable_issue.title)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notes with a partially matching title' do
|
||||
expect(described_class.full_search('able')).to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notes with a matching title regardless of the casing' do
|
||||
expect(described_class.full_search(searchable_issue.title.upcase)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notches with a matching description' do
|
||||
expect(described_class.full_search(searchable_issue.description)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notes with a partially matching description' do
|
||||
expect(described_class.full_search(searchable_issue.description)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
|
||||
it 'returns notes with a matching description regardless of the casing' do
|
||||
expect(described_class.full_search(searchable_issue.description.upcase)).
|
||||
to eq([searchable_issue])
|
||||
end
|
||||
end
|
||||
|
||||
describe "#today?" do
|
||||
|
|
Loading…
Reference in a new issue