2015-03-31 4 views
0

В моей Rails 4 приложения У меня есть модели, как:Rails 4 - Thinking Sphinx фильтр, используя поля на соответствующей модели

has_many :group_agencies 
has_many :agencies, :through => :group_agencies 

Где держать 'токенов' поле

'AgencyGroup'

' Агентство»модель

has_many :group_agencies 
    has_many :agency_groups, :through => :group_agencies 
    has_many :advertisements 

'Реклама' модель

belongs_to :agency 

Я использую Thinking Sphinx, и он работает очень славным, но теперь у меня появилось новое требование фильтровать «Объявления» по маркерным полям AgentGroup.

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

if params[:search] 
@results = Advertisement.search Riddle::Query.escape(params[:search]), :star => true, :page => params[:page], :per_page => 6 
end 

Чтобы получить результаты, которые я запустить HTTP запрос, как это:

http://api.localhost.local:3000/v1/advertisements?token=JHW_tdXn5g-vQY1f_ZzLuw&search=Nissim 

Что мне не хватает? Как использовать соотношение между моделями в TS?

ответ

0

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

Шаг 1: Добавить AgencyGroup идентификаторов в качестве атрибута в индексе рекламы. Если вы используете SQL спинок индексов (:with => :active_record), это один вкладыш:

has agency.group_agencies.agency_group.id, :as => :agency_group_ids 

Если вы используете индексы в реальное время, то вы хотите метод в рекламе, которая возвращает все те идентификаторы:

def agency_group_ids 
    agency.agency_group_ids 
end 

И ваше определение атрибута будет выглядеть следующим образом:

has agency_group_ids, :type => :integer, :multi => true 

Шаг 2: Потому что вы изменили структуру индекса , Не забудьте восстановить свои показатели:

# for SQL-backed indices: 
rake ts:rebuild 
# or, for real-time indices 
rake ts:regenerate 

Шаг 3: В контроллере, найдите группу агентства для данных маркеров:

agency_group = AgencyGroup.find_by :token => params[:token] 

Шаг 4: Наконец, использования этот идентификатор группы агент в вашем запросе:

@results = Advertisement.search Riddle::Query.escape(params[:search]), 
    :star  => true, 
    :page  => params[:page], 
    :per_page => 6, 
    :with  => {:agency_group_ids => agency_group.id} 
+0

Отлично! Работает отлично. Большое спасибо за ваш ответ. Чистое и простое решение. Отлично. – rolkos

Смежные вопросы