搜索(名称或名称)和(名称forname)和(forname名称)的查询

时间:2013-11-12 16:30:56

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我在rails中初学者并且在改进我的搜索查询方面遇到了一些问题:

在控制器中我打电话:

def index
 if params[:search]
  @persons = Person.search(params[:search]).order("created_at DESC")
 else
  @persons = Person.order("created_at DESC")
 end
end

在模型中我有:

 def self.search(query)
  where("name like ?", "%#{query}%")
 end

所以实际上我只过滤名字!现在我试图改进它,但它没有解决我喜欢它的方式,我的目标是用户可以输入例如:

 John
 Smith
 Smith John
 John Smith

并始终返回John Smith。那我怎么写这么长的SQL查询?提前谢谢!

3 个答案:

答案 0 :(得分:2)

此搜索方法适用于您:

def self.search(query)
  return where('FALSE') if query.blank?

  conditions = []
  search_columns = [ :vorname, :nachname ]

  query.split(' ').each do |word|
    search_columns.each do |column|
      conditions << " lower(#{column}) LIKE lower(#{sanitize("%#{word}%")}) "
    end
  end

  conditions = conditions.join('OR')    
  self.where(conditions)
end
  • 此代码是安全的sanitizes调用SQL之前的字符串
  • 此代码非常灵活:您可以非常轻松地添加更多列以进行搜索
  • 此代码非常灵活:您可以轻松拆分空间(- / |等)
  • 此代码可用于链式范围
  • 此代码不区分大小写,适用于John SmithJohN SMITh

如果需要,请随时提出问题!

答案 1 :(得分:0)

做这样的事情怎么样?

def self.search(query)
  where("name LIKE ? or forename LIKE ? or concat(name, ', ', forename) LIKE ?", "%#{query}%", "%#{query}%" , "%#{query}%")
end

如果您的搜索查询变得非常复杂,您可能需要查看搜索宝石,例如elasticsearch

答案 2 :(得分:0)

您拥有的内容应适用于以下搜索查询

John
Smith
John Smith

如果您希望它也适用于反向搜索查询,请执行以下操作

def self.search(query)
  name_parts = query.split(' ')
  condition = name_parts.collect{|part| "name like #{sanitize("%#{part}%")}"}.join(' AND ')
  where(condition)
 end