我刚刚看了关于一个简单搜索表单的railscast,我想在我的应用程序中做一些类似的事情,但我不想只找到完全匹配的结果。
我有一个名为Project
的模型,具有以下字段:
- CCD_ 2
- CCD_ 3
keyword1
和keyword2
给定从railscast获取的代码:
models/project.rb
def self.search(search)
if search
find( :all, :conditions => ['name LIKE ?', "%#{search}%"] )
else
find(:all)
end
end
如果我想搜索"Pizza",并且我希望它能将一个名为"MasterPizza project"的项目与关键字1=>"MasterPiza"和关键字2=>"Pizzia"相匹配,我该如何重构上面的代码?
另外,区分大小写是个问题吗?
还有一个railscast,Ryan Bates谈到了利用Sphinx进行全文搜索。我强烈推荐这样一种方法,而不是从头开始:
http://railscasts.com/episodes/120-thinking-sphinx
您需要将查询拆分为多个原子,将每个原子作为单独的查询运行,然后合并每个原子的结果。
在这一点上,事情变得相当复杂,你最好使用一个搜索库,比如Acts as Indexed,它可以为你处理所有这些。
[披露]我是《索引行为》一书的作者。
查看Metasearch和Metawhere宝石。
我不太理解你的q,但我希望这有意义:
def self.search(search)
if search
where('title LIKE ? OR keyword1 LIKE ? OR keyword2 LIKE ?',"%#{search}%", "%#{search}%","%#{search}%")
# find(:all, :conditions => ['title LIKE ?', "%#{search}%"])
else
all
end
end