我们知道Rails 5添加了ApplicationRecord作为一个抽象类,它由我们的模型(ActiveRecord)继承.

但基本上,我认为我们对ApplicationRecord所做的每项技术要求,我们也可以对ActiveRecord::Base项.例如:

module MyFeatures
  def do_something
    puts "Doing something"
  end
end

class ApplicationRecord < ActiveRecord::Base
  include MyFeatures
  self.abstract_class = true
end

因此,现在每个模型都将附加MyFeatures个行为.但我们也可以在Rails 4中实现这一点:

ActiveRecord::Base.include(MyFeatures)

那么使用ApplicationRecord有什么好处呢?你认为有必要增加ApplicationRecord吗?

推荐答案

虽然在基本的Rails应用程序中似乎是一样的,但一旦你开始使用Rails引擎、插件/gems或ActiveRecord::Base种直接方法,实际上就有一个重要的区别.

  • ActiveRecord::Base.include(MyFeatures)将特性直接混合到ActiveRecord::Base中,它永远存在于ActiveRecord::Base的所有后续使用中(它不能是"未混合的"),在包含之后的任何代码中都无法再获得原始ActiveRecord::Base.如果一些混合功能更改了默认的ActiveRecord行为,或者两个引擎/gem试图包含相同的命名方法,那么这很容易导致问题.

  • 另一方面,ApplicationRecord方法使功能呈现only for the classes (models) that inherit from it,其他类,以及ActiveRecord::Base的直接使用保持原始,由模块功能整理.

当使用引擎或rails插件时,这一点尤其重要,因为它允许它们将自己的模型逻辑从主应用程序的模型逻辑中分离出来,这在ApplicationRecord之前是不可能的.

所有这些在this blog postthis github comment中也有很好的描述.

Ruby-on-rails相关问答推荐

Ruby线程使用互斥处理并发问题

Ruby on Rails 身份验证:设计注册不起作用

是否可以使用 Turbo 帧更新 Rails 表单输入字段值?

使用带有 Paper Trail gem 的子类

为什么有时会出现类型错误没有将 StringIO 隐式转换为 String?Ruby /导轨

Rails - Comment.count没有改变1

在单个继承表和另一个表中的类之间建立多对多关联

如何在 Rails 中注释掉 ERB?

blueprint/screen.css 未预编译

有没有办法在模型而不是视图中使用复数()?

Rails(或 Ruby):Yes/No 而不是 True/False

在 PostgreSQL 中强制字符串的最大长度

Ruby gem 命名约定

Heroku Postgres 错误:PGError:错误:关系组织不存在(ActiveRecord::StatementInvalid)

如何使用 Rails 3 获取请求的目标控制器和操作?

Vagrant上的Rails 4.2服务器端口转发不起作用

Rails 在 id 字段上重置种子的方法

使用设计创建一个用户显示页面

为什么 Rails 需要 JavaScript 运行时?

Rails 路由 (root :to => ...)