2017-10-10 61 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列表的末尾,它将位于内容的末尾,因此您可以快速剥离它并对其进行处理。

相关问题