2012-09-13 65 views
0

我已经构建了一个基本的搜索功能,以便在我的数据库中搜索3个字段。 搜索功能如下:在Rails中搜索,也搜索非连续词

def self.search(search) 
    if search 
    @search_out = Array.new 
    @prod_out = find(:all, :conditions => ['name ILIKE ? or supplier_code ILIKE ? or ppd_code ILIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"]) 
     @prod_out.each do |prod| 
     prod.quantities.each do |quants| 
      @search_out << quants 
     end 
     end 
     return @search_out 
    else 
    nil 
    end 
end 

现在,它的工作都不错,但我想补充一点,可以说,我有我的数据库名称项,其是“杰克和吉尔电影”和“杰克和选项珍妮特电影“ 如果我在搜索字段中写道:”杰克电影“,它会返回我这两个条目。总体而言,能够在搜索字段中搜索单词并接收那些单词在其中不连续的条目。 谢谢!

回答

1

好吧,我实际上找到了一个非常简单的方法来做到这一点。

我在功能加入此之前,“发现”本身:

@arr = search.split(' ') 
@arr.collect! {|x| x + "%" } 
search = @arr.join 

这样,我加入这给通配符每个单词之间的“%”,所以现在我能找到该字AREN不一定是连续的,因为它们之间有一个通配符。

0

我建议你使用MySQL

的正则表达式功能
some_query.where("name REGEXP ?", "#{search.split(' ').join(".*")}") 

你显然需要在正则表达式中使用它之前过滤掉来自搜索字符串的正则表达式的特殊字符..

mysql documentation about it

+0

您可以使用Regexp.escape(搜索)来转义输入。 –

+0

感谢您的输入,我实际上使用PostgreSQL(因此ILIKE而不是LIKE),所以我会尝试寻找regexing在那 – Yarneo

0

有一些全功能的搜索引擎,如SolrSphinx,他们可以很容易地通过使用诸如之类的宝石集成到Rails应用程序中210和Thinking Sphinx。 Postgres也有一个内置的搜索引擎,所以它可能更容易设置。这是更强大的,但同时更复杂的解决方案。

如果您想对其中的每一个进行概述,Railscasts是一个很好的资源。