15、Rails 元编程:ActiveSupport::Concern 与 alias_method_chain 的兴衰

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 这样的大型代码库中,这种钩子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值