为什么Rails 5使用ApplicationRecord而不是ActiveRecord :: Base?

Hieu Pham:

我们知道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引擎,插件/ gem或直接来自的直接方法,就存在一个重要区别ActiveRecord::Base

  • ActiveRecord::Base.include(MyFeatures)直接将特征混合进去,ActiveRecord::Base并且在以后的所有使用中永远存在ActiveRecord::Base(不能被“混合”),并且ActiveRecord::Base在包含之后再也无法在任何代码中获得原始特征如果某些混合功能更改了默认的ActiveRecord行为,或者例如两个引擎/ gems试图包含相同名称的方法,则很容易导致问题。

  • 另一方面,该ApplicationRecord方法仅针对从其继承的类(模型),其他类以及直接使用ActiveRecord::Base保持原始状态的功能(不受模块功能限制)呈现功能。

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

所有这些都在此博客文章此github评论中得到了很好的描述

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在多次继承中执行Base .__ init __(self)而不是super().__ init __()时会跳过__init__?

为什么apt-get install r-base在R中安装3.2.3而不是3.4.0?

为什么使用'='而不是':='?

Rails扩展ActiveRecord :: Base

为什么我们使用Base64?

为什么是“ assert_not”而不是“!” 在编写Rails测试时?

Rails 5为什么在模式文件中添加nextval方法?

为什么Rails 5将“索引”更改为“外键”?

Rails:ActiveRecord :: Base.transaction和MyClass.transaction有什么区别?

Ruby on Rails-为什么Materialize.updateTextFields不是函数?

为什么base64 / openssl使用填充字符“ K”而不是“ =”

为什么Rails 5使用puma代替webrick进行开发?

为什么在Rails中使用/ apps / libs而不是/ libs?

为什么我不能使用base.Select在List <string>的子类中使用Linq Select?

为什么Content-MD5标头是base64编码的?

为什么base64.b64encode返回b'somestring'的值而不是简单地'somestring'?

为什么在JWT中使用Base64

为什么很多人在Rails中使用“-%>”而不是“%>”?

Rails:为什么视图页面显示ActiveRecord哈希?

使用ActiveRecord :: Base.connection返回哈希而不是数组

Rails API:什么时候最好发送Base64编码的数据而不是原始数据

Ruby on Rails-为什么不能使用ActiveRecord :: Base方法?在哪里使用?

Rails 5 ApplicationRecord继承与异常

Rails 5:为什么javascript执行两次?

为什么我不断收到“ ValueError: invalid literal for long() with base 10: '5-1'

为什么引导模式无法在 Rails 5 上显示?

Rails MiniTest,为什么这个过程不是成功而不是错误?

为什么base64编码直接返回字节而不是字符串?

为什么从 ActiveRecord::Base 继承的这个类不能使用 class_eval 作用域