gpt4 book ai didi

ruby-on-rails - Rails 中的内联 `after_commit` 回调

转载 作者:行者123 更新时间:2023-12-04 05:35:16 26 4
gpt4 key购买 nike

我有一个需要在提交后运行的 sidekiq 作业,但仅在某些情况下而不是所有情况下,以避免 a common race condition .

例如,下面的 after_commit将始终触发,但内部代码仅在标志为真(之前在 verify 方法中设置)时才会执行。

class User < ActiveRecord::Base
...
after_commit do |user|
if @enqueue_some_job
SomeJob.new(user).enqueue
@enqueue_some_job = nil
end
end

def verify
@enqueue_some_job = ...
...
save!
end
end

代码有点丑。我宁愿能够以某种方式将回调内联包装如下:
class User < ActiveRecord::Base
def verify
if ...
run_after_commit do |user|
SomeJob.new(user).enqueue
end
end
...
save!
end
end

是否存在内置于 Rails 的任何东西来支持这样的语法(不依赖于设置临时实例变量)?或者是否存在扩展 Rails 以添加这样的语法的库?

最佳答案

使用 via a 问题找到了解决方案。该代码段得到了足够的重用,因此它可能是抽象实例变量并形成可重用模式的更好选择。它不处理返回(不确定通过 after_commit 支持哪些,因为不存在可回滚的事务。

应用程序/模型/关注点/callbackable.rb

module Callbackable
extend ActiveSupport::Concern

included do

after_commit do |resource|
if @_execute_after_commit
@_execute_after_commit.each do |callback|
callback.call(resource)
end
@_execute_after_commit = nil
end
end
end

def execute_after_commit(&callback)
if callback
@_execute_after_commit ||= []
@_execute_after_commit << callback
end
end

end

应用程序/模型/user.rb
class User < ActiveRecord::Base
include Callbackable

def verify
if ...
execute_after_commit do |user|
SomeJob.new(user).enqueue
end
end
...
save!
end
end

关于ruby-on-rails - Rails 中的内联 `after_commit` 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41472029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com