Rails-在多个字段上进行动态搜索

时间:2018-03-21 13:14:04

标签: sql ruby-on-rails activerecord where-clause

我试图写一个问题,允许搜索来自不同模型的多个字段。我想插入一个search_fields数组并使用params [:query]值生成一个OR查询,如下所示:

scope = scope.where("LOWER(user_name) LIKE LOWER(?)", "%#{params[:query]}%")

它适用于一个值,但我需要接收一个列名称数组(对于不同的模型不同)并生成一个这样的地方或查询(例如两个项目的数组):

search_fields = ["title", "user_name"]

where("LOWER(title) LIKE LOWER(?) OR LOWER(user_name) LIKE LOWER(?)", "%#{params[:query]}%", "%#{params[:query]}%")

我生成如下查询:

query = search_fields.map do |s|
  "LOWER(#{s}) LIKE LOWER(?)"
end.join(' OR ')

似乎没有实现where_or方法。我无论如何都做不到,有什么想法可以做到吗?

感谢所有答案

1 个答案:

答案 0 :(得分:0)

发现它!

select L.ID1,L.ID2
from Likes L
where (L.ID1||L.ID2) = (L.ID2||L.ID1);

它生成以下字符串:

search_fields = ["title", "user_name"]

query_param = sprintf("%%%s%%", params[:query])
search = search_fields.map do |field|
  query_string = "LOWER(#{field}) LIKE LOWER(?)"
end.join(' OR ')
@scope = @scope.where(search, *[query_param] * search_fields.count)