提问人:Farid Anooshehpour 提问时间:8/5/2022 最后编辑:Farid Anooshehpour 更新时间:8/9/2022 访问量:175
有什么方法可以在耐嚼的“udpate_index”之后立即运行一个块?
Any way to run a block right after Chewy `udpate_index`?
问:
在 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_commit
update_index
答:
0赞
Farid Anooshehpour
8/9/2022
#1
这可能是一个可能的解决方案,尽管它在我的特定情况下不起作用:
Chewy 的策略中有一些方法可以绕过主要的原子update_index作用:leave
atomic
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
可以在以下方法中进行:prepend
leave
chewy.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
评论