Lobsters | 📄 原文链接 | 2026-10-21 收录

Hanami 没有 Rails 那样的 model 层:关系、仓库与结构体三分

来源:aaronmallen.me — 2026-10-19

📋 概述

Aaron Allen 的「Hanami, Why?」系列这一篇讲数据库层。他先强调一个容易误解的点:Hanami 并没有 Rails 那种传统 model 层,它的数据层由三部分组成。Relations 定义对象的 schema 与关联,也是定义 scope(Hanami 叫 datasets)的好地方;Repos 是仓库模式的直接体现,在 Hanami 里完全可选,但作者强烈建议使用,因为它能跨多个 relation 操作;Structs 是对象本身的、冻结的简单表示,适合放简单的展示逻辑。文中给出一套完整例子:users 表的迁移(email 唯一索引、password_digest、时间戳默认 now());继承 DB::Relation 的 Users 关系,自动推断 schema 并把 email 覆写为归一化的 EmailAddress 类型,还声明 has_many :oauth_tokens;UserRepo 提供 create、find、find_by_access_token(join oauth_tokens)、find_by_email 等方法,能同时访问两张表;User 结构体只放 display_name 与 full_name 这类展示逻辑,且无需显式声明字段就能直接访问。约定很清晰:repo 是数据层的唯一入口,所有方法都应返回结构体——集合查询调用 to_a,单条查询调用 one,create 的 command 同样返回结构体。

🔑 核心要点

💡 金句

Hanami does not have a traditional "model" layer like Rails does.
← 返回 Lobsters 首页