Объедините несколько pg_search_scope и проследите, какой из них даст ответ - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть несколько pg_search_scope с разными порогами, и я хотел бы вызвать это в контроллере, который будет возвращать результат из таких областей, но я хотел бы знать, какой из этих pg_search_scope вернул результат. Любые советы о том, как это сделать? Я думал иметь:

(Article.pg_scope1(params[:query])+
Article.pg_scope2(params[:query])+
Article.pg_scope3(params[:query])).first

Но это не скажет мне, кто из них вернул ответ.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Я не нашел способов получить имя области напрямую из области видимости. Итак, я думаю, что самый простой способ решить вашу проблему:

(
  [
    {scope_name: :first, data: Article.pg_scope1(params[:query])}, 
    {scope_name: :second, data: Article.pg_scope2(params[:query])}, 
    {scope_name: :third, data: Article.pg_scope3(params[:query])} 
  ]
).find { |scope| scope[:data].present? }

В этом случае вы получите один из хэшей с именем scope_name с данными внутри, например

=> {scope_name: :second, data: Article.pg_scope2(params[:query])}

или Вы можете использовать массив внутри массива

result = (
 [
   [:first, Article.pg_scope1(params[:query])],
   [:second, Article.pg_scope2(params[:query])],
   [:third, Article.pg_scope3(params[:query])],
 ].find {|scope| scope[1].present? }
)

и получить доступ к данным результата, вызвав result[1], а имя_области - result[0]

0 голосов
/ 21 апреля 2020

В то же время, когда я разместил свой вопрос, я придумаю решение, которое немного запутанно, но может выполнять и эту работу.

queries = {
  "scope1": Article.pg_scope1(params[:query]),
  "scope2": Article.pg_scope2(params[:query]),
  "scope3": Article.pg_scope3(params[:query])
}

engines_with_content=queries.reject{|k,v| v.empty?}.keys

Затем, чтобы получить результаты, которые я могу сделать queries[engines_with_content.first] для доступа к ActiveRecord::Relation

I * sh был способ распараллелить запросы безопасным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...