【问题标题】:sails.js + waterline One-To-Many model association, what should happen when deleting the Many?sails.js + waterline One-To-Many 模型关联,删除Many时会发生什么?
【发布时间】:2014-06-22 10:04:37
【问题描述】:

Teacher(One) 和 Children(Many) 之间存在一对多关系。

如果我这样做:

Teacher.destroy(teacherId).exec(function(err){});

子项不会自动删除。

这是一个错误还是我应该手动删除它们? 如果这不是错误,不删除孩子的解释是什么?

【问题讨论】:

    标签: node.js orm sails.js waterline


    【解决方案1】:

    Waterline 目前不支持级联删除。它可能是未来版本中的一个配置选项,但它可能永远不会是默认值。在大多数生产就绪的应用程序中,您可能无论如何都应该进行软删除。无论哪种情况,您都可以使用afterDestroy lifecycle callback 获得您想要的。

    在api/models/Teacher.js 中,类似:

    module.exports = {
        attributes: {
           // attributes here
        },
        afterDestroy: function(destroyedRecords, cb) {
            // Destroy any child whose teacher has an ID of one of the 
            // deleted teacher models
            Child.destroy({teacher: _.pluck(destroyedRecords, 'id')}).exec(cb);
        }
    }
    

    您可以使用 afterUpdate 方法对软删除执行类似的操作。

    【讨论】:

    • "在大多数生产就绪的应用程序中,您可能无论如何都应该进行软删除。"请您进一步解释此评论。如果您有一个完全支持级联删除(例如 Hibernate)的成熟(经过测试)ORM 解决方案,这是一个预期的选项。当然,应该注意配置设置——这是集成测试的目的。如果您确实需要保留历史记录等,那么软删除可能是合适的,但这与环境(PRD 等)无关,更多的是与业务/技术要求有关。
    • “CR”应用程序是另一个主题:D 感谢您提供某种解决方法,所有相同的 Scott。
    • 软删除是生产环境中首选的原因是删除是一项昂贵的操作,如果被破坏的记录数量很大,它可能会影响可用性。通常标记为已删除更有效,但它需要范围界定以在所有查询中过滤掉它们。在生产中,每晚(或按需)作业可以通过实际销毁那些软删除来清理数据库。
    • 在 Sails V1.0 中,如果您设置模型之间的关系,例如one to manymany 表上的外部属性的值在销毁发生后将是NULLED,因此导致许多对象没有被销毁。我建议在 beforeDestory 生命周期中销毁子对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多