Переиндексировать только одну конкретную запись с солнечным пятном

у меня две модели

class User < ActiveRecord::Base
  has_many :posts

  searchable do
    text :post_titles
  end

  def post_titles
    posts.map &:title
  end
end

class Post < ActiveRecord::Base
  belongs_to :user
end

проблема в том, что когда я обновляю заголовок поста, солнечное пятно не обновляет индекс для связанного пользователя, и он не доступен для поиска по новым данным. Если я сделаю User.index, это решит проблему, но займет слишком много времени. Существуют ли какие-либо лучшие решения для обновления индекса родительской записи при изменении дочерней записи (например, переиндексировать только родительскую запись, а не всех пользователей)?


person Bohdan    schedule 04.05.2012    source источник


Ответы (1)


Sunspot предоставляет метод экземпляра index() для индексации одной записи.

То, что я сделал, было

 class Post 

   belongs_to :user
   after_save :update_user_index

 private

   def update_user_index
     user.index
   end
end

Если вы запускаете это в консоли и хотите немедленно увидеть результаты, вызовите Sunspot.commit

person Bohdan    schedule 04.05.2012
comment
Почему я всегда нахожу решение через несколько минут после того, как задал вопрос в StackOverflow :\ - person Bohdan; 04.05.2012
comment
Джефф Этвуд уже говорил об этот феномен . Ваше здоровье! - person Jesvin Jose; 05.05.2012
comment
Почему вы должны сделать Sunspot.commit? У меня есть этот код, работающий в моем приложении, но я не вижу никаких изменений, пока не запущу Sunspot.commit в консоли. Почему вам это нужно только тогда, когда из консоли? - person joncodo; 07.06.2013
comment
Я не могу точно сказать, какова политика по умолчанию в отношении Sunspot.commit, но есть два метода, которыми вы можете проверить index и index! второй также запускает Sunspot.commit. - person Bohdan; 10.06.2013
comment
В интересах тех, кто найдет этот ответ в будущем, причина, по которой вам нужно вызывать Sunspot.commit, если вы работаете в консоли, заключается в том, что поведение sunspot по умолчанию заключается в ожидании окончания текущего запроса для фиксации каких-либо изменений. Поскольку запроса нет, фиксацию необходимо выполнить вручную. См.: github.com/sunspot/sunspot/tree/master/sunspot_rails#committing< /а> - person DaveMongoose; 08.08.2017