使用 PG 搜索 gem 时如何按关联过滤结果?

How to filter results by their associations when using PG search gem?

我在 Rails 应用程序中使用 PG 搜索 gem。假设我在我的控制器中得到了一组文章:

@articles = Article.search(params[:search]).with_pg_search_highlight

此处 PG 搜索的问题是我返回的是一个数组,而不是 AR 对象。所以现在我不能做类似

的事情
@research_articles = @articles.where(category: 'research')

因为我会得到一个

undefined method `where' for Array

现在我可以从一个操作中提出多个查询,但是对于这个问题,什么是更好的解决方案?

换链呢?

@articles = Article.where(category: 'research').search(params[:search]).with_pg_search_highlight

编辑:

一种不进行 2 次查询的方法是:

@found_articles = Article.search(params[:search]).with_pg_search_highlight
@research_articles = @found_articles.select { |article| article.category == "research" }

您可能应该定义一个范围(或者甚至简单的 getter 就足够了)并重用它:

def simple_search
  pure = Article.search(params[:search])
  (block_given? ? yield(pure) : pure).with_pg_search_highlight
end

然后:

@articles = simple_search
@research_articles = simple_search { |ss| ss.where(category: 'research') }

pg_search gem 提供 pg_search_scope。

查看文档 https://github.com/Casecommons/pg_search#pg_search_scope

您还可以将 where 条件与 pg_search_scope 链接起来。