2016-07-27 8 views
1

Я использую камень поиска PG в приложении Rails. Скажем, я получаю множество статей в моем контроллере:Как фильтровать результаты по их ассоциациям при использовании драгоценных камней PG?

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

проблема с поиском PG здесь является то, что я получаю обратно массив, вместо того, чтобы объект AR. Так что теперь я не могу сделать что-то вроде

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

Потому что я получу

undefined method `where' for Array 

Теперь я могу сделать несколько запросов из этого одно действия, но то, что было бы лучшим решением этой проблемы?

ответ

1

Как насчет изменения цепочки?

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

EDIT:

Путь без 2 запросов будет:

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

Да, проблема в том, что мне нужно получить все результаты и фильтровать после факта. –

1

Вы, вероятно, следует определить область (или даже простой метод получения будет достаточно здесь) и использовать его:

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') } 
+0

Как это будет отличаться от статей = Article.search (params [: search]). With_pg_search_highlight; research_articles = Article.where (category: 'research'). search (params [: search]). with_pg_search_highlight –

+0

Это не будет, но может помочь DRY для 50 различных поисков. Плюс, цель более ясна. – mudasobwa