Ruby on rails 在单个搜索列中同时搜索两列

Ruby on rails 在单个搜索列中同时搜索两列,ruby-on-rails,ruby,filterrific,Ruby On Rails,Ruby,Filterrific,我在我的rails应用程序中使用FilterRig gem向索引列表添加过滤器。我有一个用户表,字段为firstname、lastname和middlename。我试图做的是在单个搜索列中搜索所有这些列。我面临的问题是: 当我搜索Jimmy时,我会得到所有Jimmy的名字、姓氏和中间名列表。但是当我尝试搜索特定的吉米·威尔逊时,它不起作用。它仍然只是显示Jimmys而不是特定的Jimmy Wilson。请帮我找到问题所在 user.rb scope :search_name, lambda {

我在我的rails应用程序中使用FilterRig gem向索引列表添加过滤器。我有一个用户表,字段为firstname、lastname和middlename。我试图做的是在单个搜索列中搜索所有这些列。我面临的问题是: 当我搜索Jimmy时,我会得到所有Jimmy的名字、姓氏和中间名列表。但是当我尝试搜索特定的吉米·威尔逊时,它不起作用。它仍然只是显示Jimmys而不是特定的Jimmy Wilson。请帮我找到问题所在

user.rb

scope :search_name, lambda { |query|
    return nil  if query.blank?

    terms = query.downcase.split(/\s+/)

    terms = terms.map { |e|
      ('%' + e + '%').gsub(/%+/, '%')
    }

    num_or_conds = 3
    where(
      terms.map { |term|
        "(LOWER(users.lastname) LIKE ?) OR (LOWER(users.firstname) LIKE ?) OR (LOWER(users.middlename) LIKE ?)"
      }.join(' AND '),
      *terms.map { |e| [e] * num_or_conds }.flatten
    )
  } 

的优先级高于
,因此您必须更改添加括号的位置:

where(
  terms.map { |term|
    "(LOWER(users.lastname) LIKE ? OR LOWER(users.firstname) LIKE ? OR LOWER(users.middlename) LIKE ?)"
  }.join(' AND '),
  *terms.map { |e| [e] * num_or_conds }.flatten
)