菜单

对象建模系统

相关源文件

对象建模系统是为 JavaScript 实现的 ActiveRecord 风格的系统,它提供了一个丰富的框架,用于在内存中定义、查询和管理复杂对象模型。该系统支持面向对象的数据处理方法,并内置了关系、验证、序列化和工厂模式对象创建等功能。

本页面记录了对象建模系统的核心架构和功能。有关代码高亮的信息,请参阅代码高亮系统

核心架构

对象建模系统由几个关键组件组成,它们协同工作以提供全面的对象建模解决方案。

该系统为内存中的所有模型实例提供了一个中央注册表,支持索引访问、关系管理和各种查询方法。

来源: src/core/model.js432-462 src/core/recordSet.js1-23 src/core/serializer.js1-24 src/core/factory.js724-736

模型定义

基本模型结构

模型通过扩展基类Model并使用prepare方法来设置字段、验证和关系来定义。

每个模型都维护自己的实例注册表,以便高效地检索和查询。 prepare方法使用字段类型、验证规则和索引来设置字段,以优化查找。

来源: src/core/model.js436-542 src/models/author.js892-916 src/models/post.js855-884

字段类型和约束

该系统支持各种字段类型和约束。

字段类型描述默认值约束
字符串文本数据null可验证非空
数字数值null类型检查
布尔值True/False 值null类型检查
date日期对象nullDate 实例
any任何数据类型null

其他约束包括:

  • allowEmpty:确定字段是否可以为null
  • unique:确保字段值在所有实例中都是唯一的
  • defaultValue:如果未提供值,则提供默认值
  • inspectable:控制在控制台中检查对象时的可见性

来源: src/core/model.js446-512 src/models/author.js894-901 src/models/post.js857-863

查询和数据访问

RecordSet

RecordSet类扩展了 JavaScript 的原生Array,以提供强大的查询功能。

查询方法允许链式操作来过滤、排序和转换记录集合。

方法目的示例
where按条件过滤记录Post.where({ title: 'Hello' })
order排序记录Post.order((a, b) => a.id - b.id)
pluck提取单个属性Post.all.pluck('title')
select使用特定属性创建投影Post.all.select('id', 'title')
first / last获取第一个或最后一个记录Post.all.first

来源: src/core/recordSet.js625-668 src/core/model.js574-583

Scopes

Scopes 是可重用和组合的预定义查询。它们被定义为模型类的静态方法。

这使得可组合的查询能够提高代码的可读性和可维护性。

来源: src/core/model.js586-588 src/models/post.js869-874

对象关系

该系统支持多种对象关系,非常类似于 ActiveRecord。

关系类型包括:

类型描述实现
belongsTo一个记录属于另一个记录模型中的外键
hasOne一个记录拥有一个相关的记录相关模型中的外键
hasMany一个记录拥有多个相关的记录相关模型中的外键

关系可以通过外键和别名选项进行自定义。

来源: src/core/model.js782-794 src/models/post.js187-190 src/models/author.js913-915 src/models/category.js710-720

工厂和对象创建

工厂模式提供了一种方便的方法来创建具有默认值的模型实例。

工厂提供:

  • 模型实例的基本属性
  • 用于常见属性组合的 traits(特性)
  • 用于生成唯一值的 sequences(序列)
  • 用于构建单个或多个实例的方法

这使得创建测试数据或用初始记录填充系统变得容易。

来源: src/core/factory.js735-797 spec/factories/authorFactory.js973-986 spec/factories/postFactory.js993-1015

序列化

序列化器组件将模型实例转换为普通对象,并支持:

  • 属性选择
  • 属性重命名
  • 自定义属性格式化
  • 基于选项的条件属性

这对于 API 响应或数据交换特别有用。

来源: src/core/serializer.js673-720 src/serializers/postSerializer.js922-944 src/serializers/postPreviewSerializer.js950-966

控制台和开发工具

系统包含用于控制台交互和开发的实用程序

自动加载

自动加载程序会根据配置的路径动态导入模块,使所有模型、工厂和其他组件都可以使用,无需显式导入。

对象检查

自定义对象检查使在控制台中工作更加方便

  • 蓝色的模型名称和 ID
  • 紧凑的嵌套记录显示
  • 十六进制 ID 显示
  • 通过 inspectable 标志控制显示哪些字段

这使得在控制台中调试和探索对象图更加直观。

来源: src/scripts/autoload.js801-833 src/scripts/console.js836-847 src/core/model.js603-619

字段验证

系统包含内置字段验证

  • 字段的类型检查(stringnumberbooleandateany
  • 必填字段验证(allowEmpty: false
  • 唯一性约束(unique: true
  • 通过验证函数进行自定义验证
  • 空字段的默认值

如果约束未满足,在对象构造期间会抛出验证错误。

来源: src/core/model.js544-565 src/models/author.js901-902

最佳实践

在使用对象建模系统时,请考虑以下最佳实践

  1. 定义清晰的模型,包含合适的字段和关系
  2. 使用范围进行常见查询,以保持代码的 DRY(不要重复自己)
  3. 为每个模型实现工厂,以简化测试和数据创建
  4. 创建序列化器,用于需要呈现或传输的模型
  5. 添加验证以确保数据完整性
  6. 注意内存使用,因为所有记录都存储在内存中
  7. 利用控制台工具进行交互式调试和探索

与其他系统集成

对象建模系统旨在与其他组件无缝协作

  • 序列化为 API 和数据传输提供了桥梁
  • 工厂简化了测试设置
  • 自动加载使与开发工具的集成变得简单
  • 字段验证确保外部系统的数据完整性

这种模块化设计允许系统很好地集成到各种 JavaScript 应用程序架构中。