我在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查询?提前谢谢!
答案 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 Smith
或JohN 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