You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的配置与初始化:
    1. 先在shard.yml里添加你选用的ORM依赖(比如常用的Granite、Avram),然后运行shards install安装。
    2. 在项目根目录创建config/目录,存放database.yml配置数据库连接信息(比如主机、端口、库名、账号密码)。
    3. 在src/db/setup.cr里编写ORM初始化逻辑,加载配置并引入所有模型,示例(以Granite为例):
      require "granite"
      # 引入所有模型
      require "../models/**/*"
      
      # 加载数据库配置
      Granite::Config.load("config/database.yml")
      
    4. 在项目入口文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:32:39