Thinking Sphinx поиск по всему приложению: фильтрация по атрибуту, который существует только в некоторых моделях - PullRequest
3 голосов
/ 06 ноября 2010

Я хочу выполнить поиск по нескольким моделям и выполнить фильтрацию по определенному атрибуту, который есть у некоторых моделей, а у некоторых - нет. Я хочу, чтобы модели с атрибутом были отфильтрованы, но модели без него просто игнорировали его.

В настоящее время только модели с атрибутом будут возвращать результаты. Есть ли способ заставить другие модели возвращать результаты, игнорируя фильтр атрибутов?

Ответы [ 2 ]

5 голосов
/ 06 ноября 2010

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

has "0", :type => :integer, :as => :the_attribute_name

Тогда при выполнении поиска по всему приложению:

@results = ThinkingSphinx.search(@search_term, 
  :with => {:the_attribute_name => [@the_attribute_value, 0]}
)

Кстати, это предполагает, что нулевое значение недопустимо в моделях, которые имеют этот атрибут. Если ноль является допустимым атрибутом в этой модели, то можно использовать другое значение (например, 9999999). Имейте в виду, что атрибуты не могут принимать отрицательные целые числа.

0 голосов
/ 26 июня 2015

Я должен был сделать это за default_sphinx_scope, а приложение было слишком большим, я не мог проверить каждую модель и сделать это для тех, у кого нет атрибута.Поэтому я сделал это следующим образом:

class User

  ...

  sphinx_scope(:active_only) do
    if self.respond_to?(:status)
      {:with => {:status => true}}
    else
      {}
    end
  end
  default_sphinx_scope(:active_only)

  ...
end

Применял scope только при наличии столбца status.Приветствия.

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