假设我的产品表有两列category
和name
。
现在,用户可以通过product
或category
或name
和category
name
例如,product
拥有category
计算机和name
Dell。用户在搜索框“计算机”,“戴尔”或“戴尔计算机”或“戴尔计算机”中输入,都可以返回product
关于Activerecord
查询的任何想法吗?
答案 0 :(得分:2)
如果您使用的是mysql
,则可以使用CONCAT
加入category
和name
,然后像往常一样进行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