如果您可以修改數據庫,您可以也應該使用由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
。