2010-11-07 43 views
2

我有一个模型,让我们来说两个字段:名称和主题 而且我希望用户可以在搜索框中键入“Maria chubbb”,应用程序应该返回每个记录来自搜索字符串(或%word%)的至少一个单词和它的单词可以在任何字段中。 如何实现这一目标?正在搜索至少一个单词(活跃记录)

回答

0

如果你想与普通的ActiveRecord/SQL做到这一点,你可以做这样的:

words = params[:query].split(' ') 
# => ["Maria", "chubbb"] 
conditions = words.collect {|word| "name LIKE ? OR subject LIKE ?"}.join(" OR ") 
# => "name LIKE ? OR subject LIKE ? OR name LIKE ? OR subject LIKE ?" 
values = words.collect {|word| ["%#{word}%", "%#{word}%"]}.sum 
# => ["%Maria%", "%Maria%", "%chubbb%", "%chubbb%"] 
YourModel.where([conditions] + values) 

以后,如果你想这样做“正确的”,使用搜索引擎,例如狮身人面像(由Ruby/Rails通过thinking_sphinx宝石连接)。然后在你的模型,你可以定义哪些字段在这样的搜索包括:

class YourModel < ActiveRecord::Base 
    define_index do 
    indexes :name 
    indexes :subject 
    end 
end 

然后你就可以搜索这样的:

YourModel.search("Maria chubbb") 

这样做的优点是,搜索速度快,即使在大数据库,并且结果可以被加权,例如如果两者匹配而只有一个词匹配。