Use ILIKE/LIKE for searching users
This commit is contained in:
parent
508b6b46fe
commit
800aa29695
2 changed files with 51 additions and 11 deletions
|
@ -286,8 +286,22 @@ class User < ActiveRecord::Base
|
|||
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)
|
||||
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
|
||||
|
||||
def by_login(login)
|
||||
|
|
|
@ -463,17 +463,43 @@ describe User, models: true do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'search' do
|
||||
let(:user1) { create(:user, username: 'James', email: 'james@testing.com') }
|
||||
let(:user2) { create(:user, username: 'jameson', email: 'jameson@example.com') }
|
||||
describe '.search' do
|
||||
let(:user) { create(:user) }
|
||||
|
||||
it "should be case insensitive" do
|
||||
expect(User.search(user1.username.upcase).to_a).to eq([user1])
|
||||
expect(User.search(user1.username.downcase).to_a).to eq([user1])
|
||||
expect(User.search(user2.username.upcase).to_a).to eq([user2])
|
||||
expect(User.search(user2.username.downcase).to_a).to eq([user2])
|
||||
expect(User.search(user1.username.downcase).to_a.size).to eq(2)
|
||||
expect(User.search(user2.username.downcase).to_a.size).to eq(1)
|
||||
it 'returns users with a matching name' do
|
||||
expect(described_class.search(user.name)).to eq([user])
|
||||
end
|
||||
|
||||
it 'returns users with a partially matching name' do
|
||||
expect(described_class.search(user.name[0..2])).to eq([user])
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in a new issue