ActiveSupport::Concern 和 gem 'name_of_person'(300?) 的內部運行機制分析

理解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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 3.8.0a2 發布,面向對象編程語言

百度智能云 云生態狂歡季 熱門云產品1折起>>> Python 3.8.0a2 發布了,這是 3.8 系列計劃中 4 個 alpha 版本的第 2 個。 alpha 版本旨在更加易于測試新功能和 bug 修復狀態,以及發布流程。在 alpha 階段會添加新功能,直到 beta 階…

基于plotly數據可視化_如何使用Plotly進行數據可視化

基于plotly數據可視化The amount of data in the world is growing every second. From sending a text to clicking a link, you are creating data points for companies to use. Insights that can be drawn from this collection of data can be extremely valuable. Every…

關于Oracle實時數據庫的優化思路

關于實時數據庫的優化思路 背景 大概168個換熱站機組,每套機組將近400個點,整體有6萬多個點需要進行實時更新。數據庫里其中有一個監控參數表(yxjk_jkcs),每一個點位屬性都在里面存放,其中有一個字段CS_VALUE 是存放被更新的實時…

【轉】使用 lsof 查找打開的文件

在 UNIX 環境中,文件無處不在,這便產生了一句格言:“任何事物都是文件”。通過文件不僅僅可以訪問常規數據,通常還可以訪問網絡連接和硬件。在有些情況下,當您使用 ls 請求目錄清單時,將出現相應的條目。在…

ESLint簡介

ESLint簡介 ESLint是一個用來識別 ECMAScript 并且按照規則給出報告的代碼檢測工具,使用它可以避免低級錯誤和統一代碼的風格。如果每次在代碼提交之前都進行一次eslint代碼檢查,就不會因為某個字段未定義為undefined或null這樣的錯誤而導致服務崩潰&…

數據科學與大數據是什么意思_什么是數據科學?

數據科學與大數據是什么意思Data Science is an interdisciplinary field that uses a combination of code, statistical analysis, and algorithms to gain insights from structured and unstructured data.數據科學是一個跨學科領域,它結合使用代碼,…

C#制作、打包、簽名、發布Activex全過程

一、前言 最近有這樣一個需求,需要在網頁上面啟動客戶端的軟件,軟件之間的通信、調用,單單依靠HTML是無法實現了,因此必須借用Activex來實現。由于本人主要擅長C#,自然本文給出了用C#實現的范例,本文的預期…

用Python創建漂亮的交互式可視化效果

Plotly is an interactive Python library that provides a wide range of visualisations accessible through a simple interface.Plotly是一個交互式Python庫,通過簡單的界面即可提供廣泛的可視化效果。 There are many different visualisation libraries avai…

CCF 201809-1 買菜

問題描述| 試題編號: | 201809-2 | | 試題名稱: | 買菜 | | 時間限制: | 1.0s | | 內存限制: | 256.0MB | 問題描述 小H和小W來到了一條街上,兩人分開買菜,他們買菜的過程可以描述為,去店里買一…

筆試題③

1.線程間通信 handler機制 2.AsyncTask 異步任務 3.HandlerThread 子線程中創建了一個 Looper對象 可以在子線程里使用消息機制 IntentService 帶了HandlerThread 并且創建了一個子線程的handler 在服務中 創建子線程執行耗時操作 耗時操作執行結束之后服務退出 如果想在Serv…

Hadoop 2.0集群配置詳細教程

Hadoop 2.0集群配置詳細教程 前言 Hadoop2.0介紹 Hadoop是 apache 的開源 項目,開發的主要目的是為了構建可靠,可拓展 scalable ,分布式的系 統, hadoop 是一系列的子工程的 總和,其中包含 1. hadoop common &#xff…

php如何減緩gc_管理信息傳播-使用數據科學減緩錯誤信息的傳播

php如何減緩gcWith more people now than ever relying on social media to stay updated on current events, there is an ethical responsibility for hosting companies to defend against false information. Disinformation, which is a type of misinformation that is i…

[UE4]刪除UI:Remove from Parent

同時要將保存UI的變量清空,以釋放占用的系統內存 轉載于:https://www.cnblogs.com/timy/p/9842206.html

MySQL基礎部分總結

MySQL 1、選擇數據庫 use dbnameshow databases;2、數據表 show tablesmysql> show columns from customers;mysql> desc customers;3、show 語句 show statusshow create databasesshow create tableshow grants4、select 檢索 4.1.1版本后不再區分大小寫,但…

BZOJ2503: 相框

Description P大的基礎電路實驗課是一個無聊至極的課。每次實驗,T君總是提前完成,管理員卻不讓T君離開,T君只能干坐在那兒無所事事。先說說這個實驗課,無非就是把幾根導線和某些元器件(電阻、電容、電感等)…

泰坦尼克號 數據分析_第1部分:泰坦尼克號-數據分析基礎

泰坦尼克號 數據分析My goal was to get a better understanding of how to work with tabular data so I challenged myself and started with the Titanic -project. I think this was an excellent way to learn the basics of data analysis with python.我的目標是更好地了…

Imperva開源域目錄控制器,簡化活動目錄集成

Imperva已公開發布域目錄控制器(Domain Directory Controller,DDC)的源代碼,這是一個Java庫,用于簡化常見的Active Directory集成。 與Java的LdapContext不同,這個庫構建在Apache Directory LDAP之上&#…

2018.10.24 NOIP模擬 小 C 的序列(鏈表+數論)

傳送門 考慮到a[l],gcd(a[l],a[l1]),gcd(a[l],a[l1],a[l2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l1]),gcd(a[l],a[l1],a[l2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l1]),gcd(a[l],a[l1],a[l2])....gcd(a[l]...a[r])是可以分成最多logloglog段且段內的數都是相同的。 那么我們用…

vba數組dim_NDArray — —一個基于Java的N-Dim數組工具包

vba數組dim介紹 (Introduction) Within many development languages, there is a popular paradigm of using N-Dimensional arrays. They allow you to write numerical code that would otherwise require many levels of nested loops in only a few simple operations. Bec…

Nodejs教程08:同時處理GET/POST請求

示例代碼請訪問我的GitHub: github.com/chencl1986/… 同時處理GET/POST請求 通常在開發過程中,同一臺服務器需要接收多種類型的請求,并區分不同接口,向客戶端返回數據。 最常用的方式,就是對請求的方法、url進行區分判…