2015-03-11 2 views
0

У меня есть отношения между двумя моделями, Idea и Iteration. Каждая идея может иметь много итераций. Модели выглядят так:ThinkingSphinx - Поиск через has_many association

# idea.rb 
has_many :iterations, dependent: :destroy 

# I also use with: :real_time 
after_save ThinkingSphinx::RealTime.callback_for(:idea) 

# iteration.rb 
belongs_to :idea 
after_save ThinkingSphinx::RealTime.callback_for(:idea, [:idea]) 

Мои индексы для Idea выглядит следующим образом:

ThinkingSphinx::Index.define :idea, :with => :real_time do 
    [...] 
    indexes iterations.title, as: :iteration_titles 
    indexes iterations.description, as: :iteration_descriptions 
    has iterations.id, :as => :iteration_ids, type: :integer 
    [...] 
end 

И я ищу, как это:

@ideas = @user.ideas.search ThinkingSphinx::Query.escape(params[:search]), 
    :with => {:team_id => @teams.collect(&:id)}, 
    :page  => params[:page], 
    :per_page => 10, 
    :order => 'created_at DESC' 

В настоящее время в поисках либо Iteration названии или описании возвращает хиты. И я выполнил:

rake ts:rebuild 
rake ts:regenerate 
rake ts:index 

Я что-то пропустил?

ответ

1

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

И хотя iterations это метод экземпляра внутри idea, title, description и id не являются методами объекта, возвращаемого iterations.

Самый простой способ работы с этим состоит из двух частей. Во-первых, добавить методы экземпляра к идее, что возвращать данные, которые вы хотите для итерационных связанных полей и атрибутов:

def iteration_titles 
    iterations.collect(&:title).join(' ') 
end 

def iteration_descriptions 
    iterations.collect(&:description).join(' ') 
end 

def iteration_ids 
    iterations.collect &:id 
end 

А затем использовать эти методы в своем определении индекса:

indexes iteration_titles, iteration_descriptions 
has iteration_ids, :type => :integer, :multi => true 

И затем, запустите rake ts:regenerate, чтобы все было настроено (ts:rebuild и ts:index не имеют значения для индексов реального времени).

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