我们知道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] 删除。
我来说两句