加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 为什么Active Record在内部对某些功能使用modu

发布时间:2020-12-17 02:22:52 所属栏目:百科 来源:网络整理
导读:我注意到Rails源代码中的一些地方使用了module_eval.一个位置在 ActiveRecord::Enum,另一个位于 ActiveRecord::Store.我熟悉class_eval和instance_eval并使用它们来扩展现有类或对象的功能,但在module_eval的情况下,它看起来像是用于不同的目的. 在这两种情
我注意到Rails源代码中的一些地方使用了module_eval.一个位置在 ActiveRecord::Enum,另一个位于 ActiveRecord::Store.我熟悉class_eval和instance_eval并使用它们来扩展现有类或对象的功能,但在module_eval的情况下,它看起来像是用于不同的目的.

在这两种情况下,他们都使用类似的模式来定义模块:

def _store_accessors_module
  @_store_accessors_module ||= begin
    mod = Module.new
    include mod
    mod
  end
end

如果模块被包含在它定义的类中,那么在这样的嵌套模块中定义相关方法有什么好处?是否更好地隔离了代码?我问的原因是因为我有一个为Active Record增加功能的gem,我想知道这种方法是否更像是一种“最佳实践”方式来做同样的事情. Here’s the relevant source code of my gem供参考.

解决方法

在嵌套模块中定义方法的原因是,用户可以覆盖方法并仍然可以访问super来获取原始功能.回想一下,当你在Ruby中包含模块时,它们会被插入到当前类的祖先列表中,而超级工作只需遍历祖先数组,寻找响应当前方法的第一个对象.为此,模块的名称并不重要,因为它只是一个类似继承链的传递机制.这就是为什么他们只定义一个匿名的新模块并将其包含在运行中.

如果您查看列出的2个示例的责备视图,您可以看到更改背后的原因. commit message in the ActiveRecord::Store example很好地说明了这个案例.正如您所看到的,他们正在添加覆盖访问者定义颜色的能力,并通过super ||来处理原始方法的结果. ‘红色’.然而,在原始实现中,必须重写颜色访问器方法,然后执行与原始访问器方法相同的工作,即调用read_store_attribute(:settings,:color)|| ‘红色’.因此,所有这些都是因为没有被迫重现内部或使用别名方法链来增强动态定义方法的功能.

我不确定这是否是你宝石中的一个有用的功能,但我猜也许不是因为你的访问器似乎返回定义良好的对象枚举相关对象.但是,当然,这取决于你和宝石的用户:).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读