[DAY11] Data Access Layer 设计概念

前言

这篇将介绍 boxenn 与 DAL 层的依赖关系和介面。

简易 Class Diagram

Source 代表的是外部 gem 的 class,本系列文章使用的案例会是 ActiveRecord 的 Model

https://ithelp.ithome.com.tw/upload/images/20210926/20108265nlLISCG1Zt.png

Repository(仓储)

Repository 的责任是管理 aggregate 持久性和资料取得,因此在 boxenn 中定义了 4个 public method,分别是

def find_by_identity(hash)
	## main logic
	aggregate
end

def find_by_query(query)
	## main logic
	[aggregates]
end

def save(aggregates)
	## main logic
end

def destroy(aggregates)
	## main logic
end

find_by_identity (以唯一识别搜寻)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265uHZpJk7MJp.png

  • 使用的是 identity 做搜寻,因此回传为一个 aggregate
  • 如果底层的 source 找到不只一笔 record,可以在 repository 的实作中决定处理方式(raise error 或 取第一个…等)

find_by_query (以query搜寻)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265ma77YYHD1K.png

save (新建和更新)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265u0H142waX2.png

  • 可以做批次的更新
  • 如果需要用 transaction,则需要在外部 call 这个 method 的地方包
ActiveRecord::Base.transaction do
	repository.save(entities)
end
  • 这个 method 包含 create 和 update
    如果传进来 aggregate 的 identity 存在於 DB 内,则更新该笔 record,反之则用此 identity 建立一笔新的 record

destroy (删除)

https://ithelp.ithome.com.tw/upload/images/20210926/20108265V4iqO6Y7ZJ.png

  • 可批次删除
  • 同上,如果需要用 transaction,则需要在外部 call 这个 method 的地方包
  • 利用传进来 aggregate 的 identity 删除资料

下一篇开始会针对每个 class 进行解说并有实际的范例 code。


<<:  分类模型哪个好?ROC/ AUC

>>:  [Day11]日期函数

【Day3】声音的特徵提取

梅尔倒频谱 昨天我们介绍了频谱跟梅尔频率,那有没有机会我可以把这两个结合在一起,获得更有用的资讯呢?...

NIST SP 800-53A(附录E:渗透测试)

企业通常会进行渗透测试,以验证现有的安全和隐私控制,并通过发现漏洞和利用漏洞,彻底记录测试期间执行的...

【C#】Hash Table

Hash Table是一种有key value的资料结构~ 我们能在Hash Table中存入一个v...

Day 22 - Blocking & Non-blocking Mode

本篇重点 官方说明文件:https://sinotrade.github.io/tutor/adva...

Day6 建立 Next.js 专案 - 使用 create-next-app

今天我们要来建立 Next.js 专案,目标是能在自己电脑上成功开启 Next.js 网页。 我预设...