如何解决使用Rails 6 Zeitwerk时,具有相同名称的类将导致未初始化的常量
我遇到zeitwerk的问题,无法访问共享相同名称的另一个模型常量。例如:
在/app/models
中,我有一个worker.rb
文件,它的常量为RETRY_COUNT
class Worker < ApplicationRecord
RETRY_COUNT = 10
end
在/lib
中,我有一个/critical/worker.rb
文件,但在critical
下有一个命名空间
module Critical
class Worker
some_method(::Worker::RETRY_COUNT)
end
end
我可以使用::Worker
来调用worker模型类,但是当我调用::RETRY_COUNT
时,它会导致
NameError: uninitialized constant Worker (call 'Worker.connection' to establish a connection)::RETRY_COUNT
无论如何?我可以在RETRY_COUNT
类上对Critical::Worker
进行硬编码,但我想避免这样做。
解决方法
根据您的更新,我确定您具有循环依赖关系。 has_many
调用在“ ApplicationRecord初始化”期间进行处理。在“ AR初始化”期间,其中一个引用Critical::Worker.foo
中的has_many
,而::Worker
引用RETRY_COUNT
(AR),尚未完成初始化。 / p>
如果在“ AR初始化时间”中需要此值,则将其放在没有其他依赖项的文件中。
module Independent # no other dependencies in this file
RETRY_COUNT = 10
end
然后:
class Worker < ApplicationRecord
RETRY_COUNT = Independent::RETRY_COUNT
end
module Critical
class Worker
RETRY_COUNT = Independent::RETRY_COUNT
end
end
Zeitgeist应该能够弄清楚它需要先加载Independent
,例如AR类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。