gpt4 book ai didi

ruby-on-rails - 延迟作业 : How to reload the payload classes during every call in Development mode

转载 作者:行者123 更新时间:2023-12-03 23:30:57 25 4
gpt4 key购买 nike

我正在运行一个延迟工作的 worker 。每当我调用 foo方法, worker 打印 hello .

class User
def foo
puts "Hello"
end
handle_asynchronously :foo
end

如果我对 foo 进行一些更改方法,我必须重新启动工作程序才能反射(reflect)更改。在开发模式中,这会变得很烦人。

我试图找到一种方法来为每个请求重新加载有效负载类(在本例中为用户类)。我尝试猴子修补 DelayedJob 库来调用 require_dependency在有效负载方法调用之前。
module Delayed::Backend::Base
def payload_object_with_reload
if Rails.env.development? and @payload_object_with_reload.nil?
require_dependency(File.join(Rails.root, "app", "models", "user.rb"))
end
@payload_object_with_reload ||= payload_object_without_reload
end
alias_method_chain :payload_object, :reload
end

这种方法不适用于使用 require_dependency 注册的类。需要在调用之前重新加载,我还没有想出如何去做。我花了一些时间阅读调度程序代码以了解 Rails 如何为每个请求重新加载类。我无法找到重新加载代码。

有没有人试过这个?你会如何建议我继续?或者您是否有任何用于定位 Rails 类重新加载代码的指针?

最佳答案

我设法找到了解决方案。我用过 ActiveSupport::Dependencies.clear方法来清除加载的类。

添加一个名为 config/initializers/delayed_job.rb 的文件

Delayed::Worker.backend = :active_record
if Rails.env.development?
module Delayed::Backend::Base
def payload_object_with_reload
if @payload_object_with_reload.nil?
ActiveSupport::Dependencies.clear
end
@payload_object_with_reload ||= payload_object_without_reload
end
alias_method_chain :payload_object, :reload
end
end

关于ruby-on-rails - 延迟作业 : How to reload the payload classes during every call in Development mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4903375/

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