我想在我的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,我會得到上面提到的兩個錯誤。我能夠在兩種不同的模型之間進行搜索,但我無法顯示視圖中的結果。我不知道我是否做錯了什麼,或者我錯過了一些重要的事情。我真的不確定。我試圖保持簡短並試圖包含相關信息。如果需要任何特定代碼,請告訴我。一如既往,任何幫助非常感謝!
@ Tom Walpole非常感謝,這絕對有效。我理解if和else的陳述。但是,你介意解釋代碼<%if pg_search.searchable.respond_to?(:name)%>。雖然,我可以通過閱讀代碼來理解代碼。我不完全理解它。此外,什麼是放置有關視圖的邏輯的最佳位置。我通常會將if和else語句放在視圖中。 – kpaul
該代碼只是看到對象是否具有「名稱」方法 - 因爲記分板對象不會僅與用戶匹配。這比說'如果pg_search.searchable.is_a更靈活一點?用戶「,因爲如果你使用名稱方法將其他對象添加到結果中,它將繼續工作(請參閱鴨打字)。從視圖中刪除邏輯,讀取裝飾器模式,或者您可以爲每個結果渲染一個部分,這會隱藏部分渲染中的邏輯,因爲它將爲每種類型的結果對象使用不同的部分 - render @ pg_search_documents.to_a –
@ Tom Walpole非常感謝你提供這樣一個詳細的答案。我非常感謝幫助。再次感謝!! – kpaul