如何在交易期间禁用特定的验证规则?

时间:2016-05-31 06:08:41

标签: transactions sequelize.js

我有两个模型:文件和课程。文件属于Course并具有CourseId字段。

在某些时候我需要使用事务来在插入它们之前验证它们,但是,我的一个文件模型验证规则验证了通知的CourseId是否存在(在我不使用事务的其他情况下它很有用) )并且这个规则在交易期间被标记,因为在它期间没有CouseId,正如我们所能期望的那样。

models.sequelize.transaction(function (t) {
    // if we want to insert a new course
    if (formData.courseId == 0) {
        return models.course.create({
            name: formData.courseName,
            fieldOfStudy: formData.fieldOfStudyId
        }, {transaction: t}).then(function(course) {
            return models.file.create({
                name: formData.name,
                universityId: formData.universityId,
                status: 1,
                type: formData.typeId,
                createdBy: userId,
                file_raw: files,
                courseId: course.id // here is the problem!
            }, {transaction: t});
        });
    // if we want to use a existing one                
    } else { 
        return models.file.create({
            name: formData.name,
            universityId: formData.universityId,
            courseId: formData.courseId,
            status: 1,
            type: formData.typeId,
            createdBy: userId,
            file_raw: files
        }, {transaction: t});
    }
})

如果我可以动态地禁用CourseId字段的验证规则,这可以修复,但显然这是不可能的。另一种方法是虚拟字段,但这个方法不是很“优雅”。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

显然没有记录“.create()方法”,但有一个简单的解决方案:skip

我们可以看到here,方法.validate有一个“跳过”选项。为了解决这个问题,我们只需要设置skip to [“courseId”]:

return models.file.create({
    name: formData.name,
    universityId: formData.universityId,
    status: 1,
    type: formData.typeId,
    createdBy: userId,
    file_raw: files,
    courseId: course.id
}, {skip: ['courseId'], transaction: t});