Use ILIKE/LIKE for searching users
This commit is contained in:
parent
508b6b46fe
commit
800aa29695
|
@ -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
|
||||||
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 "should be case insensitive" do
|
it 'returns users with a matching name' do
|
||||||
expect(User.search(user1.username.upcase).to_a).to eq([user1])
|
expect(described_class.search(user.name)).to eq([user])
|
||||||
expect(User.search(user1.username.downcase).to_a).to eq([user1])
|
end
|
||||||
expect(User.search(user2.username.upcase).to_a).to eq([user2])
|
|
||||||
expect(User.search(user2.username.downcase).to_a).to eq([user2])
|
it 'returns users with a partially matching name' do
|
||||||
expect(User.search(user1.username.downcase).to_a.size).to eq(2)
|
expect(described_class.search(user.name[0..2])).to eq([user])
|
||||||
expect(User.search(user2.username.downcase).to_a.size).to eq(1)
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue