2012-03-05 298 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