理解ActiveRecord::Concern:

参考:include和extend的区别:

https://www.cnblogs.com/chentianwei/p/9408963.html

传统的模块看起来像:

module Mdef self.included(base) # base(一个类)扩展了一个模块"ClassMethods", base的类方法就包含了"ClassMethods"模块中的方法。base.extend ClassMethods
    # base添加了一个:disabled方法。base.class_eval doscope :disabled, -> { where(disabled: true) }endendmodule ClassMethods...end
end

使用ActiveSupport::Concern:

require 'active_support/concern'module M# M扩展了模块Concern,可以使用Concern的方法。
  extend ActiveSupport::Concern# 当M被一个类包括后,这个类就可以使用块内的方法了。
  included doscope :disabled, -> { where(disabled: true) }end# 当M被一个类包括后,这个类的类方法就扩展了,?的方法就作为类方法使用。
  class_methods do...end
end



gem 'name_of_person'

一个小的gem,为英文网站用户的注册名字添加了很多调用的方法。

https://github.com/basecamp/name_of_person/tree/master/lib/name_of_person

  1. 加载了gem后,
  2. ActiveRecord::Base包含了模块HasPersonName, 就可以使用lib/name_of_person/has_person_name.rb中的方法:类方法has_person_name.
  3. 在Rails app中, app/model/user.rb, 使用has_person_name方法后,就include包含了模块Assignable。 User的实例就新增了2个实例方法,这两个方法会调用模块PersonName中的方法
  • @user.name=: 调用PersonName.full(name)方法,@user的first_name, last_name属性被分配值。
  • @user.name:  返回一个PersonName.new对象,这个对象可以使用:
    • full | initials | familiar 等定义在模块PersonName中的方法。
    • first | last

使用方法:

1 . User类必须包括first_name, last_name2个属性,添加validates :first_name, :last_name, presence: true

2. 当实例化一个@user时,代码内部调用name= 方法为first_name, last_name属性分配值!

(这里不是很理解,是否是devise这个gem,当发现必须验证first_name, last_name后,自动调用name=方法?)

3. 之后通过@user.name.xxx就可以使用不同的名和姓的组合。

分析:先看三张图:

图2

图3:

@user.name的内部运行机制:

首先是一个判断:

if  @user.first_nameNameOfPerson::PersonName.new(@user.first_name, @user.last_name)
end

如果first_name存在,则新增一个PersonName对象,调用initialize方法

    def initialize(first, last = nil)raise ArgumentError, "First name is required" unless first.present?@first, @last = first, lastsuper fullend

然后调用full这个方法,进行if判断

    def full@full ||= last.present? ? "#{first} #{last}" : firstend分析:    如果@user.last_name存在(last.present?),则 把@user的两个name属性合并,并分配给@full对象。    

最后返回一个PersonName对象实例, 内部包括@first, @full, 及@last(根据@user决定是否存在)

@user.name = "Dav Tom"内部运行分析:

    def name=(name)full_name = NameOfPerson::PersonName.full(name)self.first_name, self.last_name = full_name.try(:first), full_name.try(:last)end

首先:调用模块PersonName的类方法full。

  • 把传入的字符串参数分成first, last变量
  • 如果first变量存在,则新建一个PersonName对象
  • 之后的分析和@ueser.name相同。
    def self.full(full_name)first, last = full_name.to_s.strip.split(/\s+/, 2)new(first, last) if first.present?end

转载于:https://www.cnblogs.com/chentianwei/p/9829164.html

ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析相关推荐

  1. 浅谈SQL Server内部运行机制

    原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...

  2. Vue.js 内部运行机制之总结 常见问题解答

    Vue.js 内部运行机制之总结 & 常见问题解答 总结 在本小册的第一节中,笔者对 Vue.js 内部运行机制做了一个全局的概览,当时通过下面这张图把 Vue.js 拆分成一个一个小模块来介 ...

  3. VC++的学习(基于VS2008)——windows程序内部运行机制

    昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...

  4. 分析内部运行机制,教你解决Redis性能问题

    摘要:聚焦Redis的性能分析,思考Redis 可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行. 本文分享自华为云社区<分析内部运行机制, ...

  5. Ray --内部运行机制、对象存储中对象的存储和容错

    本篇主要介绍了分布式框架 Ray 的内部运行机制,对象的存储过程和容错能力.内部运行机制主要分为Ray的连接,远程函数的定义和使用以及获取对象ID的运行机制.对象存储主要是对象放入的序列化和从对象调出 ...

  6. 从template到DOM(Vue.js源码角度看内部运行机制)

    写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(github.com/answershuto-)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些产出也会对同样想要学习Vue.j ...

  7. [转] webpack之plugin内部运行机制

    简介 webpack作为当前最为流行的模块打包工具,几乎所有的主流前端开发框架(React.Vue等)都会将其作为默认的模块加载和打包工具.通过简单的配置项,使用各种相关的loader和plugin, ...

  8. IIS 内部运行机制

    ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices ...

  9. 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制

    (金光鳞闪影若茫) 窗口四步走: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 最后创建消息循环和响应函数 设计窗口类: typedef struct {UINT style;//窗口类型 WNDP ...

最新文章

  1. 《Science》杂志:机器学习究竟将如何影响人类未来的工作?
  2. DTH11驱动实例稳定修改补充
  3. FPP(彩包)、COEM(简包)、MOLP(license授) 介绍
  4. 程会玩 | 在.NET Core里操作Git
  5. Django中的class Meta知识点
  6. java map 赋值_java Listmap赋值的问题
  7. bootstrap3 徽章_尔冬升送张大大金像奖女神徽章,全国仅14枚,网友吐槽:他不值得...
  8. NBA Top Shot巨鲸17.5万美元购买的球星卡目前已值2000万美元
  9. 无法装载这个对象_面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
  10. 【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
  11. linux fortran 内存不足,[转载]linux 安装fortran 90 --zz
  12. 华为U2000网管研究实录 (4) - 运行分析(系统监控客户端)
  13. win11右键新建没有txt文本文档记事本怎么办
  14. matlab排序函数 下标,Matlab自带排序函数sort用法
  15. webView 修改背景颜色
  16. 腾讯云API弹性公网IP踩坑
  17. Kernel Pwn 入门 (2)
  18. 人工智能在医学影像中的研究与应用
  19. OpenCV在图片上画线和矩形
  20. ps ctrl+shift+j 切割瓶子

热门文章

  1. ceph存储原理_热门的分布式存储系统ceph入门介绍
  2. clistctrl控件最后插入在后面_老板让我把图片放到Excel表格中,批量插入效率高...
  3. html5中音频的标签,html5中的音频标签安全
  4. rust tpa_Rust(腐蚀)怎么tp求大神指教。请写在下面
  5. android移动应用基础教程源代码,Android移动应用基础教程 【程序活动单元Activity】...
  6. 单调栈 leetcode整理(二)
  7. vim中的jk为什么是上下_JK的完整形式是什么?
  8. FreeRTOS任务基础知识
  9. python---异常处理结构
  10. uva 1218——Perfect Service