我有模型A
和B
,并且在每个模型中有两个版本的常量Foo
和Bar
名称间距:
应用程序/模型/ a.rb
class A < ActiveRecord::Base
FOO = "foo in A"
BAR = B::FOO
end
应用程序/模型/ b.rb
class B < ActiveRecord::Base
FOO = "foo in B"
BAR = A::FOO
end
此处,A::BAR
取决于B::FOO
,b.rb
在文件B::BAR
中定义,其定义为A::FOO
,取决于a.rb
,在文件A::BAR
中定义,其定义为A::BAR
。但是,我可以毫无错误地致电A::BAR # => "foo in B"
:
A::BAR
对我来说,这看起来是循环的,我无法想象加载这两个文件的任何顺序或方式而不会陷入无限递归。
当我致电B::BAR
时,如何解决常量查询?
我还发现如果我在调用A::BAR
之前的一开始就调用a.rb
,那么它会引发错误,这表明文件名b.rb
的字母顺序和A::BAR
与此问题有关。这也提出了一个问题:如果文件加载是由持续分辨率触发的,那么文件之间的这种顺序应该无关紧要。另一方面,如果在调用这些常量之前加载文件,那么首先调用B::BAR
还是先调用class A < ActiveRecord::Base
BAR = B::FOO
FOO = "foo in A"
end
无关紧要。这是怎么回事?
我还发现,如果我将定义的顺序更改为以下内容,
应用程序/模型/ a.rb
class B < ActiveRecord::Base
BAR = A::FOO
FOO = "foo in B"
end
应用程序/模型/ b.rb
A::BAR
然后先调用B::BAR
或先调用TIMESTAMP WITH TIME ZONE
会引发错误。我想知道这是如何相关的。