有什么方法可以在耐嚼的“udpate_index”之后立即运行一个块?

Any way to run a block right after Chewy `udpate_index`?

提问人:Farid Anooshehpour 提问时间:8/5/2022 最后编辑:Farid Anooshehpour 更新时间:8/9/2022 访问量:175

问:

在 Rails 应用中,Chewy gem 用于处理 ElasticSearch 索引。 我有一个代码块,一旦 RDB 的新记录在我们的 NRDB 中被索引,我就会需要运行它。它看起来像:after_commit

class User < ApplicationRecord

   update_index('USER') { self }

   after_commit :run_this_block, on: :create


   def run_this_block
     index = UsersIndex.find id
     'do something with index'
   end
end

似乎在!!之前被调用 在耐嚼的宝石中找不到任何东西, 有人有什么想法吗?after_commitupdate_index

ruby-on-rails 回调 chewy-gem

评论


答:

0赞 Farid Anooshehpour 8/9/2022 #1

这可能是一个可能的解决方案,尽管它在我的特定情况下不起作用:

Chewy 的策略中有一些方法可以绕过主要的原子update_index作用:leaveatomic

 class Atomic < Base
      def initialize
        @stash = {}
      end

      def update(type, objects, _options = {})
        @stash[type] ||= []
        @stash[type] |= type.root.id ? Array.wrap(objects) : type.adapter.identify(objects)
      end

      def leave
        @stash.all? { |type, ids| type.import!(ids) }
      end
    end

可以在以下方法中进行:prependleavechewy.rb

# /config/initializers/chewy.rb

Chewy::Strategy::Atomic.prepend(
  Module.new do
    def leave
      @stash.all? do |type, ids|
        if INTENDED_INDICES_NAMES.include?(type.name)
            type.import!(sliced_ids)
            <here goes the code where one have access to recently indexed records>
        else
          type.import!(ids)
        end
        true
      end
    end
   end