对象建模系统是为 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 | 日期对象 | null | Date 实例 |
any | 任何数据类型 | null | 无 |
其他约束包括:
allowEmpty:确定字段是否可以为nullunique:确保字段值在所有实例中都是唯一的defaultValue:如果未提供值,则提供默认值inspectable:控制在控制台中检查对象时的可见性来源: src/core/model.js446-512 src/models/author.js894-901 src/models/post.js857-863
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 是可重用和组合的预定义查询。它们被定义为模型类的静态方法。
这使得可组合的查询能够提高代码的可读性和可维护性。
来源: 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
工厂模式提供了一种方便的方法来创建具有默认值的模型实例。
工厂提供:
这使得创建测试数据或用初始记录填充系统变得容易。
来源: 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
系统包含用于控制台交互和开发的实用程序
自动加载程序会根据配置的路径动态导入模块,使所有模型、工厂和其他组件都可以使用,无需显式导入。
自定义对象检查使在控制台中工作更加方便
inspectable 标志控制显示哪些字段这使得在控制台中调试和探索对象图更加直观。
来源: src/scripts/autoload.js801-833 src/scripts/console.js836-847 src/core/model.js603-619
系统包含内置字段验证
string、number、boolean、date、any)allowEmpty: false)unique: true)如果约束未满足,在对象构造期间会抛出验证错误。
来源: src/core/model.js544-565 src/models/author.js901-902
在使用对象建模系统时,请考虑以下最佳实践
对象建模系统旨在与其他组件无缝协作
这种模块化设计允许系统很好地集成到各种 JavaScript 应用程序架构中。