Модель
Основное
Эта часть документации написана по следам vuex-orm-next
.
Однако, Rattus ORM более ориентирован на работу с
TypeScript и декораторами.
Модели — это определение схемы данных, которая будет обрабатываться Rattus ORM. Вы можете определить любое количество моделей в зависимости от ваших потребностей.
Чтобы определить модель, создайте класс, наследующий
класс Model
:
- TypeScript
- JavaScript
import { Model } from '@rattus-orm/core'
import { StringField, UidField, NumberField } from '@rattus-orm/core/field-types'
export class User extends Model {
public static entity = 'user'
@UidField()
public id: string
@StringField('')
public name: string
@NumberField(0)
public age: number
}
import { Model } from '@rattus-orm/core'
import { createUidField, createStringField, createNumberField } from '@rattus-orm/core/field-types'
export class User extends Model {
static entity = 'user'
static fields () {
return {
id: createUidField(this),
name: createStringField(this, ''),
age: createNumberField(this, 0)
}
}
}
Статическое свойство entity
является именем "таблицы" в
нашей базе данных. Все модули в хранилище будут созданы
базой данных и дата-провайдером автоматически.
Решение проблем с TypeScript и Vite
Если вы используете TypeScript с Vite, убедитесь, что в вашем tsconfig.json
есть такие настройки:
{
"compilerOptions": {
// ...
"useDefineForClassFields": true,
"experimentalDecorators": true
}
}
Также вы можете столкнуться с проблемой отсутствия данных в моделях. В этом случае стоит использовать следующий синтаксис:
class User extends Model {
public static entity = 'users'
@StringField('')
// public id: string - может не сработать,
// все поля модели могут быть "null"
declare id: string
Если вы получаете сообщение об ошибке от ESBuild в режиме разработки, например: [ERROR] Decorators are not valid here
, убедитесь, что
esbuild настроен на ваш tsconfig в vite.config.mts
:
import { defineConfig } from 'vite';
// https://vitejs.dev/config/
export default defineConfig({
optimizeDeps: {
esbuildOptions: {
tsconfig: 'tsconfig.json',
},
},
});
Типы полей
Общий тип
Используйте декоратор @AttrField(value)
(или функцию createAttrField
) для определения наиболее
общего поля. Аргументом является значение поля по
умолчанию, которое будет использоваться при создании
новых данных, если поле отсутствует.
export class User extends Model {
public static entity = 'user'
@AttrField(null)
public anyField: any
}
Примитивные типы
Вы можете использовать атрибуты примитивного типа:
@StringField('')
, @NumberField(0)
или @BooleanFeild(false)
(для JS - createStringField
, createNumberField
, и createBooleanField
).
Эти атрибуты по умолчанию обеспечивают приведение, которое
преобразует данное значение в указанный тип.
Например, '0'
преобразуется в 0
, а 1
, в true
.
Как и в случае с createAttrField
, аргументом является
значение по умолчанию.
export class User extends Model {
public static entity = 'user'
@StringField('')
public name: string
@NumberField(0)
public age: number
@BooleanField(true)
public isAwesome: boolean
}
Rattus ORM не будет валидировать значения, попадающие
в поля. Вместо этого будет выполнено приведение типов.
Строка John Doe
, попавшая в поле Boolean, преобразуется
в true
.
Вы можете отключить приведение типов для конкретной модели. Для этого
ей нужно объявить публичное статическое свойство dataTypeCasting
и
установить его значение в false
. В таком случае, даже если поле
помечено декоратором @BooleanField
, а на вход в модель попадает единица --
она не будет преобразована в true
, а останется единицей.
Валидации также не будет. Если вам нужно валидировать значения, предлагаем
рассмотреть плагин Zod Validate.
export class User extends Model {
public static entity = 'user'
// приведение типов полей отключено
public static dataTypeCasting = false
@StringField('')
public name: string
@NumberField(0)
public age: number
@BooleanField(true)
public isAwesome: boolean
}
UID тип
@UidField()
(или createUidField
в JS) генерирует уникальный
идентификатор, если значение для этого поля отсутствует.
export class User extends Model {
public static entity = 'user'
@UidField()
public id: string
}
По умолчанию будет создан UUID v4. Если вам нужен другой алгоритм, вы можете передать коллбэк, который сгененрирует ID:
export class User extends Model {
public static entity = 'user'
@UidField(() => myIdGenerator())
public id: string
}
Даты
Начиная с версии 0.3.0 доступен тип Date. Он преобразует
входящую строку или число в экземпляр класса Date. Если
дата получается невалидной, будет установлено значение
с нулевой датой (new Date(0)
). По умолчанию тип не принимает
null, но его можно сделать nullable при помощи настройки.
export class User extends Model {
public static entity = 'user'
@DateField(null, { nullable: true })
public createdAt: Date
}
Primary key
Rattus ORM предполагает, что у каждой сущности есть
первичный ключ id
. Если он отличается, вы можете
указать, на какой ключ стоит обращать внимание:
export class User extends Model {
public static entity = 'user'
public static primaryKey = 'myId'
// Также можно указать массив
public static primaryKey = ['myId', 'otherId']
@UidField(() => myIdGenerator())
public myId: string
}
Если в переданных данных не будет ключа, Rattus ORM сгенерирует его автоматически при вставке данных.