Crystal Lang项目目录结构规范:ORM模型目录布局问询
嘿,很高兴帮你梳理Crystal项目里ORM模型的目录布局规范!结合你已经用crystal init app [project-name]初始化、且src下已有modules目录的情况,给你一套清晰的实践方案:
推荐的项目目录结构
先给你看调整后的核心结构,一目了然:
[project-name]/ ├── src/ │ ├── [project-name].cr # 项目入口文件 │ ├── modules/ # 你已有的通用类/业务模块目录 │ │ ├── validators/ # 比如通用验证模块 │ │ └── utils/ # 工具类模块 │ ├── models/ # 新增的ORM模型目录 │ │ ├── user.cr # 用户实体模型 │ │ ├── post.cr # 文章实体模型 │ │ └── blog/ # 如果实体多,可按业务领域分组 │ │ └── comment.cr # 评论实体模型 │ └── db/ # ORM初始化与数据库配置目录 │ └── setup.cr # ORM连接初始化逻辑 ├── config/ │ └── database.yml # 数据库连接配置文件 └── shard.yml # 依赖管理文件(需添加ORM依赖)
关键布局细节说明
- models目录的定位:直接放在src下与modules同级,明确区分「数据库映射实体」和「通用业务/工具模块」。models里只放和数据库表一一对应的实体类,专注于字段定义、关联关系、基础实体逻辑(比如简单的验证、钩子方法)。
- models内部的组织方式:
- 如果项目实体较少,直接把模型文件放在
src/models/下即可,文件名遵循小蛇形(比如user.cr对应User类),Crystal的自动加载机制能自动识别。 - 如果实体数量多或者有明确的业务领域划分,就按领域创建子文件夹,比如
src/models/blog/存放博客相关的Post、Comment模型,src/models/auth/存放User、Session模型,便于维护。
- 如果项目实体较少,直接把模型文件放在
- ORM的配置与初始化:
- 先在
shard.yml里添加你选用的ORM依赖(比如常用的Granite、Avram),然后运行shards install安装。 - 在项目根目录创建
config/目录,存放database.yml配置数据库连接信息(比如主机、端口、库名、账号密码)。 - 在
src/db/setup.cr里编写ORM初始化逻辑,加载配置并引入所有模型,示例(以Granite为例):require "granite" # 引入所有模型 require "../models/**/*" # 加载数据库配置 Granite::Config.load("config/database.yml") - 在项目入口文件
src/[project-name].cr里引入这个初始化文件:require "./db/setup",确保启动时ORM已连接数据库。
- 先在
- modules与models的交互:复杂的业务逻辑、通用工具函数依然放在modules里,models可以引用这些模块。比如你在
modules/validators/email_validator.cr里写了邮箱验证逻辑,User模型就可以引用它来做字段验证,保持模型的简洁性。
简单模型示例(以Granite ORM为例)
src/models/user.cr:
require "granite/adapter/postgres" require "../modules/validators/email_validator" class User < Granite::Base adapter pg table users column id : Int64, primary: true column email : String column password_hash : String column created_at : Time, default: Time.now # 引用modules里的验证逻辑 validate email, EmailValidator end
这样的布局既符合Crystal社区的通用实践,又能和你已有的modules目录完美配合,后期维护起来也非常清晰!
内容的提问来源于stack exchange,提问作者dkimot
相关产品推荐
相关产品推荐

