- ActiveSupport::Concern作用
- ActiveSupport::Concern源码分析
ruby是单继承,Mixin的出现实现多重继承,在使用include module时,他会立即被插入到集成体系中包含他的类的上方,以LIFO方式。所以这要求我们在开发过程中要清楚的知道include的依赖从属关系。在没有引入ActiveSuppoer::Concern之前,我们是这样实现拓展的。
module Bar include Foo # 因為 Bar 依存於 Foo,所以我們在這裡 include 它 def self.included(base) base.send(:do_host_something) endend class Host include Bar # 只要 include Bar 就好,不需要知道 Bar 還依存哪些 modules end
这样乍一看好像也没什么问题,但是却有个严重的问题导致无法执行,因为Foo又有Bar所include的,所以对Foo的self.included来说
他的参数base就变成了Bar,所以他就没办法存取宿主Host的任何方法和参数了;ActiveSupport::Concern解决了model之间的依赖从属关系
module Fooextend ActiveSupport::Concernincluded doself.send(:do_host_something)endendmodule Barextend ActiveSupport::Concerninclude Foo # 因為 Bar 依

ActiveSupport::Concern 在 Ruby on Rails 中用于解决模块扩展时的依赖从属关系问题,避免了传统 Mixin 的潜在冲突。它自动处理类方法和实例方法的加载,简化了代码结构。通过 extend ActiveSupport::Concern,模块在被 included 时,将调用 append_features 实现方法注入。同时,模块依赖加载采用递归处理,确保正确加载所有嵌套依赖。
最低0.47元/天 解锁文章
1168

被折叠的 条评论
为什么被折叠?



