ruby-on-rails - 搜索查询(名称或名字)和(名称名称)和(名称名称)

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

我是 Rails 初学者,有一些问题需要改进我的搜索查询:

在 Controller 中我调用:

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查询该如何写呢?提前致谢!

最佳答案

此搜索方法应该适合您:

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
  • 此代码安全:在调用 SQL 之前清理字符串
  • 此代码非常灵活:您可以轻松添加更多列进行搜索
  • 此代码非常灵活:您可以轻松地在多个空间上进行分割(-/| 等)
  • 此代码可用于链范围界定
  • 此代码不区分大小写,适用于 John SmithJohN SMITh

如有需要,请随时提问!

关于ruby-on-rails - 搜索查询(名称或名字)和(名称名称)和(名称名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934616/

相关文章:

ruby-on-rails - 未定义方法 `destroy' 对于 nil :NilClass

sql - SQLite3::SQLException:Rails应用没有这样的表

javascript - 向 Rails 提交远程真实 form_for 并且不重定向

ruby-on-rails - 如何在 Rails 中打开 URL?

ruby - 当我生成进程时出现僵尸进程

ruby - 为什么我的 TERM 没有被捕获

ruby-on-rails - RSpec 请求规范发布一个空数组

ruby-on-rails - 在 CSS 中传递 ruby​​ 标签

ruby-on-rails - 在 Rails 3 中为所有具有缓存摘要的区域设置过期片段

ruby-on-rails-3 - 如何使用phonegap和devise完成登录(Rails)