如何将ActiveRecord :: Relation添加到Rails的模型中,为什么每个模型都有单独的Relation类?

时间:2019-03-22 19:07:49

标签: ruby-on-rails ruby activerecord

假设我有一个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的上下文中,以防在旧版本或新版本中进行了更改。)

(如果其他人可以为这个问题提供更好的标题,我可以进行标题编辑)

2 个答案:

答案 0 :(得分:2)

从ActiveRecord检查这一行代码。

https://github.com/rails/rails/blob/f40860800c231ecd1daef6cf6b5a8a8eda76478d/activerecord/lib/active_record/relation/delegation.rb#L23

mangled_name = klass.name.gsub("::", "_")

所以,对于您的问题:

答案 1 :(得分:2)

您实际上要问两个问题:

  1. 它如何工作?
  2. 为什么会这样? (干什么?)

@arieljuod已经为您提供了一些说明和链接。

但是第二个问题仍然没有答案。

还有另一个类似的问题,希望可以帮助您找到所有答案:

How can an ActiveRecord::Relation object call class methods

看起来这两个问题(通过链接和您的问题相互回答)

看看@nikita-shilnikov的答案。祝您调查顺利!