Patch #28154 » 0001-Support-multi-word-last-names-in-Principal-like-and-.patch
app/models/principal.rb | ||
---|---|---|
69 | 69 |
where({}) |
70 | 70 |
else |
71 | 71 |
pattern = "%#{q}%" |
72 |
sql = %w(login firstname lastname).map {|column| "LOWER(#{table_name}.#{column}) LIKE LOWER(:p)"}.join(" OR ")
|
|
72 |
sql = "LOWER(#{table_name}.login) LIKE LOWER(:p)"
|
|
73 | 73 |
sql << " OR #{table_name}.id IN (SELECT user_id FROM #{EmailAddress.table_name} WHERE LOWER(address) LIKE LOWER(:p))" |
74 | 74 |
params = {:p => pattern} |
75 |
if q =~ /^(.+)\s+(.+)$/ |
|
76 |
a, b = "#{$1}%", "#{$2}%" |
|
77 |
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:a) AND LOWER(#{table_name}.lastname) LIKE LOWER(:b))" |
|
78 |
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:b) AND LOWER(#{table_name}.lastname) LIKE LOWER(:a))" |
|
79 |
params.merge!(:a => a, :b => b) |
|
75 | ||
76 |
tokens = q.split(/\s+/).reject(&:blank?).map { |token| "%#{token}%" } |
|
77 |
if tokens.present? |
|
78 |
sql << ' OR (' |
|
79 |
sql << tokens.map.with_index do |token, index| |
|
80 |
params.merge!(:"token_#{index}" => token) |
|
81 |
"(LOWER(#{table_name}.firstname) LIKE LOWER(:token_#{index}) OR LOWER(#{table_name}.lastname) LIKE LOWER(:token_#{index}))" |
|
82 |
end.join(' AND ') |
|
83 |
sql << ')' |
|
80 | 84 |
end |
85 | ||
81 | 86 |
where(sql, params) |
82 | 87 |
end |
83 | 88 |
} |
test/unit/principal_test.rb | ||
---|---|---|
127 | 127 |
assert_equal User.find(2), results.first |
128 | 128 |
end |
129 | 129 | |
130 |
test "like scope should find lastname with spaces" do |
|
131 |
user = User.find(1) |
|
132 |
user.update_columns(:firstname => 'Leonardo', :lastname => 'da Vinci') |
|
133 | ||
134 |
results = Principal.like('Leonardo da Vinci') |
|
135 | ||
136 |
assert_equal 1, results.count |
|
137 |
assert_equal user, results.first |
|
138 |
end |
|
139 | ||
130 | 140 |
def test_like_scope_with_cyrillic_name |
131 | 141 |
user = User.generate!(:firstname => 'Соболев', :lastname => 'Денис') |
132 | 142 |
results = Principal.like('Собо') |