Rails 元编程:ActiveSupport::Concern 与 alias_method_chain 的兴衰
1. Active Support 的 Concern 模块
在 Rails 中,模块有着特殊之处,当你引入它们时,能同时获得实例方法和类方法。这背后的奥秘源于 Active Support 库中的 Concern 模块。
1.1 Concern 出现前的 Rails
Rails 的源代码多年来变化很大,但一些基本概念却没怎么变,比如 ActiveRecord::Base 类,它由许多定义了实例方法和类方法的模块组合而成。例如,Base 包含了 ActiveRecord::Validations 模块,从而获得了相应的实例和类方法。
在早期,当 ActiveRecord::Base 包含 Validations 模块时,会发生三件事:
1. Validations 的实例方法(如 valid?)成为 Base 的实例方法,这是常规的模块包含操作。
2. Ruby 调用 Validations 的 included 钩子方法,并将 ActiveRecord::Base 作为参数传入。
3. 该钩子使用 ActiveRecord::Validations::ClassMethods 模块扩展 Base,使得 ClassMethods 中的方法成为 Base 的类方法。
这种方式被称为 include-and-extend 技巧,很多 Ruby 项目都借鉴了它。不过,它也存在问题。每个定义类方法的模块都要定义类似的 included 钩子来扩展包含它的类,在 Rails 这样的大型代码库中,这种钩子
超级会员免费看
订阅专栏 解锁全文

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



