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

标签 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 的上下文中,以防它在旧版本或新版本中发生更改。)

(如果其他人可以为这个问题想出更好的标题,我愿意修改标题)

最佳答案

从 ActiveRecord 检查这行代码。

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

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

所以,对于你的问题:

关于ruby-on-rails - ActiveRecord::Relation 如何添加到 Rails 的模型中,为什么每个模型都有单独的 Relation 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55306333/

相关文章:

mysql - `device.id` 在生产中返回 `NULL`,但在开发中工作正常

ruby-on-rails - Prawn :css like overflow: hidden for bounding boxes with images

sql - 在 SQL 连接结果中查找组最大值

mysql - 在 Rails 中使用带有西类牙语数据库的英语模型

ruby-on-rails - 销毁最后一个 has_many 后的关联 :through record is deleted

javascript - 检查文本字段中的值是否已更改并发布。 JS。 rails

ruby-on-rails - around_action 回调如何工作?需要解释

Ruby:read_timeout 和 open_timeout 之间的区别

ruby-on-rails - 有没有办法在 Rails-API 中使用 MiniProfiler?

mysql - 为什么这个:id in Rails not work with Postgresql but it does work with MySQL?