让我们为这个问题奠定基础。
这是我们的模型:
class Deal < ActiveRecord::Base
belongs_to :retailer
has_many :content_locations, as: :locatable
has_many :stores, through: :content_locations
searchable do
text :title
text :store_name
text :store_sort_name
text :description
end
scope :by_keyword, ->(keyword, limit, offset) {
search {
fulltext keyword
paginate offset: offset, per_page: limit
}.results
}
end
以下是我们的rspec测试中击中SOLR的部分:
describe 'searchable' do
before do
DatabaseCleaner.clean
end
target = 'foo'
let!(:deal_with_title) { create :deal, title: target }
let!(:deal_with_description) { create :deal, description: target }
let!(:deal_with_store_name) { create :deal, store_name: target }
let!(:deal_with_store_sort_name) { create :deal, store_sort_name: target }
let!(:deal_with_nothing) {
create :deal, title: 'bar', description: 'bar', store_name: 'bar', store_sort_name: 'bar'
}
it 'includes matches' do
sleep 1
results = Deal.by_keyword(target, 25, 0)
expect(results).to include(deal_with_title)
expect(results).to include(deal_with_description)
expect(results).to include(deal_with_store_name)
expect(results).to include(deal_with_store_sort_name)
expect(results).to_not include(deal_with_nothing)
end
end
我们看到的是我们的测试随机失败。我可以一次又一次地成功执行这个测试1-3xs但是第4次会失败,否则它将失败4xs而第5次失败。该模式完全是随机的。如您所见,我们尝试在此设置中添加睡眠,除了减慢速度之外没有任何作用。
这里有任何提示。这让我们疯了!
答案 0 :(得分:1)
在Sunspot Model Spec他们总是打电话
Sunspot.commit
数据创建后和任何检查之前
更新:
您也可以调用model.index!
,它会立即将特定模型同步到solr索引中。在一个特定的情况下,我还必须在保存之后和索引之前调用model.reload
,因为附加到模型的一些标记关系(但这是acts_as_taggable特定的)
#simple
Factory.create(:model).tap { |m| m.index! }
#advanced
model = Factory.build :model_with_relationships
model.save
model.reload #optional
model.index!
答案 1 :(得分:1)
我们决定走一个完全不同的方向,老实说,我不建议任何人阅读这篇文章时实时击中SOLR。这是一种痛苦。
我们的最终解决方案是改为使用sunspot_matchers gem。