【问题标题】:Search query multiple column with OR and AND to apply filter使用 OR 和 AND 搜索查询多列以应用过滤器
【发布时间】:2017-02-03 03:04:03
【问题描述】:

我正在开发一个应用程序。我试图植入一个搜索系统。方法很简单。在家里,我在 3 列“名称”或“nomdep”或“nomregion”上搜索查询。在此之后,我想使用 AND 运算符按参数进行过滤。

如果我只使用一列(例如“NAME”)植入搜索,我可以应用过滤器。但是,如果我想用一个以上的 OR 植入它,我就不能应用过滤器。我认为 OR 运算符是问题所在。但可以肯定的是,我不知道如何解决这个问题......

你能帮帮我吗?谢谢

露营.rb

has_many :caracteristiquetests, :foreign_key => :camping_id
has_many :situations, :foreign_key => :camping_id

    def self.searchi(query, handicap, animaux, television, plage, etang, lac)
       return scoped unless query.present?
       left_outer_joins(:caracteristiquetests, :situations).where(['nomdep LIKE ? OR name LIKE ? OR nomregion LIKE ? AND handicap LIKE ? AND animaux LIKE ? AND television LIKE ? AND plage LIKE ? AND etang LIKE ? AND lac LIKE ?', "%#{query}%", "%#{query}%", "%#{query}%", "%#{handicap}%", "%#{animaux}%", "%#{television}%", "%#{plage}%", "%#{etang}%", "%#{lac}%"])
    end

camping_controller.rb

      def resultnohome
        if params[:query].blank?
          redirect_to action: :index and return
        else
          @campings = Camping.searchi(params[:query], params[:handicap], params[:animaux], params[:television], params[:plage], params[:etang], params[:lac])
        end
end

性格测试.rb

belongs_to :camping

情况.rb

belongs_to :camping

编辑

我编辑了我的模型以添加“()”

露营.rb

def self.searchi(query, handicap, animaux, television, plage, etang, lac)
   return scoped unless query.present?
   left_outer_joins(:caracteristiquetests, :situations).where(['(nomdep LIKE ? OR name LIKE ? OR nomregion LIKE ?) AND handicap LIKE ? AND animaux LIKE ? AND television LIKE ? AND plage LIKE ? AND etang LIKE ? AND lac LIKE ?', "%#{query}%", "%#{query}%", "%#{query}%", "%#{handicap}%", "%#{animaux}%", "%#{television}%", "%#{plage}%", "%#{etang}%", "%#{lac}%"])
end

不幸的是,我得到了意想不到的结果:只显示一个结果,第一个匹配项如“短路评估”。任何想法为什么?

【问题讨论】:

    标签: ruby-on-rails sqlite search conditional-statements where


    【解决方案1】:

    只需在or 条件周围使用括号,or 条件的结果将与and 条件组合。

    left_outer_joins(:caracteristiquetests, :situations).where(['(nomdep LIKE ? OR name LIKE ? OR nomregion LIKE ?) AND handicap LIKE ? AND animaux LIKE ? AND television LIKE ? AND plage LIKE ? AND etang LIKE ? AND lac LIKE ?', "%#{query}%", "%#{query}%", "%#{query}%", "%#{handicap}%", "%#{animaux}%", "%#{television}%", "%#{plage}%", "%#{etang}%", "%#{lac}%"])
    

    或者,您可以将其拆分为单独的where 语句,当您检索结果时,这些语句将合并为一个 SQL 调用。这将更易于阅读和维护,并且不会在未提供值的情况下进行任何调用。

    result = left_outer_joins(:caracteristiquetests, :situations).where('nomdep LIKE ? OR name LIKE ? OR nomregion LIKE ?', "%#{query}%", "%#{query}%", "%#{query}%")
    result = result.where('handicap LIKE ?', "%#{handicap}%") if handicap
    result = result.where('animaux LIKE ?', "%#{animaux}%") if animaux
    result = result.where('television LIKE ?', "%#{television}%") if television
    result = result.where('plage LIKE ?', "%#{plage}%") if plage
    result = result.where('etang LIKE ?', "%#{etang}%") if etange
    result = result.where('lac LIKE ?', "%#{lac}%") if lac
    return result
    

    【讨论】:

    • 不幸的是我也有同样的问题。该查询不适用于过滤器......
    • 那么“无法应用过滤器”是什么意思……您是遇到错误还是遇到意外结果或什么?
    • 当我像这样localhost:3000/resultnohome?utf8=%E2%9C%93&query=alsace 添加我的查询时,只找到一个结果。但通常有 100 多个结果与此查询匹配。如果我应用过滤器localhost:3000/… 相同的结果只有一个......第一个。供您参考,阿尔萨斯是法国地区 (nomregion)
    • 这真的很奇怪......就像他击中第一个结果时停止,我不显示所有结果,只显示第一个匹配。您对此有何看法?
    • 能否请您出示更新后的left_outer_joins
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多