当has_many模型更改时,重新索引Rails Elasticsearch文档。

3
我正在使用elasticsearch-rails宝石包。
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

我需要在创建/删除/更新订单房间后重新索引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个回答

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

使用place(cache: false)对我们很有效,这真是太棒了。但我们不知道它为什么有效。你有关于传递该参数的文档吗? - Nathan Colgate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接