Если вы можете изменить базу данных , вы можете и должны использовать решение, предоставленное gjb.
Вот решение, которое не требует от вас изменения базы данных. Просто соберите все возможные пары имя / фамилия, которые вы можете получить из окна поиска. Какой-то код:
# this method returns an array of first/last name pairs given the string
# it returns nil when the string does not look like a proper name
# (i.e. "Foo Bar" or "Foo Bar Baz", but not "Foo" or "Foo "
def name_pairs(string)
return nil unless string =~ /^\w+(\s+\w+)+$/
words = string.split(/\s+/) # split on spaces
result = []
# in the line below: note that there is ... and .. in the ranges
1.upto(words.size-1) {|n| result << [words[0...n], words[n..-1]]}
result.collect {|f| f.collect {|nm| nm.join(" ")}}
end
Этот метод дает вам массив двухэлементных массивов, которые вы можете использовать для создания запроса or
. Вот как выглядит метод:
#> name_pairs("Jon Bon Jovi")
=> [["Jon", "Bon Jovi"], ["Jon", "Bon Jovi"]]
#> name_pairs("John Bongiovi")
=> [["John", "Bongiovi"]]
#> name_pairs("jonbonjovi")
=> nil
Конечно, этот метод не идеален (он не использует заглавные буквы, но вы можете сделать это после разбиения) и, вероятно, не оптимален с точки зрения скорости, но он работает. Вы также можете открыть String
и добавить туда метод, чтобы вы могли использовать "Jon Bon Jovi".name_pairs
.