假设我有一个Rails模型:class Project < ActiveRecord::Base
在Rails控制台中:
> Project.all
=> #<ActiveRecord::Relation []>
这似乎是合理的。但是,
> Project.all.class
=> Project::ActiveRecord_Relation
什么是 Project::ActiveRecord_Relation
?具体来说,
is_a?
? Project.all.is_a?(ActiveRecord::Relation)
返回true
(这是预期的),但是Project::ActiveRecord_Relation
实际上是ActiveRecord::Relation
的实例,还是其他东西?Project.all
不返回ActiveRecord::Relation
而不是Project::ActiveRecord_Relation
?(这是在Rails 5.1的上下文中,以防在旧版本或新版本中进行了更改。)
(如果其他人可以为这个问题提供更好的标题,我可以进行标题编辑)
答案 0 :(得分:2)
从ActiveRecord检查这一行代码。
mangled_name = klass.name.gsub("::", "_")
所以,对于您的问题:
实际上是同一类,就像一个别名(实际上不是别名,它是一个以类为值的常量)
该类实际上是一个ActiveRecord::Relation
,只是名称已更改
答案 1 :(得分:2)
您实际上要问两个问题:
@arieljuod
已经为您提供了一些说明和链接。
但是第二个问题仍然没有答案。
还有另一个类似的问题,希望可以帮助您找到所有答案:
How can an ActiveRecord::Relation object call class methods
看起来这两个问题(通过链接和您的问题相互回答)
看看@nikita-shilnikov
的答案。祝您调查顺利!