Sunspot / Solr / Rails: ассоциации моделей не обновляются в индексе - PullRequest
5 голосов
/ 15 ноября 2011

В моем приложении есть модель Fieldnote, которая has_many: действия, связанные с ней через таблицу с именем fieldnote_activities.Затем я определяю поисковый индекс следующим образом:

searchable :auto_index => true, :auto_remove => true do
  integer :id
  integer :user_id, :references => User

  integer :activity_ids, :multiple => true do
    activities.map(&:id)
  end

  text :observations
 end

И затем у меня есть модель поиска для хранения / обновления результатов поиска.Таким образом, поисковая модель также имеет свои ассоциации с деятельностью.Затем я выполняю поиск следующим образом:

@search = Search.find(params[:id])
@query  = Fieldnote.search do |query|
  query.keywords  @search.terms

  if @search.activities.map(&:id).empty? == false
    query.with    :activity_ids, @search.activities.map(&:id)
  end

end
@fieldnotes = @query.results

Теперь все это работает ОТЛИЧНО.Проблема заключается в том, что если я изменю действия, связанные с полевой заметкой, результаты поиска не изменятся, поскольку, по-видимому, индексы для этой полевой заметки не изменятся.У меня сложилось впечатление, что флаги: auto_index => true и: auto_remove => true при определении индекса с возможностью поиска будут отслеживать новые ассоциации (или удаленные ассоциации), но, похоже, это не так.Как мне это исправить?

1 Ответ

9 голосов
/ 15 ноября 2011

Вы правы, что :auto_index и :auto_remove не применяются к связанным объектам, только к объекту searchable, на котором они указаны.

При денормализации вы должны использовать after_save перехватчики на связанных объектах для запуска переиндексации, где это необходимо. В этом случае вы хотите внести изменения в Activity модель и FieldnoteActivity модель соединения, чтобы инициировать переиндексирование связанных с ними Fieldnote объектов при сохранении или уничтожении.

class Fieldnote
  has_many :fieldnote_activities
  has_many :activities, :through => :fieldnote_activities

  searchable do
    # index denormalized data from activities
  end
end

class FieldnoteActivity
  has_many :fieldnotes
  has_many :activities

  after_save :reindex_fieldnotes
  before_destroy :reindex_fieldnotes

  def reindex_fieldnotes
    Sunspot.index(fieldnotes)
  end
end

class Activity
  has_many :fieldnote_activities
  has_many :fieldnotes, :through => :fieldnote_activities

  after_save :reindex_fieldnotes
  before_destroy :reindex_fieldnotes

  def reindex_fieldnotes
    Sunspot.index(fieldnotes)
  end
end
...