Ruby on Rails Active Record - 使用IN条件使用多个参数进行搜索

时间:2017-01-29 21:13:50

标签: ruby-on-rails activerecord

我的数据结构如下:

User.first.department
=> "devops maintaining staff"

User.second.department
=> "facility staff"

我正在搜索搜索查询,使用单个多个参数进行搜索,例如:

  • 使用单个参数

    进行搜索
    "staff"                # which should return both users
    
  • 使用多个参数进行搜索

    "maintaining devops"   # which should return first user
    
  • 使用单个参数

    进行搜索
    "maintaining"          # which should return first user
    
  • 使用单个参数

    进行另一次搜索
    "facility"             # which should return second user
    

有没有任何有用的例子如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

基本上你要求的是子串匹配等声音。我的回答是“蛮力”#34;查询的风格,在实际使用中会很快变得脆弱/崩溃:

# keywords is an array of strings
def keyword_search(keywords)
  query = User

  keywords.each do |keyword|
    query = query.where('department like ?', "%#{keyword}%")
  end

  query.to_a
end

因此,对于您的示例,您将获得以下查询:

# Returns both users for "staff" 
SELECT "users".* FROM "users" WHERE (department like '%staff%')

# Returns first user for "maintaining devops"
SELECT "users".* FROM "users" WHERE (department like '%maintaining%') AND (department like '%devops%')

# Returns first user for "maintaining devops"
SELECT "users".* FROM "users" WHERE (department like '%maintaining%') 

# Returns first users for "facility"
SELECT "users".* FROM "users" WHERE (department like '%facility%') 

请注意,对于此类解决方案,它是AND查询,因此所有关键字都必须匹配才能获得结果。查询中的%符号会使查询略显模糊,因此对于%staff%,您可以获得以下匹配项:

  • staff
  • staffroom
  • flagstaffs
  • overstaff

如果你正在寻找更精确的匹配,你可以通过删除%来调整。

作为Eric suggested,任何比这更复杂的事情都需要更高级的解决方案。

就个人而言,我已经使用Solr/Websolr并且已经取得了很好的成功,但是查询和搜索调优需要花费一些时间来理解和实现。

答案 1 :(得分:1)

看起来您需要full-text search,这与数据库有关。

这是一个相关的question。对于更高级的内容,您可能需要查看sphinxthinking-sphinx