Gem Codable - 更好的使用 code 字段

pinewong · 2020年08月04日 · 最后由 pinewong 回复于 2020年08月10日 · 1935 次阅读

写了一个跟随 Rails 大版本的 Gem,代码很简单,并且已经在线上以 Concern 形式稳定跑了一年了(意思就是很安全,放心用)。

另外试玩了一下 GitHub Actions。有个疑问,这个 matrix 配置看文档只能放到 jobs.job_id 底下?我想要多个 jobs 复用,找不到方案,然后就只能 rubocop 和 test 两个 job 都复制一遍同样的 matrix 了。

项目地址:https://github.com/hdgcs/codable

玩了一下,看了一下代码。好玩 😆

GitHub Actions 真不错, 主要是提供的虚机性能超级棒, 打个 image, Docker Hub 自己拉去 Build 所用的时间是用 GitHub Action 这边 build 后 push 过去 的三倍以上, 中间顺带还 push 到了 GitHub 自己的 package 服务

赞呀,但是有个问题,看到你的代码里使用了 find_by!是否有什么业务需求呢?这样如果 code 是重复使用的,不就只能查到最先一条记录了吗

PaulChan1995 回复

对于 code 字段,该项目当做是更好的标识符,应该唯一,类似 FrendlyId。

项目初衷是解决对配置类表(这类表记录不多,且不常修改)进行快速查找。

顺便在这里展开说一下场景哈,下面是一个快递方式配置的表:

class ShippingService < ApplicationRecord
  # { id: 1, name: 'Canada Post' }
  # { id: 2, name: 'UPS' }
  # { id: 3, name: 'Canpar' }
  SERVICRS = {
    cp: 1,
    ups: 2,
    canpar: 3,
  }

  def self.cp
    find_by!(id: SERVICES[:cp])
  end

  def cp?
    id == SERVICRS[:cp]
  end

  # ...
end

上述需求使用 Codable 来完成的话,只要:

# 1. 添加 code 字段,用字段维护上述硬编码的配置
# 2. 模型引入 Codable 即可

# 使用
ShippingService[:cp]
service = ...; service.cp?

查找做了缓存,代码中随时用,不用再做查找优化啥的。

pinewong 回复

我觉得你举的这个例子在 model 里的常量配置有点像 enum😁

PaulChan1995 回复

如果你把 code 字段当成了跟 enum 里不唯一的属性,那你说的就是对的。但是现在的 code 字段是跟 id 一类的标识符属性,那就完全不一样了,enum 不是用来完成这类需求的😀

需要 登录 后方可回复, 如果你还没有账号请 注册新账号