Reputation: 188
I am using elasticsearch-rails gems
gem 'elasticsearch-model', '~> 0.1.6'
gem 'elasticsearch-rails', '~> 0.1.6'
My modles:
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
I need reindex place elasticsearch document after create/delete/update order_room.
I added after_save callback for order_room model
order_room.rb
after_save :update_place_document
def update_place_document
place.__elasticsearch__.index_document if Place.respond_to?('__elasticsearch__')
end
But it doesnt work if i have updated or deleted old order room.
Any ideas? Where i wrong?
Upvotes: 3
Views: 1820
Reputation: 188
Hm, looks like place has cached order room object. If i add reload to after_save
method or place(cache: false)
all works. Also need to add after_destroy
callback
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
Upvotes: 1