Stary
Stary

Reputation: 188

Rails elasticsearh reindex document when has_many model is changed

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

Answers (1)

Stary
Stary

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

Related Questions