Browse Source

Support for lastnames with spaces in user autocompleters (#28154).

Patch by Gregor Schmidt.


git-svn-id: http://svn.redmine.org/redmine/trunk@17259 e93f8b46-1217-0410-a6f0-8f06a7374b81
tags/4.0.0
Go MAEDA 6 years ago
parent
commit
b4a703ce4e
2 changed files with 21 additions and 6 deletions
  1. 11
    6
      app/models/principal.rb
  2. 10
    0
      test/unit/principal_test.rb

+ 11
- 6
app/models/principal.rb View File

@@ -69,15 +69,20 @@ class Principal < ActiveRecord::Base
where({})
else
pattern = "%#{q}%"
sql = %w(login firstname lastname).map {|column| "LOWER(#{table_name}.#{column}) LIKE LOWER(:p)"}.join(" OR ")
sql = "LOWER(#{table_name}.login) LIKE LOWER(:p)"
sql << " OR #{table_name}.id IN (SELECT user_id FROM #{EmailAddress.table_name} WHERE LOWER(address) LIKE LOWER(:p))"
params = {:p => pattern}
if q =~ /^(.+)\s+(.+)$/
a, b = "#{$1}%", "#{$2}%"
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:a) AND LOWER(#{table_name}.lastname) LIKE LOWER(:b))"
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:b) AND LOWER(#{table_name}.lastname) LIKE LOWER(:a))"
params.merge!(:a => a, :b => b)

tokens = q.split(/\s+/).reject(&:blank?).map { |token| "%#{token}%" }
if tokens.present?
sql << ' OR ('
sql << tokens.map.with_index do |token, index|
params.merge!(:"token_#{index}" => token)
"(LOWER(#{table_name}.firstname) LIKE LOWER(:token_#{index}) OR LOWER(#{table_name}.lastname) LIKE LOWER(:token_#{index}))"
end.join(' AND ')
sql << ')'
end

where(sql, params)
end
}

+ 10
- 0
test/unit/principal_test.rb View File

@@ -127,6 +127,16 @@ class PrincipalTest < ActiveSupport::TestCase
assert_equal User.find(2), results.first
end

test "like scope should find lastname with spaces" do
user = User.find(1)
user.update_columns(:firstname => 'Leonardo', :lastname => 'da Vinci')

results = Principal.like('Leonardo da Vinci')

assert_equal 1, results.count
assert_equal user, results.first
end

def test_like_scope_with_cyrillic_name
user = User.generate!(:firstname => 'Соболев', :lastname => 'Денис')
results = Principal.like('Собо')

Loading…
Cancel
Save