我正在使用ActsAsFerret,它是基于Ruby的Ferret搜索引擎的Rails包装器。
有时似乎使用SQL而不是通过ActiveRecord(即record.destroy)删除记录,并且当发生这种情况时,索引条目将保留在Ferret索引中。
我可以在这个例子中看到它,其中School#136574留下了悬挂的索引条目:在下面的搜索中,我使用lazy
选项,其中显示“只是从Ferret索引中获取数据并且不要打扰数据库“:
>> @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
这确实有效,但它很慢,而且有点痛苦。
有没有人知道删除挂起索引记录的方法?