2016-01-21 47 views
0

我想在我的rails應用程序中實現全文搜索。因此,我使用PostgreSQL作爲數據庫,使用PostgreSQL的全文搜索功能。我有兩個模型用戶和記分板,我想通過特定列搜索兩個模型來提取記錄。使用pg_search搜索多個模型

我正在使用pg_search gem進行全文搜索,我閱讀了multisearch文檔併成功實施了一切。我已經創建了pg_search_documents表。代碼如下。

記分板模型

include PgSearch 
    multisearchable :against => [:name_of_organization, :name_of_activity, :name_of_scoreboard] 

用戶模型

include PgSearch 
    multisearchable :against => :name 

控制器代碼

def index 
    @pg_search_documents = PgSearch.multisearch(params[:search]) 
end 

硒我在視圖中運行代碼<%= pg_search.searchable %>時拱起作用。當它們中的每一個都被搜索時,這將返回用戶和記分板OBJECTS。

查看代碼

<% @pg_search_documents.each do |pg_search| %> 
     <%= pg_search.searchable.name %> 
     <%= pg_search.searchable.name_of_organization %> 
<% end %> 

然而,當我嘗試運行上面給出的視圖代碼和搜索的名字,我會收到以下錯誤,

undefined method `name_of_scoreboard' for #<User:0x007fa44ad18cd8>. 

我得到一個當我嘗試搜索name_of_scoreboard時出現類似錯誤,

`undefined method `name' for #<Scoreboard:0x00000006fa3560>.` 

如果我在我的視圖<%= @pg_search_documents.searchable.id %>中使用以下代碼,則顯示用戶和記分板的ID。這意味着我只能對兩種模型中常見的列進行搜索。

如果我嘗試搜索兩個不同的列,如名稱和name_of_scoreboard,我會得到上面提到的兩個錯誤。我能夠在兩種不同的模型之間進行搜索,但我無法顯示視圖中的結果。我不知道我是否做錯了什麼,或者我錯過了一些重要的事情。我真的不確定。我試圖保持簡短並試圖包含相關信息。如果需要任何特定代碼,請告訴我。一如既往,任何幫助非常感謝!

回答

2

我認爲你正在混淆「搜索」並顯示結果中的一列 - 它看起來像你的代碼實際上是在多個模型中的不同字段中搜索。該搜索然後返回指向匹配對象的「文檔」數組。你遇到的問題是你試圖顯示沒有名字的對象的名稱。我認爲以下是你要做的事情。

<% @pg_search_documents.each do |pg_search| %> 
    <% if pg_search.searchable.respond_to?(:name) %> 
    <%= pg_search.searchable.name %> 
    <% else %> 
    <%= pg_search.searchable.name_of_organization %> 
    <% end %> 
<% end %> 

,將顯示的名稱,如果結果對象有一個名稱(即 - 如果它的用戶),否則該組織名稱(如果它的記分牌)。請注意,這不是一個很好的解決方案,因爲它現在將邏輯引入到視圖中,但它解釋了問題。

+0

@ Tom Walpole非常感謝,這絕對有效。我理解if和else的陳述。但是,你介意解釋代碼<%if pg_search.searchable.respond_to?(:name)%>。雖然,我可以通過閱讀代碼來理解代碼。我不完全理解它。此外,什麼是放置有關視圖的邏輯的最佳位置。我通常會將if和else語句放在視圖中。 – kpaul

+0

該代碼只是看到對象是否具有「名稱」方法 - 因爲記分板對象不會僅與用戶匹配。這比說'如果pg_search.searchable.is_a更靈活一點?用戶「,因爲如果你使用名稱方法將其他對象添加到結果中,它將繼續工作(請參閱鴨打字)。從視圖中刪除邏輯,讀取裝飾器模式,或者您可以爲每個結果渲染一個部分,這會隱藏部分渲染中的邏輯,因爲它將爲每種類型的結果對象使用不同的部分 - render @ pg_search_documents.to_a –

+0

@ Tom Walpole非常感謝你提供這樣一個詳細的答案。我非常感謝幫助。再次感謝!! – kpaul