链式插入 sails.js 中的 2 个表

Chained insert into 2 tables in sails.js

对于熟悉 sails.js 的专家: 我有一个客户模型,为了简单起见,假设

/**
 * Customers.js
 */

module.exports = {

    attributes: {

        firstName: { type: 'string' },
        lastName: { type: 'string' }
    }
};

重要提示: 还有一个 CustomerHistory 模型,如下所示。每当创建或更新 Customer 时,相应的 CustomerHistory 记录也应该是 inserted/created.

     /**
     * CustomerHistory.js
     */

    module.exports = {

        attributes: {

            customer: { model: 'customer' },
            firstName: { type: 'string' },
            lastName: { type: 'string' },
            modifiedAt: { type: 'datetime'}
        }
    };

Sails.js内的选项:

  1. 覆盖或创建新的 Sails 蓝图操作(我们称之为 CreateWithHistory 和 UpdateWithHistory) 总是插入到 CustomerHistory 成功保存到 Customer 中。如果这是 建议的解决方案,代码示例会有所帮助。

  2. 创建自定义控制器操作(我们称之为 CreateWithHistory 和 UpdateWithHistory) 总是插入到 CustomerHistory 成功保存到 Customer 中。如果这是 建议的解决方案,代码示例将有助于如何将 2 Model.create 和 Model.update 与 Model.create 操作链接起来。

  3. 创建自定义客户模型操作以在创建或更新时隐式保存到历史记录中。如何做到这一点?

Sails js 为您可以使用的模型提供了 lifecycle callbacks。它们允许您在创建、更新新模型时或在其他时间执行自定义代码。我认为您可以通过向 Customer 模型添加回调来完成您想要的。在 Customer.js:

module.exports = {

    attributes: {
        firstName: { type: 'string' },
        lastName: { type: 'string' }
    },

    // this will create a new CustomerHistory for each Customer created
    afterCreate: function(customer, cb) {
        CustomerHistory.create({
            customer: customer.id,
            firstName: customer.firstName,
            lastName: customer.lastName,
            modifiedAt: new Date()
        }).exec(function(err, history) {
            if (err) { return cb(err); }
            cb();
        });
    },

    // update some fields in CustomerHistory after Customer is updated
    afterUpdate: function(customer, cb) {
        CustomerHistory.update({customer: customer.id}, {
            firstName: customer.firstName,
            lastName: customer.lastName,
            modifiedAt: new Date()
        }).exec(function(err, history) {
            if (err) { return cb(err); }
            cb();
        });
    }
};

这可能不是您想要的确切流程(例如,也许您有时先创建历史记录,有时不在更新时修改历史记录等),但是我认为使用可用回调列表应该能够完成你想要的。