【问题标题】:Rails- Dynamic search on multiple fieldsRails-在多个字段上动态搜索
【发布时间】:2018-03-21 13:14:03
【问题描述】:

我正在尝试编写一个关注点以允许搜索来自不同模型的多个字段。我想插入一个 search_fields 数组并使用 params[:query] 值生成一个 where OR 查询,如下所示:

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

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

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 方法。我无论如何都做不到,有什么想法可以做到吗?

感谢所有回答

【问题讨论】:

  • 嗨@lilith-m,你为什么不能以任何方式(生成查询)?你能告诉我这个问题吗?
  • 据我了解,您希望从多个使用 LIKE 但不同模型不同的表中进行 SELECT 查询,即使在 sql 语法中也可以检索来自不同模型的记录而不加入表格?我认为如果列在同一张表上,它会起作用,但如果你只使用上面的查询而不加入,它会抛出数据库中的列未定义(不存在)异常。如果你想这样做,试试类似的东西this,希望对您有所帮助。
  • rails 5 支持or
  • 很抱歉我的问题没有正确形成(我的英语太糟糕了)我将使用助手从多个模型中调用,所以它应该是动态的。我将得到一个表 [col1, col2] 的列名数组并生成这样的行:where("LOWER(col1) LIKE LOWER(?) OR LOWER(col2) LIKE LOWER(?)", "%#{params[:query]}%", "%#{params[:query]}%") 使用 Rails5 或方法我可以做到这一点(它有效)@scope = @scope.where("LOWER(col1) LIKE LOWER(?)", "%#{params[:query]}%").or(@scope.where("LOWER(col2) LIKE LOWER(?)", "%#{params[:query]}%")) 但如何动态做到这一点?

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


【解决方案1】:

找到了!

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)

它会生成以下 where 字符串:

WHERE (LOWER(title) LIKE LOWER('%searchquery%') OR LOWER(user_name) LIKE LOWER('%searchquery%'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 2012-07-19
    • 2011-09-14
    • 2013-12-17
    • 1970-01-01
    • 2012-02-12
    • 2011-09-17
    • 2013-03-02
    相关资源
    最近更新 更多