2

我在使用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,但是当我调用时::RETRY_COUNT,它会导致

NameError: uninitialized constant Worker (call 'Worker.connection' to establish a connection)::RETRY_COUNT

无论如何围绕这个?我可以RETRY_COUNTCritical::Worker课堂上硬编码,但我想避免这样做。

4

1 回答 1

0

根据您的更新,我相当确定您有循环依赖。has_many在“ApplicationRecord 初始化”期间处理调用。在“AR 初始化”期间,其中一个Critical::Worker.foo在 ahas_many中引用,它为 引用::Worker(AR)RETRY_COUNT,尚未完成初始化。

如果“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 类。

于 2020-10-16T01:41:32.697 回答