У меня проблемы с использованием отложенных дельт с 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
Itработает нормально, когда пользователь добавляет подписку: выполняется обратный вызов, а затем запускается задание ThinkingSphinx :: Deltas :: DeltaJob и обновляется индекс.Однако, когда пользователь удаляет подписку, выполняется обратный вызов и DeltaJob, но кажется, что индекс не обновляется:
Если я делаю что-то вроде:
Event.search("". :with => {:user_id => XX}).search_count
до и после удаленияподписка, количество не изменяется (оно изменяется до и после при добавлении подписки)
это ожидаемое поведение?Что я делаю не так?
Обновление : кажется, что Sphinx хранит две копии одного и того же документа (один в основном индексе и один в дельта-индексе) является причиной проблемы.