我正在使用elasticsearch-rails gems
gem 'elasticsearch-model', '~> 0.1.6'
gem 'elasticsearch-rails', '~> 0.1.6'
我的模型:
place.rb
class Place < ActiveRecord::Base
include PlaceElasticSearch
...
has_many :order_rooms
...
end
orer_room.rb
class OrderRoom < ActiveRecord::Base
belongs_to :place
end
place_elastic_search.rb
require 'elasticsearch/model'
module PlaceElasticSearch
extend ActiveSupport::Concern
included do
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
index_name "places-#{Rails.env}"
settings INDEX_SETTINGS do
mappings dynamic: 'false' do
...
indexes :order_rooms, type: 'nested', include_in_root: true do
indexes :max_persons, type: 'integer'
end
end
end
after_touch() { __elasticsearch__.index_document }
end
end
我需要在创建/删除/更新order_room后重新索引放置elasticsearch文档。
我为order_room模型添加了after_save回调
order_room.rb
after_save :update_place_document
def update_place_document
place.__elasticsearch__.index_document if Place.respond_to?('__elasticsearch__')
end
但如果我更新或删除了旧订单,它就无法使用。
有什么想法吗?哪里错了?
答案 0 :(得分:1)
嗯,看起来像地方有缓存订单房间的对象。如果我添加重新加载到after_save
方法或place(cache: false)
所有工作。还需要添加after_destroy
回调
<强> order_room.rb 强>
after_save :update_place_document
after_destroy :update_place_document
def update_place_document
place(cache: false).__elasticsearch__.index_document if Place.respond_to?('__elasticsearch__')
end