2012-03-05 235 views
0

我目前有一个基本的搜索,可以让我输入一个单词,它会返回所有类似搜索的记录。据如下:多关键字搜索

application.html.erb

 <%= form_tag games_path, :method => 'get' do %> 
      <%= hidden_field_tag :direction, params[:direction] %> 
      <%= hidden_field_tag :sort, params[:sort] %> 
      <%= text_field_tag :search, params[:search] %> 
     <%= submit_tag t('.searchb'), :game_name => nil %> 
     <% end %> 

控制器和模型

 @games = Game.search(params[:search]) 

    def self.search(search) 
    search = search.to_s.strip.split 
    search.inject(scoped) do |combined_scope, search| 
    combined_scope.where(['game_name LIKE ? OR genre LIKE ? OR console LIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"]) 
    end 
    end 

我现在想,虽然做的是在搜索栏输入多个单词的能力并让它将所有相关记录归还给那些单词,而不是包含所有相关记录。

例如如果我输入格斗,动作

我想让它返回所有格斗游戏和所有动作游戏。

我该如何去实施这个? 型号:

编辑

回答

1

你应该使用像Sphinx这样的全文搜索引擎!有一个叫做thinking-sphinx的宝石,它提供了ruby和Sphinx服务器之间的接口!唯一的缺点是您需要定期更新数据库。它不支持实时更新。

+0

我希望有一个不使用宝石的选项:/我觉得编写代码更好,因为它可以让我更好地理解rails吗?我已经用我的模型部分更新了上述内容(附在控制器行下)如果我键入的单词很好,但如果我键入两个单词,它会尝试查找包含两个单词的记录,而不是全部记录。 – user1222136 2012-03-05 21:25:24

+0

因为你可以使用MySQL函数http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html来实现你自己的全文搜索,但那不是ruby的方式。如果你知道宝石的用途,使用宝石并不坏。狮身人面像是一个filltext搜索deamon,思维狮身人面像是一个使用这个守护进程的界面。你可以阅读更多关于他们两个。我没有看到写作自己的搜索机制有任何意义! – davidb 2012-03-06 12:26:11

0

你必须采取的关键词,环它们,并创建查询来实现这一目标。您可以使用注入来简化操作。 This可能会有所帮助。

+0

嘿,我已经展示了我现在在模型中的内容(顶线来自控制器),我已经完成了这项工作,例如,如果输入'border'它将返回关联的游戏,但如果我输入'border good '(两个游戏名称),那么它不会返回任何记录。任何想法? – user1222136 2012-03-05 14:19:33