查询两列匹配字符串的数据

时间:2019-06-05 08:14:34

标签: mysql ruby-on-rails ruby

假设我的产品表有两列categoryname。 现在,用户可以通过productcategorynamecategory

查找name

例如,product拥有category计算机和name Dell。用户在搜索框“计算机”,“戴尔”或“戴尔计算机”或“戴尔计算机”中输入,都可以返回product

关于Activerecord查询的任何想法吗?

2 个答案:

答案 0 :(得分:2)

如果您使用的是mysql,则可以使用CONCAT加入categoryname,然后像往常一样进行LIKE查询

Product.where("LOWER(CONCAT(name, ' ', category)) LIKE :query OR LOWER(CONCAT(category, ' ', name)) LIKE :query", query: "%#{params[:query].downcase}%")

通过此查询,可以找到两种情况:Dell, Computer, Dell Computer or Computer Dell

答案 1 :(得分:0)

全文搜索确实是您使用案例所需要的。

您可能会考虑使用Elasticsearch,它非常容易通过Searchkick gem进行设置。

另一个不需要更复杂搜索索引的更复杂搜索的选择是Ransack gem

但是要回答您的特定问题,建议您在产品模型中定义一个类方法,该方法将搜索词转换为字符串数组,然后执行查找,例如:

def self.by_name_or_category(search)

  return None unless search.present?

  keywords = search.split(' ').map {|k| "%#{k}%" }

  where('name ilike any ( array[?] )', keywords)
    .or(Product.where('category ilike any ( array[?] )', keywords))

end