假设我有一个 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 的上下文中,以防它在旧版本或新版本中发生更改。)
(如果其他人可以为这个问题想出更好的标题,我愿意修改标题)
最佳答案
从 ActiveRecord 检查这行代码。
mangled_name = klass.name.gsub("::", "_")
所以,对于你的问题:
它在扩展委托(delegate)模块时被添加到 activerecord 的基础上 https://github.com/rails/rails/blob/f40860800c231ecd1daef6cf6b5a8a8eda76478d/activerecord/lib/active_record/base.rb#L290
其实是同一个类,只是一个类似别名的东西(其实不是别名,是一个以类为值的常量)
这个类其实是一个
ActiveRecord::Relation
,只是改了名字而已
关于ruby-on-rails - ActiveRecord::Relation 如何添加到 Rails 的模型中,为什么每个模型都有单独的 Relation 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55306333/