2015-07-28 2 views
0

Не могли бы вы помочь мне в мышлении сфинкса?Мышление Сфинкса имеет много сквозных рельсов

Отношения:

Континент has_many: страны has_many: country_reports, через:: страны,: CLASS_NAME => "Отчет" has_many: издатели, через:: country_reports

Ожидаемый выход:

Я хочу найти Continent.first.publishers

Пожалуйста, расскажите мне, как написать это в мышлении sphinx rails

ответ

1

Как я ответил на Thinking группы Sphinx Google:

Потому что вы ищете на издателей, это индекс Publisher вам нужно изменить, чтобы получить эту работу. Я предполагаю, что издатель принадлежит_to: country_report, country report принадлежит_to: страна и страна принадлежит_to: континент.

Если вы используете индексы SQL спинками (с использованием: с =>: вариант active_record), то вы хотите, следующие в индексе Издательство:

has country_report.country.continent_id, :as => :continent_id 

Если вы используете реальный -Времени индексы (: с =>: real_time), то это то же самое, но вы должны указать тип, а также:

has country_report.country.continent_id, :as => :continent_id, :type => :integer 

Однако, если есть has_many или has_and_belongs_to_many вместо belongs_to в этой цепочке ассоциаций из издателя на континент, то это немного сложнее. Кроме того, в этом случае у издателя может быть более одного континента, поэтому здесь мы имеем дело с несколькими значениями.

Для индексов SQL спинок, незначительные изменения, изменять ассоциации цепочки:

has country_reports.country.continent_id, :as => :continent_ids 

Но с индексом в реальное время, то лучше иметь метод на модели Publisher, которая возвращает нужное значение или значения, а затем использовать его в индексе:

# in app/models/publisher.rb 
def continent_ids 
    country_reports.collect(&:country).collect(&:continent_id) 
end 

# in app/indices/publisher_index.rb 
has continent_ids, :type => :integer, :multi => true 

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

Publisher.search “foo”, :with => {:continent_id => continent.id} 

Это может работы, а также (множественные уровни ассоциаций могут запутать, хотя):

continent.publishers.search “foo” 
Смежные вопросы