Ruby on rails 3 Rails:根据名字和姓氏进行高效搜索

Ruby on rails 3 Rails:根据名字和姓氏进行高效搜索,ruby-on-rails-3,activerecord,indexing,Ruby On Rails 3,Activerecord,Indexing,我正在尝试创建一个“搜索框”,按名称匹配用户 困难在于用户既有名字又有姓氏。其中每个字段中都可以有空格(例如“Jon/Bon Jovi”或“Neil Patrick/Harris”),我想知道确保搜索在名字和姓氏字段的串联上进行的最有效的方法 用户列表相当大,因此性能是一个值得关注的问题。我可以在用户模型中添加一个“fullname”def,但我怀疑这不是最明智的行为。我对多列rails索引的了解很薄弱,但我怀疑有一种方法可以通过一个带有“”的索引来实现这一点 只是澄清一下,我不需要模糊匹配-只

我正在尝试创建一个“搜索框”,按名称匹配用户

困难在于用户既有名字又有姓氏。其中每个字段中都可以有空格(例如“Jon/Bon Jovi”或“Neil Patrick/Harris”),我想知道确保搜索在名字和姓氏字段的串联上进行的最有效的方法

用户列表相当大,因此性能是一个值得关注的问题。我可以在用户模型中添加一个“fullname”def,但我怀疑这不是最明智的行为。我对多列rails索引的了解很薄弱,但我怀疑有一种方法可以通过一个带有“”的索引来实现这一点

只是澄清一下,我不需要模糊匹配-只需要精确匹配就可以了…我只需要在两个字段的串联上运行它


干杯…

您可以在数据库中创建一个名为
full\u name
的具有常规索引的新字段,然后在保存/更新记录时使用回调来填充该字段:

before_save :populate_full_name

protected

def populate_full_name
  self.full_name = "#{first_name} #{last_name}"
end

如果您可以修改数据库,您可以并且应该使用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
当然,这种方法并不完美(它不大写名称,但可以在拆分后进行),而且可能在速度方面不是最优的,但它可以工作。您还可以重新打开
String
并在那里添加方法,这样您就可以使用
“Jon Bon Jovi”.name\u pairs

#> name_pairs("Jon Bon Jovi")
=> [["Jon", "Bon Jovi"], ["Jon", "Bon Jovi"]]
#> name_pairs("John Bongiovi")
=> [["John", "Bongiovi"]]
#> name_pairs("jonbonjovi")
=> nil