使用OR和AND搜索多个列以应用filter

我正在开发一款应用。 我试图植入一个搜索系统。 方法很简单。 在家里,我在3栏“name”或“nomdep”或“nomregion”上搜索查询。 在此之后,我想用AND运算符用params过滤。

如果我只使用一列植入搜索,例如“NAME”,那么我可以应用filter。 但如果我想用多个OR植入这个,我不能应用filter。 我认为OR运算符是问题所在。 但我肯定不知道要解决这个问题……

你能帮助我吗 ? 谢谢

camping.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 

caracteristiquetest.rb

 belongs_to :camping 

situation.rb

 belongs_to :camping 

编辑

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

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 

Unfornutualy,我得到意想不到的结果:只显示一个结果,第一个匹配像“短路评估”。 有什么想法吗?

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

 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