2014-05-05 35 views
6

Tôi có mối quan hệ một đến nhiều giữa Giáo viên (Một) và Trẻ em (Nhiều).sails.js + waterline Liên kết mô hình One-To-Many, điều gì sẽ xảy ra khi xóa Nhiều người?

Nếu tôi làm:

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

Những đứa trẻ không được tự động gỡ bỏ.

Có phải là lỗi hoặc tôi có nên xóa chúng theo cách thủ công không? Nếu đó không phải là lỗi, giải thích cho việc không xóa trẻ em là gì?

Trả lời

16

Đường nước hiện không hỗ trợ xóa tầng. Nó có thể là một tùy chọn cấu hình trong các phiên bản tương lai, nhưng nó có thể sẽ không bao giờ là mặc định. Trong hầu hết các ứng dụng sẵn sàng cho sản xuất, có thể bạn vẫn nên thực hiện xóa mềm. Trong cả hai trường hợp, bạn có thể nhận được những gì bạn muốn bằng cách sử dụng afterDestroy lifecycle callback.

Trong api/models/Teacher.js, một cái gì đó như:

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); 
    } 
} 

Bạn có thể làm điều gì đó tương tự với soft-xóa bằng cách sử dụng phương pháp afterUpdate.

+2

"Trong hầu hết các ứng dụng sẵn sàng cho sản xuất, có thể bạn vẫn nên thực hiện xóa mềm." Xin bạn có thể giải thích thêm bình luận này. Nếu bạn có một giải pháp ORM trưởng thành (đã được kiểm tra) hỗ trợ đầy đủ các lần xóa tầng (ví dụ như Hibernate) thì đây là một tùy chọn được mong đợi. Tất nhiên, hãy cẩn thận với việc thiết lập cấu hình - đó là mục đích của các bài kiểm tra tích hợp. Nếu bạn cần giữ lại lịch sử vv, thì việc xóa mềm có thể thích hợp nhưng điều đó ít liên quan đến môi trường (PRD, v.v.) và nhiều việc khác cần làm với các yêu cầu nghiệp vụ/kỹ thuật. – arcseldon

+0

"CR" ứng dụng là một chủ đề khác: D Cảm ơn bạn đã cung cấp một số loại workaround tất cả cùng một Scott. – arcseldon

+0

Lý do xóa mềm là tùy chọn ưu tiên trong sản xuất là việc xóa là một hoạt động tốn kém và nó có thể ảnh hưởng đến khả năng sử dụng nếu các bản ghi bị phá hủy có số lượng lớn. Thường đánh dấu là đã xóa hiệu quả hơn, nhưng nó cần có phạm vi để lọc chúng ra trong tất cả các truy vấn. Trong sản xuất, một công việc hàng đêm (hoặc theo yêu cầu) có thể làm sạch cơ sở dữ liệu bằng cách thực sự phá hủy những phần mềm bị xóa. – hammady

Các vấn đề liên quan