Commit 800aa296 authored by Yorick Peterse's avatar Yorick Peterse Committed by Robert Speicher

Use ILIKE/LIKE for searching users

parent 508b6b46
...@@ -286,8 +286,22 @@ class User < ActiveRecord::Base ...@@ -286,8 +286,22 @@ class User < ActiveRecord::Base
end end
end end
# Searches users matching the given query.
#
# This method uses ILIKE on PostgreSQL and LIKE on MySQL.
#
# query - The search query as a String
#
# Returns an ActiveRecord::Relation.
def search(query) def search(query)
where("lower(name) LIKE :query OR lower(email) LIKE :query OR lower(username) LIKE :query", query: "%#{query.downcase}%") table = User.arel_table
pattern = "%#{query}%"
where(
table[:name].matches(pattern).
or(table[:email].matches(pattern)).
or(table[:username].matches(pattern))
)
end end
def by_login(login) def by_login(login)
......
...@@ -463,17 +463,43 @@ describe User, models: true do ...@@ -463,17 +463,43 @@ describe User, models: true do
end end
end end
describe 'search' do describe '.search' do
let(:user1) { create(:user, username: 'James', email: 'james@testing.com') } let(:user) { create(:user) }
let(:user2) { create(:user, username: 'jameson', email: 'jameson@example.com') }
it 'returns users with a matching name' do
it "should be case insensitive" do expect(described_class.search(user.name)).to eq([user])
expect(User.search(user1.username.upcase).to_a).to eq([user1]) end
expect(User.search(user1.username.downcase).to_a).to eq([user1])
expect(User.search(user2.username.upcase).to_a).to eq([user2]) it 'returns users with a partially matching name' do
expect(User.search(user2.username.downcase).to_a).to eq([user2]) expect(described_class.search(user.name[0..2])).to eq([user])
expect(User.search(user1.username.downcase).to_a.size).to eq(2) end
expect(User.search(user2.username.downcase).to_a.size).to eq(1)
it 'returns users with a matching name regarding of the casing' do
expect(described_class.search(user.name.upcase)).to eq([user])
end
it 'returns users with a matching Email' do
expect(described_class.search(user.email)).to eq([user])
end
it 'returns users with a partially matching Email' do
expect(described_class.search(user.email[0..2])).to eq([user])
end
it 'returns users with a matching Email regarding of the casing' do
expect(described_class.search(user.email.upcase)).to eq([user])
end
it 'returns users with a matching username' do
expect(described_class.search(user.username)).to eq([user])
end
it 'returns users with a partially matching username' do
expect(described_class.search(user.username[0..2])).to eq([user])
end
it 'returns users with a matching username regarding of the casing' do
expect(described_class.search(user.username.upcase)).to eq([user])
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment