#ruby-on-rails #delayed-job #thinking-sphinx
#ruby-on-rails #отложенная работа #thinking-сфинкс
Вопрос:
У меня возникли проблемы с использованием отложенных дельт с thinking_sphinx. Это модель:
Event
has_many :subscriptions
has_many :users, :through => :subscriptions
...
define_index do
indexes name
indexes users(:id), :as => :user_id
set_property :delta => :delayed
...
Subscription
belongs_to :event
belongs_to :user
User
has_many :subscriptions
has_many :events, :through => :subscriptions
Когда пользователь добавляет / удаляет подписку, я устанавливаю флаг дельта для всех соответствующих событий с помощью обратных вызовов модели подписки, подобных этому:
after_save :set_events_delta_flag
after_destroy :set_events_delta_flag
def set_events_delta_flag
Event.define_indexes
sql = "UPDATE events SET delta = true FROM subscriptions"
sql << " WHERE events.id = subscriptions.event_id AND (subscriptions.id = #{self.id})"
Event.connection.update(sql)
Event.index_delta
end
Это работает нормально, когда пользователь добавляет подписку: выполняется обратный вызов, а затем выполняется задание ThinkingSphinx::Deltas::DeltaJob и обновляет индекс. Однако, когда пользователь удаляет подписку, выполняется обратный вызов и DeltaJob, но кажется, что индекс не обновляется:
Если я сделаю что-то вроде:
Event.search("". :with => {:user_id => XX}).search_count
до и после удаления подписки количество не меняется (оно меняется до и после добавления подписки)
это ожидаемое поведение? Что я делаю не так?
Обновление: похоже, что Sphinx хранит две копии одного и того же документа (одну в основном индексе и одну в дельта-индексе) является причиной проблемы.
Ответ №1:
С обновлением до Sphinx 2.0.3 эта проблема с наличием 2 индексов исчезнет. индексы будут объединены в один. Вы можете попробовать обновить его.