Вопрос или проблема
Я создаю систему опросов с помощью Prisma и хочу, чтобы у моих опросов были разные версии. В идеале, у опроса всегда должна быть хотя бы одна версия, а версия всегда должна быть связана с опросом.
model Survey {
...
activeVersionId String @unique
activeVersion SurveyVersion @relation("activeVersion", fields: [activeVersionId], references: [id])
versions SurveyVersion[]
...
}
model SurveyVersion {
...
surveyId String
survey Survey @relation(fields: [surveyId], references: [id])
activeFor Survey? @relation("activeVersion")
...
}
Возможно ли это вообще? У меня возникают проблемы при попытке создать новый опрос, так как он зависит от версии опроса, которая зависит от опроса.
Ответ или решение
Да, создание моделей, которые зависят друг от друга, возможно в Prisma, однако, важно правильно организовать взаимосвязи и учесть процесс создания записей в базе данных. В вашем случае, когда у вас есть модель Survey
, которая должна иметь как минимум одну SurveyVersion
, вы должны учесть, что в момент создания опроса необходимо создать и его первую версию.
Вот как можно это сделать:
- Определение моделей:
Ваши модели Survey
и SurveyVersion
имеют правильную структуру, однако уточнить некоторые моменты может быть полезным.
model Survey {
id String @id @default(cuid())
title String
activeVersionId String
activeVersion SurveyVersion @relation("activeVersion", fields: [activeVersionId], references: [id])
versions SurveyVersion[] @relation("SurveyVersions")
}
model SurveyVersion {
id String @id @default(cuid())
title String
surveyId String
survey Survey @relation("SurveyVersions", fields: [surveyId], references: [id])
isActive Boolean @default(false)
}
Обратите внимание, что я добавил @relation("SurveyVersions")
к массиву versions
в модели Survey
, что позволяет Prisma корректно управлять зависимостями.
- Создание данных:
Когда вы создаёте новый опрос, вам нужно сразу создать и его первую версию. Например:
async function createSurveyWithVersion(prisma, surveyData, versionData) {
const createdSurvey = await prisma.survey.create({
data: {
title: surveyData.title,
activeVersion: {
create: {
title: versionData.title,
isActive: true
}
}
},
include: {
activeVersion: true
}
});
return createdSurvey;
}
В этом коде:
- Мы создаем новый опрос и одновременно создаем его первую версию через связь
activeVersion
. isActive
ставим вtrue
для первой версии, чтобы она была активной.
- Обратите внимание на валидацию:
Перед созданием важно удостовериться, что данное действие соответствует бизнес-логике вашего приложения, т.е. каждый опрос должен всегда иметь хотя бы одну версию.
- Работа с существующими записями:
Когда вам нужно будет обновить активную версию, вы сможете просто изменять поле activeVersionId
в модели Survey
и обновлять свойство isActive
у версий.
Например, чтобы обновить активную версию:
async function updateActiveVersion(prisma, surveyId, versionId) {
await prisma.survey.update({
where: { id: surveyId },
data: { activeVersionId: versionId }
});
// Здесь можно дополнительно обновить другие версии, если это необходимо.
}
Таким образом, благодаря правильной организации моделей и последовательности операций, вы сможете избежать проблем с зависимостями, создавая и обновляя опросы и их версии в вашей системе.