- 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) end
end class Host include Bar # 只要 include Bar 就好,不需要知道 Bar 還依存哪些 modules end
这样乍一看好像也没什么问题,但是却有个严重的问题导致无法执行,因为Foo又有Bar所include的,所以对Foo的self.included来说
他的参数base就变成了Bar,所以他就没办法存取宿主Host的任何方法和参数了;ActiveSupport::Concern解决了model之间的依赖从属关系
module Foo
extend ActiveSupport::Concern
included do
self.send(:do_host_something)
end
end
module Bar
extend ActiveSupport::Concern
include Foo