Я использую ActsAsFerret, который является оболочкой Rails для поисковой системы на основе Ruby Ferret .
Иногда кажется, что запись удаляется с помощью SQL, а не с помощью ActiveRecord (то есть record.destroy), и когда это происходит, в индексе Ферре остается индексная запись.
Я могу видеть это в этом примере, где Школа № 136574 оставила запись висячего индекса: В поиске ниже я использую опцию lazy
, которая говорит: «Просто извлеките данные из индекса Ферре и дона не ударяйте по базе данных ":
>> @schools = School.search(params)
=> [#<FerretResult wrapper for School with id 136574, #<FerretResult wrapper for School with id 55814]
>> @schools.collect(&:id)
ActiveRecord::RecordNotFound: Couldn't find School with ID=136574
Это вызывает серьезную проблему, потому что если вы пытаетесь что-то сделать с результатами, это делает School.find (id), и вы получаете исключение, как описано выше.
Я сделал School.rebuild_index
, думая, что это исправит, но это не так.
Я могу обойти это - кажется, что вызов .collect
для результатов был переопределен для преобразования их в соответствующий объект (вызывая исключение), и я могу сделать что-то вроде этого:
@schools = @schools.select{|result| School.find_by_id(result.id)};@schools.size
Это работает, но медленно, и немного в заднице.
Кто-нибудь знает способ удалить записи индекса зависания?