【问题标题】:How to force 1:n association with Sequelizejs如何强制与 Sequelizejs 进行 1:n 关联
【发布时间】:2014-11-10 18:06:16
【问题描述】:

我正在实施一些测试以确保我的续集对象被正确保存。 我有一个非常简单的架构:文章 用户

文章ONE 用户
发布 用户可以发布许多 文章

这是我的文章模型定义:

module.exports = function(sequelize){
    "use strict";

    var Sequelize = require('sequelize');
    ...
    var Article = sequelize.define("Article", {
        slug: {
            type: Sequelize.STRING,
            unique: true,
            comment: "Unique URL slug to access the article"
        },
        title: {
            type: Sequelize.STRING,
            unique: true,
            allowNull: false,
            validate: {
                notEmpty: true
            }
        },
        summary: {
            type: Sequelize.TEXT,
            allowNull: true
        },
        body: {
            type: Sequelize.TEXT,
            allowNull: true
        },
        published: {type: Sequelize.BOOLEAN, allowNull: false, defaultValue: true},
        allowComment: {type: Sequelize.BOOLEAN, allowNull: false, defaultValue: true}
    }, {
        freezeTableName: true,
        classMethods: {
            associate: function (models)
            {
                Article.belongsTo(models.User, {as: "Author", foreignKey: 'author_id'});
                Article.hasMany(models.Comment, {as: "Comments", foreignKey: 'article_id'});
            },
            articlesForIndex: function()
            {
                return this.findAll({
                    where: {published: true},
                    order: 'createdAt DESC',
                    limit: 10
                });
            }
        },
        setterMethods   : {
            title : function(v) {
                this.setDataValue('title', v.toString());
                this.setDataValue('slug', slugify(v));
            }
        }
    });

    return Article;
};

我想要做的是强制Article 拥有一个Author (User)。使用当前定义,我可以在没有Author 的情况下创建文章。

这是我失败的测试:

module.exports = function (sequelize, models) {
    'use strict';

    var Q = require('q');
    var should = require('chai').should();

    describe('Article Model', function () {

        describe('Validation', function () {

            ...

            it('should not be valid without an author', function (done) {
                models.Article.create({title: 'title5', summary: 'summary', body: 'body'})
                    .should.be.rejected.notify(done);
            });
        });
    });
};

【问题讨论】:

    标签: node.js mocha.js sequelize.js


    【解决方案1】:

    在最近(我相信是 2.0-rc2)版本的 sequelize 中,您可以将外键更改为对象:

    Article.belongsTo(User, {
        as: "Author", 
        onDelete: 'CASCADE', 
        foreignKey: { name:'author_id', allowNull: false }
    });
    

    您还需要添加onDelete: 'CASCADE',因为我们不能再在删除时设置null

    【讨论】:

    • 我觉得不错。很遗憾文档不完整:(
    • 我们希望它会很快,一旦 2.0 的最终版本出来
    • 我同意文档似乎完全过时了!这么好的图书馆有这个问题真是太可惜了。来吧伙计们——我们不能在不知情的情况下使用所有的糖!我只花了半个小时才看到这篇文章(因为不是正确的命名)!!!
    • 我同意你的看法,但请不要再“加油”了——我们实际上是 2-4 人在项目上工作,努力跟上错误报告、功能请求并维护文档。非常欢迎您为文档做出贡献 - 它托管在 (GH repo)[github.com/sequelize/sequelize] 中,非常欢迎 PR :)
    猜你喜欢
    • 2015-01-24
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多