2017-10-10 63 views
0

我有一個多用戶網站,我希望用戶能夠以全文多模式搜索只有自己的內容。自定義pg_search只顯示當前用戶的內容

我的工作模型belongs_to :: users。下面是work.rb的一個片段:

class Work < ApplicationRecord 
    include PgSearch 
    belongs_to :user 
    … 

理想的情況是這樣的事情在我的控制器:

@results = PgSearch.multisearch('spring').where(:_user_id => current_user.id) 

我能夠很容易地做到這一點使用Searchkick寶石與Elasticsearch通過使用此代碼行:

@results = Searchkick.search query, where: {user_id: current_user.id} 

不幸的是我不能使用Elasticsearch。

如何在pg_search中實現類似的功能?

非常感謝

回答

0

您可以按照您的情況pg_search_scope

描述使用pg_search_scope是pg_search_scope multi-search

+0

我試過類似的方法,它已經使用了:if屬性。問題是我需要從我的模型中調用current_user。儘管你不應該這樣做,但我設法使用自定義模塊來獲取模型中的current_user對象,但它破壞了搜索索引功能。 'multisearchable:against => [:title,:year,:user_id],:if => lambda {| record | record.user_id == Current.user.id}' 也許你有更好的方式在模型中做到這一點? 再次感謝 – Dauncing

+0

我有一個解決方法,但我認爲它不會在規模上表現良好。以下代碼可以加載到搜索控制器'results = PgSearch.multisearch(query).map(&:searchable).select {| record | record.user_id == current_user.id} .sort_by(&sortField.to_sym)'如果有人可以提出建議,會喜歡更優雅的解決方案。 – Dauncing

0

我剛開始用PgSearch工作,但根據我所看到的,你可以只對應將哪些數據發送到其數據庫pg_search_documents中應用過濾器。所以你不能在特定的用戶中隔離你以後做的搜索。他們只是將各個領域連接到他們的內容領域,並引用他們來自的模型和記錄。這樣可以方便地進行搜索以查找符合條件的記錄,但是您必須後處理數據。

要做你正在建議的內容,需要爲每個用戶創建一個搜索表。

如果您將user_id包含在違反條件(應該位於內容中)中,那麼您可以快速處理數據,因爲ID將位於內容中。如果它位於:against列表的末尾,它將位於內容的末尾,因此您可以快速剝離它並對其進行處理。

相關問題