当has_many模型被更改时,Rails elasticsearch reindex文档

时间:2015-03-19 10:42:52

标签: ruby-on-rails elasticsearch

我正在使用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

但如果我更新或删除了旧订单,它就无法使用。

有什么想法吗?哪里错了?

1 个答案:

答案 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
相关问题